diff --git a/libmesosphere/include/mesosphere/arch/arm64/kern_cpu.hpp b/libmesosphere/include/mesosphere/arch/arm64/kern_cpu.hpp index c3c915a2..e9ca675e 100644 --- a/libmesosphere/include/mesosphere/arch/arm64/kern_cpu.hpp +++ b/libmesosphere/include/mesosphere/arch/arm64/kern_cpu.hpp @@ -232,7 +232,7 @@ namespace ams::kern::arch::arm64::cpu { } ALWAYS_INLINE void SetExceptionThreadStackTop(uintptr_t top) { - SetTpidrEl1(top); + cpu::SetCntvCvalEl0(top); } ALWAYS_INLINE void SwitchThreadLocalRegion(uintptr_t tlr) { diff --git a/libmesosphere/include/mesosphere/arch/arm64/kern_cpu_system_registers.hpp b/libmesosphere/include/mesosphere/arch/arm64/kern_cpu_system_registers.hpp index 7a5fe499..d8c936e2 100644 --- a/libmesosphere/include/mesosphere/arch/arm64/kern_cpu_system_registers.hpp +++ b/libmesosphere/include/mesosphere/arch/arm64/kern_cpu_system_registers.hpp @@ -74,6 +74,7 @@ namespace ams::kern::arch::arm64::cpu { MESOSPHERE_CPU_DEFINE_SYSREG_ACCESSORS(CntkCtlEl1, cntkctl_el1) MESOSPHERE_CPU_DEFINE_SYSREG_ACCESSORS(CntpCtlEl0, cntp_ctl_el0) MESOSPHERE_CPU_DEFINE_SYSREG_ACCESSORS(CntpCvalEl0, cntp_cval_el0) + MESOSPHERE_CPU_DEFINE_SYSREG_ACCESSORS(CntvCvalEl0, cntv_cval_el0) MESOSPHERE_CPU_DEFINE_SYSREG_ACCESSORS(Daif, daif) diff --git a/libmesosphere/source/board/nintendo/nx/kern_k_sleep_manager_asm.s b/libmesosphere/source/board/nintendo/nx/kern_k_sleep_manager_asm.s index bdc23c71..db198a29 100644 --- a/libmesosphere/source/board/nintendo/nx/kern_k_sleep_manager_asm.s +++ b/libmesosphere/source/board/nintendo/nx/kern_k_sleep_manager_asm.s @@ -95,9 +95,10 @@ _ZN3ams4kern5board8nintendo2nx13KSleepManager15CpuSleepHandlerEmm: mrs x2, tpidr_el1 stp x1, x2, [x0], #0x10 - /* Save the virtual resumption entrypoint. */ + /* Save the virtual resumption entrypoint and cntv_cval_el0. */ adr x1, 77f - stp x1, xzr, [x0], #0x10 + mrs x2, cntv_cval_el0 + stp x1, x2, [x0], #0x10 /* Get the current core id. */ mrs x0, mpidr_el1 @@ -245,12 +246,13 @@ _ZN3ams4kern5board8nintendo2nx13KSleepManager11ResumeEntryEm: msr tcr_el1, x1 msr mair_el1, x2 - /* Get sctlr, tpidr, and the entrypoint. */ - ldp x1, x2, [x0], #0x10 - ldp x3, xzr, [x0], #0x10 + /* Get sctlr, tpidr, the entrypoint, and cntv_cval_el0. */ + ldp x1, x2, [x0], #0x10 + ldp x3, x4, [x0], #0x10 /* Set the global context back into x18/tpidr. */ msr tpidr_el1, x2 + msr cntv_cval_el0, x4 dsb sy isb