diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/arm/arm_interface.h | 2 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.cpp | 4 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.h | 1 | ||||
| -rw-r--r-- | src/core/arm/unicorn/arm_unicorn.cpp | 2 | ||||
| -rw-r--r-- | src/core/arm/unicorn/arm_unicorn.h | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/scheduler.cpp | 1 |
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 | ||
| 229 | void ARM_Dynarmic::ClearExclusiveState() { | ||
| 230 | jit->ClearExclusiveState(); | ||
| 231 | } | ||
| 232 | |||
| 229 | void ARM_Dynarmic::PageTableChanged() { | 233 | void 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 | ||
| 266 | void ARM_Unicorn::ClearExclusiveState() {} | ||
| 267 | |||
| 266 | void ARM_Unicorn::ClearInstructionCache() {} | 268 | void ARM_Unicorn::ClearInstructionCache() {} |
| 267 | 269 | ||
| 268 | void ARM_Unicorn::RecordBreak(GDBStub::BreakpointAddress bkpt) { | 270 | void 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 |