diff options
| author | Markus Wick <markus@selfnet.de> | 2021-05-27 22:54:22 +0200 |
|---|---|---|
| committer | Markus Wick <markus@selfnet.de> | 2021-05-27 23:23:23 +0200 |
| commit | 3d2e80daed4981b8f92604568b63c217fa587ad6 (patch) | |
| tree | 89938c90a246c49254c4f2b97f9aef9cd0b9b336 /src/core/arm/dynarmic/arm_dynarmic_32.cpp | |
| parent | 9110cfdefb2085d956c430df78dd4e694eca0728 (diff) | |
core/arm_interface: Call SVC after end of dynarmic block.
So we can modify all of dynarmic states within SVC without ExceptionalExit.
Especially as the ExceptionalExit hack is dropped on upstream dynarmic.
Diffstat (limited to 'src/core/arm/dynarmic/arm_dynarmic_32.cpp')
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index e401fa825..50dc82382 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -78,7 +78,9 @@ public: } void CallSVC(u32 swi) override { - Kernel::Svc::Call(parent.system, swi); + parent.svc_called = true; + parent.svc_swi = swi; + parent.jit->HaltExecution(); } void AddTicks(u64 ticks) override { @@ -187,11 +189,17 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable* } void ARM_Dynarmic_32::Run() { - jit->Run(); -} - -void ARM_Dynarmic_32::ExceptionalExit() { - jit->ExceptionalExit(); + while (true) { + jit->Run(); + if (!svc_called) { + break; + } + svc_called = false; + Kernel::Svc::Call(system, svc_swi); + if (shutdown) { + break; + } + } } void ARM_Dynarmic_32::Step() { @@ -275,6 +283,7 @@ void ARM_Dynarmic_32::LoadContext(const ThreadContext32& ctx) { void ARM_Dynarmic_32::PrepareReschedule() { jit->HaltExecution(); + shutdown = true; } void ARM_Dynarmic_32::ClearInstructionCache() { |
