diff options
| author | merry <git@mary.rs> | 2022-04-03 16:29:05 +0100 |
|---|---|---|
| committer | merry <git@mary.rs> | 2022-04-03 16:39:48 +0100 |
| commit | f8b8af47ad9d414ce19c4801d702a6c52ae6e82e (patch) | |
| tree | 82c0d1add6ea0cb37f9cb3d4ed26cc1860611eb2 /src/core/arm/dynarmic/arm_dynarmic_32.cpp | |
| parent | 51a8dd49193a7270413c2f0dc447dd3430b63379 (diff) | |
dynarmic: Better interrupts
Diffstat (limited to 'src/core/arm/dynarmic/arm_dynarmic_32.cpp')
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 286976623..3437eed0e 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -88,9 +88,8 @@ public: } void AddTicks(u64 ticks) override { - if (parent.uses_wall_clock) { - return; - } + ASSERT_MSG(!parent.uses_wall_clock, "This should never happen - dynarmic ticking disabled"); + // Divide the number of ticks by the amount of CPU cores. TODO(Subv): This yields only a // rough approximation of the amount of executed ticks in the system, it may be thrown off // if not all cores are doing a similar amount of work. Instead of doing this, we should @@ -106,12 +105,8 @@ public: } u64 GetTicksRemaining() override { - if (parent.uses_wall_clock) { - if (!parent.interrupt_handlers[parent.core_index].IsInterrupted()) { - return minimum_run_cycles; - } - return 0U; - } + ASSERT_MSG(!parent.uses_wall_clock, "This should never happen - dynarmic ticking disabled"); + return std::max<s64>(parent.system.CoreTiming().GetDowncount(), 0); } @@ -146,6 +141,7 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable* // Timing config.wall_clock_cntpct = uses_wall_clock; + config.enable_cycle_counting = !uses_wall_clock; // Code cache size config.code_cache_size = 512_MiB; @@ -222,13 +218,13 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable* void ARM_Dynarmic_32::Run() { while (true) { - jit->Run(); + const auto hr = jit->Run(); if (!svc_called) { break; } svc_called = false; Kernel::Svc::Call(system, svc_swi); - if (shutdown) { + if (shutdown || Has(hr, Dynarmic::HaltReason::UserDefined2)) { break; } } @@ -318,6 +314,10 @@ void ARM_Dynarmic_32::PrepareReschedule() { shutdown = true; } +void ARM_Dynarmic_32::SignalInterrupt() { + jit->HaltExecution(Dynarmic::HaltReason::UserDefined2); +} + void ARM_Dynarmic_32::ClearInstructionCache() { jit->ClearCache(); } |
