summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar MerryMage2018-07-16 11:24:00 +0100
committerGravatar MerryMage2018-07-16 11:24:00 +0100
commit56cc1c11ecad9e7ea2a36fbb74852a7579b53802 (patch)
tree67eb03302858cccb8f5cb8ec3d2989fb6149d163 /src
parentMerge pull request #669 from lioncash/dynarmic (diff)
downloadyuzu-56cc1c11ecad9e7ea2a36fbb74852a7579b53802.tar.gz
yuzu-56cc1c11ecad9e7ea2a36fbb74852a7579b53802.tar.xz
yuzu-56cc1c11ecad9e7ea2a36fbb74852a7579b53802.zip
scheduler: Clear exclusive state when switching contexts
Diffstat (limited to 'src')
-rw-r--r--src/core/arm/arm_interface.h2
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.cpp4
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.h1
-rw-r--r--src/core/arm/unicorn/arm_unicorn.cpp2
-rw-r--r--src/core/arm/unicorn/arm_unicorn.h1
-rw-r--r--src/core/hle/kernel/scheduler.cpp1
6 files changed, 11 insertions, 0 deletions
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h
index 32ff3c345..8416e73b0 100644
--- a/src/core/arm/arm_interface.h
+++ b/src/core/arm/arm_interface.h
@@ -116,6 +116,8 @@ public:
116 */ 116 */
117 virtual void LoadContext(const ThreadContext& ctx) = 0; 117 virtual void LoadContext(const ThreadContext& ctx) = 0;
118 118
119 virtual void ClearExclusiveState() = 0;
120
119 /// Prepare core for thread reschedule (if needed to correctly handle state) 121 /// Prepare core for thread reschedule (if needed to correctly handle state)
120 virtual void PrepareReschedule() = 0; 122 virtual void PrepareReschedule() = 0;
121}; 123};
diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp
index 42605374b..3572ee7b9 100644
--- a/src/core/arm/dynarmic/arm_dynarmic.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic.cpp
@@ -226,6 +226,10 @@ void ARM_Dynarmic::ClearInstructionCache() {
226 jit->ClearCache(); 226 jit->ClearCache();
227} 227}
228 228
229void ARM_Dynarmic::ClearExclusiveState() {
230 jit->ClearExclusiveState();
231}
232
229void ARM_Dynarmic::PageTableChanged() { 233void ARM_Dynarmic::PageTableChanged() {
230 jit = MakeJit(cb); 234 jit = MakeJit(cb);
231 current_page_table = Memory::GetCurrentPageTable(); 235 current_page_table = Memory::GetCurrentPageTable();
diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h
index 128669d01..ed724c3f1 100644
--- a/src/core/arm/dynarmic/arm_dynarmic.h
+++ b/src/core/arm/dynarmic/arm_dynarmic.h
@@ -39,6 +39,7 @@ public:
39 void LoadContext(const ThreadContext& ctx) override; 39 void LoadContext(const ThreadContext& ctx) override;
40 40
41 void PrepareReschedule() override; 41 void PrepareReschedule() override;
42 void ClearExclusiveState() override;
42 43
43 void ClearInstructionCache() override; 44 void ClearInstructionCache() override;
44 void PageTableChanged() override; 45 void PageTableChanged() override;
diff --git a/src/core/arm/unicorn/arm_unicorn.cpp b/src/core/arm/unicorn/arm_unicorn.cpp
index f239cf0ea..d2d699e9b 100644
--- a/src/core/arm/unicorn/arm_unicorn.cpp
+++ b/src/core/arm/unicorn/arm_unicorn.cpp
@@ -263,6 +263,8 @@ void ARM_Unicorn::PrepareReschedule() {
263 CHECKED(uc_emu_stop(uc)); 263 CHECKED(uc_emu_stop(uc));
264} 264}
265 265
266void ARM_Unicorn::ClearExclusiveState() {}
267
266void ARM_Unicorn::ClearInstructionCache() {} 268void ARM_Unicorn::ClearInstructionCache() {}
267 269
268void ARM_Unicorn::RecordBreak(GDBStub::BreakpointAddress bkpt) { 270void ARM_Unicorn::RecordBreak(GDBStub::BreakpointAddress bkpt) {
diff --git a/src/core/arm/unicorn/arm_unicorn.h b/src/core/arm/unicorn/arm_unicorn.h
index a482a2aa3..a78a0acf2 100644
--- a/src/core/arm/unicorn/arm_unicorn.h
+++ b/src/core/arm/unicorn/arm_unicorn.h
@@ -31,6 +31,7 @@ public:
31 void SaveContext(ThreadContext& ctx) override; 31 void SaveContext(ThreadContext& ctx) override;
32 void LoadContext(const ThreadContext& ctx) override; 32 void LoadContext(const ThreadContext& ctx) override;
33 void PrepareReschedule() override; 33 void PrepareReschedule() override;
34 void ClearExclusiveState() override;
34 void ExecuteInstructions(int num_instructions); 35 void ExecuteInstructions(int num_instructions);
35 void Run() override; 36 void Run() override;
36 void Step() override; 37 void Step() override;
diff --git a/src/core/hle/kernel/scheduler.cpp b/src/core/hle/kernel/scheduler.cpp
index 11c2cb69e..ca8807e19 100644
--- a/src/core/hle/kernel/scheduler.cpp
+++ b/src/core/hle/kernel/scheduler.cpp
@@ -85,6 +85,7 @@ void Scheduler::SwitchContext(Thread* new_thread) {
85 85
86 cpu_core->LoadContext(new_thread->context); 86 cpu_core->LoadContext(new_thread->context);
87 cpu_core->SetTlsAddress(new_thread->GetTLSAddress()); 87 cpu_core->SetTlsAddress(new_thread->GetTLSAddress());
88 cpu_core->ClearExclusiveState();
88 } else { 89 } else {
89 current_thread = nullptr; 90 current_thread = nullptr;
90 // Note: We do not reset the current process and current page table when idling because 91 // Note: We do not reset the current process and current page table when idling because