summaryrefslogtreecommitdiffstats
path: root/src/core/arm/dynarmic/arm_dynarmic_64.cpp
diff options
context:
space:
mode:
authormerry <git@mary.rs>2022-04-03 19:20:11 +0200
committermerry <git@mary.rs>2022-04-03 19:20:11 +0200
commita5d040df3d98006827083d18906e36b56dbd65bb (patch)
tree3ae9d2445c334c44054558b7c3a6e61d3690f352 /src/core/arm/dynarmic/arm_dynarmic_64.cpp
parentdynarmic: Better interrupts (diff)
downloadyuzu-a5d040df3d98006827083d18906e36b56dbd65bb.tar
yuzu-a5d040df3d98006827083d18906e36b56dbd65bb.tar.gz
yuzu-a5d040df3d98006827083d18906e36b56dbd65bb.tar.bz2
yuzu-a5d040df3d98006827083d18906e36b56dbd65bb.tar.lz
yuzu-a5d040df3d98006827083d18906e36b56dbd65bb.tar.xz
yuzu-a5d040df3d98006827083d18906e36b56dbd65bb.tar.zst
yuzu-a5d040df3d98006827083d18906e36b56dbd65bb.zip
Diffstat (limited to 'src/core/arm/dynarmic/arm_dynarmic_64.cpp')
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp21
1 files changed, 10 insertions, 11 deletions
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 {
using Vector = Dynarmic::A64::Vector;
using namespace Common::Literals;
+constexpr Dynarmic::HaltReason break_loop = Dynarmic::HaltReason::UserDefined2;
+constexpr Dynarmic::HaltReason svc_call = Dynarmic::HaltReason::UserDefined3;
+
class DynarmicCallbacks64 : public Dynarmic::A64::UserCallbacks {
public:
explicit DynarmicCallbacks64(ARM_Dynarmic_64& parent_)
@@ -105,7 +108,7 @@ public:
break;
}
- parent.jit->HaltExecution();
+ parent.jit->HaltExecution(Dynarmic::HaltReason::CacheInvalidation);
}
void ExceptionRaised(u64 pc, Dynarmic::A64::Exception exception) override {
@@ -124,9 +127,8 @@ public:
}
void CallSVC(u32 swi) override {
- parent.svc_called = true;
parent.svc_swi = swi;
- parent.jit->HaltExecution();
+ parent.jit->HaltExecution(svc_call);
}
void AddTicks(u64 ticks) override {
@@ -280,12 +282,10 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable*
void ARM_Dynarmic_64::Run() {
while (true) {
const auto hr = jit->Run();
- if (!svc_called) {
- break;
+ if (Has(hr, svc_call)) {
+ Kernel::Svc::Call(system, svc_swi);
}
- svc_called = false;
- Kernel::Svc::Call(system, svc_swi);
- if (shutdown || Has(hr, Dynarmic::HaltReason::UserDefined2)) {
+ if (Has(hr, break_loop)) {
break;
}
}
@@ -376,12 +376,11 @@ void ARM_Dynarmic_64::LoadContext(const ThreadContext64& ctx) {
}
void ARM_Dynarmic_64::PrepareReschedule() {
- jit->HaltExecution();
- shutdown = true;
+ jit->HaltExecution(break_loop);
}
void ARM_Dynarmic_64::SignalInterrupt() {
- jit->HaltExecution(Dynarmic::HaltReason::UserDefined2);
+ jit->HaltExecution(break_loop);
}
void ARM_Dynarmic_64::ClearInstructionCache() {