diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 19 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.h | 3 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.cpp | 21 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.h | 3 |
4 files changed, 19 insertions, 27 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 3437eed0e..224a30170 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp | |||
| @@ -25,6 +25,9 @@ namespace Core { | |||
| 25 | 25 | ||
| 26 | using namespace Common::Literals; | 26 | using namespace Common::Literals; |
| 27 | 27 | ||
| 28 | constexpr Dynarmic::HaltReason break_loop = Dynarmic::HaltReason::UserDefined2; | ||
| 29 | constexpr Dynarmic::HaltReason svc_call = Dynarmic::HaltReason::UserDefined3; | ||
| 30 | |||
| 28 | class DynarmicCallbacks32 : public Dynarmic::A32::UserCallbacks { | 31 | class DynarmicCallbacks32 : public Dynarmic::A32::UserCallbacks { |
| 29 | public: | 32 | public: |
| 30 | explicit DynarmicCallbacks32(ARM_Dynarmic_32& parent_) | 33 | explicit DynarmicCallbacks32(ARM_Dynarmic_32& parent_) |
| @@ -82,9 +85,8 @@ public: | |||
| 82 | } | 85 | } |
| 83 | 86 | ||
| 84 | void CallSVC(u32 swi) override { | 87 | void CallSVC(u32 swi) override { |
| 85 | parent.svc_called = true; | ||
| 86 | parent.svc_swi = swi; | 88 | parent.svc_swi = swi; |
| 87 | parent.jit->HaltExecution(); | 89 | parent.jit->HaltExecution(svc_call); |
| 88 | } | 90 | } |
| 89 | 91 | ||
| 90 | void AddTicks(u64 ticks) override { | 92 | void AddTicks(u64 ticks) override { |
| @@ -219,12 +221,10 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable* | |||
| 219 | void ARM_Dynarmic_32::Run() { | 221 | void ARM_Dynarmic_32::Run() { |
| 220 | while (true) { | 222 | while (true) { |
| 221 | const auto hr = jit->Run(); | 223 | const auto hr = jit->Run(); |
| 222 | if (!svc_called) { | 224 | if (Has(hr, svc_call)) { |
| 223 | break; | 225 | Kernel::Svc::Call(system, svc_swi); |
| 224 | } | 226 | } |
| 225 | svc_called = false; | 227 | if (Has(hr, break_loop)) { |
| 226 | Kernel::Svc::Call(system, svc_swi); | ||
| 227 | if (shutdown || Has(hr, Dynarmic::HaltReason::UserDefined2)) { | ||
| 228 | break; | 228 | break; |
| 229 | } | 229 | } |
| 230 | } | 230 | } |
| @@ -310,12 +310,11 @@ void ARM_Dynarmic_32::LoadContext(const ThreadContext32& ctx) { | |||
| 310 | } | 310 | } |
| 311 | 311 | ||
| 312 | void ARM_Dynarmic_32::PrepareReschedule() { | 312 | void ARM_Dynarmic_32::PrepareReschedule() { |
| 313 | jit->HaltExecution(); | 313 | jit->HaltExecution(break_loop); |
| 314 | shutdown = true; | ||
| 315 | } | 314 | } |
| 316 | 315 | ||
| 317 | void ARM_Dynarmic_32::SignalInterrupt() { | 316 | void ARM_Dynarmic_32::SignalInterrupt() { |
| 318 | jit->HaltExecution(Dynarmic::HaltReason::UserDefined2); | 317 | jit->HaltExecution(break_loop); |
| 319 | } | 318 | } |
| 320 | 319 | ||
| 321 | void ARM_Dynarmic_32::ClearInstructionCache() { | 320 | void ARM_Dynarmic_32::ClearInstructionCache() { |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h index 6712c777f..3f68a4ff1 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.h +++ b/src/core/arm/dynarmic/arm_dynarmic_32.h | |||
| @@ -84,9 +84,6 @@ private: | |||
| 84 | 84 | ||
| 85 | // SVC callback | 85 | // SVC callback |
| 86 | u32 svc_swi{}; | 86 | u32 svc_swi{}; |
| 87 | bool svc_called{}; | ||
| 88 | |||
| 89 | bool shutdown{}; | ||
| 90 | }; | 87 | }; |
| 91 | 88 | ||
| 92 | } // namespace Core | 89 | } // namespace Core |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index c94b122c5..1966d6e56 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp | |||
| @@ -26,6 +26,9 @@ namespace Core { | |||
| 26 | using Vector = Dynarmic::A64::Vector; | 26 | using Vector = Dynarmic::A64::Vector; |
| 27 | using namespace Common::Literals; | 27 | using namespace Common::Literals; |
| 28 | 28 | ||
| 29 | constexpr Dynarmic::HaltReason break_loop = Dynarmic::HaltReason::UserDefined2; | ||
| 30 | constexpr Dynarmic::HaltReason svc_call = Dynarmic::HaltReason::UserDefined3; | ||
| 31 | |||
| 29 | class DynarmicCallbacks64 : public Dynarmic::A64::UserCallbacks { | 32 | class DynarmicCallbacks64 : public Dynarmic::A64::UserCallbacks { |
| 30 | public: | 33 | public: |
| 31 | explicit DynarmicCallbacks64(ARM_Dynarmic_64& parent_) | 34 | explicit DynarmicCallbacks64(ARM_Dynarmic_64& parent_) |
| @@ -105,7 +108,7 @@ public: | |||
| 105 | break; | 108 | break; |
| 106 | } | 109 | } |
| 107 | 110 | ||
| 108 | parent.jit->HaltExecution(); | 111 | parent.jit->HaltExecution(Dynarmic::HaltReason::CacheInvalidation); |
| 109 | } | 112 | } |
| 110 | 113 | ||
| 111 | void ExceptionRaised(u64 pc, Dynarmic::A64::Exception exception) override { | 114 | void ExceptionRaised(u64 pc, Dynarmic::A64::Exception exception) override { |
| @@ -124,9 +127,8 @@ public: | |||
| 124 | } | 127 | } |
| 125 | 128 | ||
| 126 | void CallSVC(u32 swi) override { | 129 | void CallSVC(u32 swi) override { |
| 127 | parent.svc_called = true; | ||
| 128 | parent.svc_swi = swi; | 130 | parent.svc_swi = swi; |
| 129 | parent.jit->HaltExecution(); | 131 | parent.jit->HaltExecution(svc_call); |
| 130 | } | 132 | } |
| 131 | 133 | ||
| 132 | void AddTicks(u64 ticks) override { | 134 | void AddTicks(u64 ticks) override { |
| @@ -280,12 +282,10 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable* | |||
| 280 | void ARM_Dynarmic_64::Run() { | 282 | void ARM_Dynarmic_64::Run() { |
| 281 | while (true) { | 283 | while (true) { |
| 282 | const auto hr = jit->Run(); | 284 | const auto hr = jit->Run(); |
| 283 | if (!svc_called) { | 285 | if (Has(hr, svc_call)) { |
| 284 | break; | 286 | Kernel::Svc::Call(system, svc_swi); |
| 285 | } | 287 | } |
| 286 | svc_called = false; | 288 | if (Has(hr, break_loop)) { |
| 287 | Kernel::Svc::Call(system, svc_swi); | ||
| 288 | if (shutdown || Has(hr, Dynarmic::HaltReason::UserDefined2)) { | ||
| 289 | break; | 289 | break; |
| 290 | } | 290 | } |
| 291 | } | 291 | } |
| @@ -376,12 +376,11 @@ void ARM_Dynarmic_64::LoadContext(const ThreadContext64& ctx) { | |||
| 376 | } | 376 | } |
| 377 | 377 | ||
| 378 | void ARM_Dynarmic_64::PrepareReschedule() { | 378 | void ARM_Dynarmic_64::PrepareReschedule() { |
| 379 | jit->HaltExecution(); | 379 | jit->HaltExecution(break_loop); |
| 380 | shutdown = true; | ||
| 381 | } | 380 | } |
| 382 | 381 | ||
| 383 | void ARM_Dynarmic_64::SignalInterrupt() { | 382 | void ARM_Dynarmic_64::SignalInterrupt() { |
| 384 | jit->HaltExecution(Dynarmic::HaltReason::UserDefined2); | 383 | jit->HaltExecution(break_loop); |
| 385 | } | 384 | } |
| 386 | 385 | ||
| 387 | void ARM_Dynarmic_64::ClearInstructionCache() { | 386 | void ARM_Dynarmic_64::ClearInstructionCache() { |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h index 528050db6..58bc7fbec 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.h +++ b/src/core/arm/dynarmic/arm_dynarmic_64.h | |||
| @@ -78,9 +78,6 @@ private: | |||
| 78 | 78 | ||
| 79 | // SVC callback | 79 | // SVC callback |
| 80 | u32 svc_swi{}; | 80 | u32 svc_swi{}; |
| 81 | bool svc_called{}; | ||
| 82 | |||
| 83 | bool shutdown{}; | ||
| 84 | }; | 81 | }; |
| 85 | 82 | ||
| 86 | } // namespace Core | 83 | } // namespace Core |