summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/scheduler.cpp
diff options
context:
space:
mode:
authorGravatar Subv2018-07-20 19:57:45 -0500
committerGravatar Subv2018-07-20 19:57:45 -0500
commitd84eb9dac64f314adcef2c374de245012f658b1d (patch)
tree56720a5bce5d1a285dda01c16bfcb1dd57e53054 /src/core/hle/kernel/scheduler.cpp
parentMerge pull request #730 from lioncash/string (diff)
downloadyuzu-d84eb9dac64f314adcef2c374de245012f658b1d.tar.gz
yuzu-d84eb9dac64f314adcef2c374de245012f658b1d.tar.xz
yuzu-d84eb9dac64f314adcef2c374de245012f658b1d.zip
CPU: Save and restore the TPIDR_EL0 system register on every context switch.
Note that there's currently a dynarmic bug preventing this register from being written.
Diffstat (limited to 'src/core/hle/kernel/scheduler.cpp')
-rw-r--r--src/core/hle/kernel/scheduler.cpp3
1 files changed, 3 insertions, 0 deletions
diff --git a/src/core/hle/kernel/scheduler.cpp b/src/core/hle/kernel/scheduler.cpp
index 1f4abfbe8..82829f6bb 100644
--- a/src/core/hle/kernel/scheduler.cpp
+++ b/src/core/hle/kernel/scheduler.cpp
@@ -56,6 +56,8 @@ void Scheduler::SwitchContext(Thread* new_thread) {
56 if (previous_thread) { 56 if (previous_thread) {
57 previous_thread->last_running_ticks = CoreTiming::GetTicks(); 57 previous_thread->last_running_ticks = CoreTiming::GetTicks();
58 cpu_core->SaveContext(previous_thread->context); 58 cpu_core->SaveContext(previous_thread->context);
59 // Save the TPIDR_EL0 system register in case it was modified.
60 previous_thread->tpidr_el0 = cpu_core->GetTPIDR_EL0();
59 61
60 if (previous_thread->status == THREADSTATUS_RUNNING) { 62 if (previous_thread->status == THREADSTATUS_RUNNING) {
61 // This is only the case when a reschedule is triggered without the current thread 63 // This is only the case when a reschedule is triggered without the current thread
@@ -87,6 +89,7 @@ void Scheduler::SwitchContext(Thread* new_thread) {
87 89
88 cpu_core->LoadContext(new_thread->context); 90 cpu_core->LoadContext(new_thread->context);
89 cpu_core->SetTlsAddress(new_thread->GetTLSAddress()); 91 cpu_core->SetTlsAddress(new_thread->GetTLSAddress());
92 cpu_core->SetTPIDR_EL0(new_thread->GetTPIDR_EL0());
90 cpu_core->ClearExclusiveState(); 93 cpu_core->ClearExclusiveState();
91 } else { 94 } else {
92 current_thread = nullptr; 95 current_thread = nullptr;