summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp19
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.h3
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp21
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.h3
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
26using namespace Common::Literals; 26using namespace Common::Literals;
27 27
28constexpr Dynarmic::HaltReason break_loop = Dynarmic::HaltReason::UserDefined2;
29constexpr Dynarmic::HaltReason svc_call = Dynarmic::HaltReason::UserDefined3;
30
28class DynarmicCallbacks32 : public Dynarmic::A32::UserCallbacks { 31class DynarmicCallbacks32 : public Dynarmic::A32::UserCallbacks {
29public: 32public:
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*
219void ARM_Dynarmic_32::Run() { 221void 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
312void ARM_Dynarmic_32::PrepareReschedule() { 312void ARM_Dynarmic_32::PrepareReschedule() {
313 jit->HaltExecution(); 313 jit->HaltExecution(break_loop);
314 shutdown = true;
315} 314}
316 315
317void ARM_Dynarmic_32::SignalInterrupt() { 316void ARM_Dynarmic_32::SignalInterrupt() {
318 jit->HaltExecution(Dynarmic::HaltReason::UserDefined2); 317 jit->HaltExecution(break_loop);
319} 318}
320 319
321void ARM_Dynarmic_32::ClearInstructionCache() { 320void 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 {
26using Vector = Dynarmic::A64::Vector; 26using Vector = Dynarmic::A64::Vector;
27using namespace Common::Literals; 27using namespace Common::Literals;
28 28
29constexpr Dynarmic::HaltReason break_loop = Dynarmic::HaltReason::UserDefined2;
30constexpr Dynarmic::HaltReason svc_call = Dynarmic::HaltReason::UserDefined3;
31
29class DynarmicCallbacks64 : public Dynarmic::A64::UserCallbacks { 32class DynarmicCallbacks64 : public Dynarmic::A64::UserCallbacks {
30public: 33public:
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*
280void ARM_Dynarmic_64::Run() { 282void 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
378void ARM_Dynarmic_64::PrepareReschedule() { 378void ARM_Dynarmic_64::PrepareReschedule() {
379 jit->HaltExecution(); 379 jit->HaltExecution(break_loop);
380 shutdown = true;
381} 380}
382 381
383void ARM_Dynarmic_64::SignalInterrupt() { 382void ARM_Dynarmic_64::SignalInterrupt() {
384 jit->HaltExecution(Dynarmic::HaltReason::UserDefined2); 383 jit->HaltExecution(break_loop);
385} 384}
386 385
387void ARM_Dynarmic_64::ClearInstructionCache() { 386void 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