From 801438953d2d1b8edf93cf3d34fe4a7cda0dd274 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Wed, 28 May 2025 10:54:52 -0700 Subject: [PATCH] kern: save/restore spendsgir in KInterruptController::Save/RestoreCoreLocal --- .../arch/arm/kern_generic_interrupt_controller.hpp | 1 + .../arch/arm/kern_generic_interrupt_controller.inc | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/libraries/libmesosphere/include/mesosphere/arch/arm/kern_generic_interrupt_controller.hpp b/libraries/libmesosphere/include/mesosphere/arch/arm/kern_generic_interrupt_controller.hpp index 63e245659..a3c28eaa9 100644 --- a/libraries/libmesosphere/include/mesosphere/arch/arm/kern_generic_interrupt_controller.hpp +++ b/libraries/libmesosphere/include/mesosphere/arch/arm/kern_generic_interrupt_controller.hpp @@ -116,6 +116,7 @@ namespace ams::kern::arch::arm { u32 ipriorityr[NumLocalInterrupts / 4]; u32 itargetsr[NumLocalInterrupts / 4]; u32 icfgr[NumLocalInterrupts / 16]; + u32 spendsgir[4]; }; struct GlobalState { diff --git a/libraries/libmesosphere/source/arch/arm/kern_generic_interrupt_controller.inc b/libraries/libmesosphere/source/arch/arm/kern_generic_interrupt_controller.inc index ef363c0cf..9fa5ffb38 100644 --- a/libraries/libmesosphere/source/arch/arm/kern_generic_interrupt_controller.inc +++ b/libraries/libmesosphere/source/arch/arm/kern_generic_interrupt_controller.inc @@ -113,6 +113,12 @@ namespace ams::kern::arch::arm { constexpr size_t Offset = 0; state->icfgr[i] = m_gicd->icfgr[i + Offset]; } + + /* Save spendsgir. */ + static_assert(util::size(state->spendsgir) == util::size(m_gicd->spendsgir)); + for (size_t i = 0; i < util::size(state->spendsgir); ++i) { + state->spendsgir[i] = m_gicd->spendsgir[i]; + } } void KInterruptController::SaveGlobal(GlobalState *state) const { @@ -168,6 +174,12 @@ namespace ams::kern::arch::arm { m_gicd->icenabler[i + Offset] = 0xFFFFFFFF; m_gicd->isenabler[i + Offset] = state->isenabler[i]; } + + /* Restore spendsgir. */ + static_assert(util::size(state->spendsgir) == util::size(m_gicd->spendsgir)); + for (size_t i = 0; i < util::size(state->spendsgir); ++i) { + m_gicd->spendsgir[i] = state->spendsgir[i]; + } } void KInterruptController::RestoreGlobal(const GlobalState *state) const {