summaryrefslogtreecommitdiffstats
path: root/src/core/arm/dynarmic/arm_dynarmic_64.cpp
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2021-05-29 02:45:05 +0200
committerGitHub <noreply@github.com>2021-05-29 02:45:05 +0200
commit420b1f89d319308ba43d1f92976aec39a5c2e3fd (patch)
tree91dc40b7158f4e1fcc16bf1d46f7121d03cacdc8 /src/core/arm/dynarmic/arm_dynarmic_64.cpp
parentMerge pull request #6356 from ogniK5377/ApplyNpadSystemCommonPolicy (diff)
parentcore/arm_interface: Call SVC after end of dynarmic block. (diff)
downloadyuzu-420b1f89d319308ba43d1f92976aec39a5c2e3fd.tar
yuzu-420b1f89d319308ba43d1f92976aec39a5c2e3fd.tar.gz
yuzu-420b1f89d319308ba43d1f92976aec39a5c2e3fd.tar.bz2
yuzu-420b1f89d319308ba43d1f92976aec39a5c2e3fd.tar.lz
yuzu-420b1f89d319308ba43d1f92976aec39a5c2e3fd.tar.xz
yuzu-420b1f89d319308ba43d1f92976aec39a5c2e3fd.tar.zst
yuzu-420b1f89d319308ba43d1f92976aec39a5c2e3fd.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, 15 insertions, 6 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
index 157051d69..4f5a58b38 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
@@ -102,7 +102,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 {
@@ -227,11 +229,17 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable*
}
void ARM_Dynarmic_64::Run() {
- jit->Run();
-}
-
-void ARM_Dynarmic_64::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_64::Step() {
@@ -320,6 +328,7 @@ void ARM_Dynarmic_64::LoadContext(const ThreadContext64& ctx) {
void ARM_Dynarmic_64::PrepareReschedule() {
jit->HaltExecution();
+ shutdown = true;
}
void ARM_Dynarmic_64::ClearInstructionCache() {