diff options
| m--------- | externals/dynarmic | 0 | ||||
| -rw-r--r-- | src/core/arm/arm_interface.h | 3 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 22 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.h | 1 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.cpp | 21 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.h | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/physical_core.cpp | 1 |
7 files changed, 27 insertions, 22 deletions
diff --git a/externals/dynarmic b/externals/dynarmic | |||
| Subproject 8bcd46b7e9dc487da217b216c908f2ef15e7a8c | Subproject 644172477eaf0d822178cb7e96c62b75caa9657 | ||
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index c60322442..dce2f4195 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h | |||
| @@ -171,6 +171,9 @@ public: | |||
| 171 | /// Prepare core for thread reschedule (if needed to correctly handle state) | 171 | /// Prepare core for thread reschedule (if needed to correctly handle state) |
| 172 | virtual void PrepareReschedule() = 0; | 172 | virtual void PrepareReschedule() = 0; |
| 173 | 173 | ||
| 174 | /// Signal an interrupt and ask the core to halt as soon as possible. | ||
| 175 | virtual void SignalInterrupt() = 0; | ||
| 176 | |||
| 174 | struct BacktraceEntry { | 177 | struct BacktraceEntry { |
| 175 | std::string module; | 178 | std::string module; |
| 176 | u64 address; | 179 | u64 address; |
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: | |||
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | void AddTicks(u64 ticks) override { | 90 | void AddTicks(u64 ticks) override { |
| 91 | if (parent.uses_wall_clock) { | 91 | ASSERT_MSG(!parent.uses_wall_clock, "This should never happen - dynarmic ticking disabled"); |
| 92 | return; | 92 | |
| 93 | } | ||
| 94 | // Divide the number of ticks by the amount of CPU cores. TODO(Subv): This yields only a | 93 | // Divide the number of ticks by the amount of CPU cores. TODO(Subv): This yields only a |
| 95 | // rough approximation of the amount of executed ticks in the system, it may be thrown off | 94 | // rough approximation of the amount of executed ticks in the system, it may be thrown off |
| 96 | // if not all cores are doing a similar amount of work. Instead of doing this, we should | 95 | // if not all cores are doing a similar amount of work. Instead of doing this, we should |
| @@ -106,12 +105,8 @@ public: | |||
| 106 | } | 105 | } |
| 107 | 106 | ||
| 108 | u64 GetTicksRemaining() override { | 107 | u64 GetTicksRemaining() override { |
| 109 | if (parent.uses_wall_clock) { | 108 | ASSERT_MSG(!parent.uses_wall_clock, "This should never happen - dynarmic ticking disabled"); |
| 110 | if (!parent.interrupt_handlers[parent.core_index].IsInterrupted()) { | 109 | |
| 111 | return minimum_run_cycles; | ||
| 112 | } | ||
| 113 | return 0U; | ||
| 114 | } | ||
| 115 | return std::max<s64>(parent.system.CoreTiming().GetDowncount(), 0); | 110 | return std::max<s64>(parent.system.CoreTiming().GetDowncount(), 0); |
| 116 | } | 111 | } |
| 117 | 112 | ||
| @@ -146,6 +141,7 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable* | |||
| 146 | 141 | ||
| 147 | // Timing | 142 | // Timing |
| 148 | config.wall_clock_cntpct = uses_wall_clock; | 143 | config.wall_clock_cntpct = uses_wall_clock; |
| 144 | config.enable_cycle_counting = !uses_wall_clock; | ||
| 149 | 145 | ||
| 150 | // Code cache size | 146 | // Code cache size |
| 151 | config.code_cache_size = 512_MiB; | 147 | config.code_cache_size = 512_MiB; |
| @@ -222,13 +218,13 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable* | |||
| 222 | 218 | ||
| 223 | void ARM_Dynarmic_32::Run() { | 219 | void ARM_Dynarmic_32::Run() { |
| 224 | while (true) { | 220 | while (true) { |
| 225 | jit->Run(); | 221 | const auto hr = jit->Run(); |
| 226 | if (!svc_called) { | 222 | if (!svc_called) { |
| 227 | break; | 223 | break; |
| 228 | } | 224 | } |
| 229 | svc_called = false; | 225 | svc_called = false; |
| 230 | Kernel::Svc::Call(system, svc_swi); | 226 | Kernel::Svc::Call(system, svc_swi); |
| 231 | if (shutdown) { | 227 | if (shutdown || Has(hr, Dynarmic::HaltReason::UserDefined2)) { |
| 232 | break; | 228 | break; |
| 233 | } | 229 | } |
| 234 | } | 230 | } |
| @@ -318,6 +314,10 @@ void ARM_Dynarmic_32::PrepareReschedule() { | |||
| 318 | shutdown = true; | 314 | shutdown = true; |
| 319 | } | 315 | } |
| 320 | 316 | ||
| 317 | void ARM_Dynarmic_32::SignalInterrupt() { | ||
| 318 | jit->HaltExecution(Dynarmic::HaltReason::UserDefined2); | ||
| 319 | } | ||
| 320 | |||
| 321 | void ARM_Dynarmic_32::ClearInstructionCache() { | 321 | void ARM_Dynarmic_32::ClearInstructionCache() { |
| 322 | jit->ClearCache(); | 322 | jit->ClearCache(); |
| 323 | } | 323 | } |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h index 5d47b600d..6712c777f 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.h +++ b/src/core/arm/dynarmic/arm_dynarmic_32.h | |||
| @@ -57,6 +57,7 @@ public: | |||
| 57 | void LoadContext(const ThreadContext64& ctx) override {} | 57 | void LoadContext(const ThreadContext64& ctx) override {} |
| 58 | 58 | ||
| 59 | void PrepareReschedule() override; | 59 | void PrepareReschedule() override; |
| 60 | void SignalInterrupt() override; | ||
| 60 | void ClearExclusiveState() override; | 61 | void ClearExclusiveState() override; |
| 61 | 62 | ||
| 62 | void ClearInstructionCache() override; | 63 | void ClearInstructionCache() override; |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 24107f9f6..c94b122c5 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp | |||
| @@ -130,9 +130,7 @@ public: | |||
| 130 | } | 130 | } |
| 131 | 131 | ||
| 132 | void AddTicks(u64 ticks) override { | 132 | void AddTicks(u64 ticks) override { |
| 133 | if (parent.uses_wall_clock) { | 133 | ASSERT_MSG(!parent.uses_wall_clock, "This should never happen - dynarmic ticking disabled"); |
| 134 | return; | ||
| 135 | } | ||
| 136 | 134 | ||
| 137 | // Divide the number of ticks by the amount of CPU cores. TODO(Subv): This yields only a | 135 | // Divide the number of ticks by the amount of CPU cores. TODO(Subv): This yields only a |
| 138 | // rough approximation of the amount of executed ticks in the system, it may be thrown off | 136 | // rough approximation of the amount of executed ticks in the system, it may be thrown off |
| @@ -147,12 +145,8 @@ public: | |||
| 147 | } | 145 | } |
| 148 | 146 | ||
| 149 | u64 GetTicksRemaining() override { | 147 | u64 GetTicksRemaining() override { |
| 150 | if (parent.uses_wall_clock) { | 148 | ASSERT_MSG(!parent.uses_wall_clock, "This should never happen - dynarmic ticking disabled"); |
| 151 | if (!parent.interrupt_handlers[parent.core_index].IsInterrupted()) { | 149 | |
| 152 | return minimum_run_cycles; | ||
| 153 | } | ||
| 154 | return 0U; | ||
| 155 | } | ||
| 156 | return std::max<s64>(parent.system.CoreTiming().GetDowncount(), 0); | 150 | return std::max<s64>(parent.system.CoreTiming().GetDowncount(), 0); |
| 157 | } | 151 | } |
| 158 | 152 | ||
| @@ -208,6 +202,7 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable* | |||
| 208 | 202 | ||
| 209 | // Timing | 203 | // Timing |
| 210 | config.wall_clock_cntpct = uses_wall_clock; | 204 | config.wall_clock_cntpct = uses_wall_clock; |
| 205 | config.enable_cycle_counting = !uses_wall_clock; | ||
| 211 | 206 | ||
| 212 | // Code cache size | 207 | // Code cache size |
| 213 | config.code_cache_size = 512_MiB; | 208 | config.code_cache_size = 512_MiB; |
| @@ -284,13 +279,13 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable* | |||
| 284 | 279 | ||
| 285 | void ARM_Dynarmic_64::Run() { | 280 | void ARM_Dynarmic_64::Run() { |
| 286 | while (true) { | 281 | while (true) { |
| 287 | jit->Run(); | 282 | const auto hr = jit->Run(); |
| 288 | if (!svc_called) { | 283 | if (!svc_called) { |
| 289 | break; | 284 | break; |
| 290 | } | 285 | } |
| 291 | svc_called = false; | 286 | svc_called = false; |
| 292 | Kernel::Svc::Call(system, svc_swi); | 287 | Kernel::Svc::Call(system, svc_swi); |
| 293 | if (shutdown) { | 288 | if (shutdown || Has(hr, Dynarmic::HaltReason::UserDefined2)) { |
| 294 | break; | 289 | break; |
| 295 | } | 290 | } |
| 296 | } | 291 | } |
| @@ -385,6 +380,10 @@ void ARM_Dynarmic_64::PrepareReschedule() { | |||
| 385 | shutdown = true; | 380 | shutdown = true; |
| 386 | } | 381 | } |
| 387 | 382 | ||
| 383 | void ARM_Dynarmic_64::SignalInterrupt() { | ||
| 384 | jit->HaltExecution(Dynarmic::HaltReason::UserDefined2); | ||
| 385 | } | ||
| 386 | |||
| 388 | void ARM_Dynarmic_64::ClearInstructionCache() { | 387 | void ARM_Dynarmic_64::ClearInstructionCache() { |
| 389 | jit->ClearCache(); | 388 | jit->ClearCache(); |
| 390 | } | 389 | } |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h index 0c4e46c64..528050db6 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.h +++ b/src/core/arm/dynarmic/arm_dynarmic_64.h | |||
| @@ -51,6 +51,7 @@ public: | |||
| 51 | void LoadContext(const ThreadContext64& ctx) override; | 51 | void LoadContext(const ThreadContext64& ctx) override; |
| 52 | 52 | ||
| 53 | void PrepareReschedule() override; | 53 | void PrepareReschedule() override; |
| 54 | void SignalInterrupt() override; | ||
| 54 | void ClearExclusiveState() override; | 55 | void ClearExclusiveState() override; |
| 55 | 56 | ||
| 56 | void ClearInstructionCache() override; | 57 | void ClearInstructionCache() override; |
diff --git a/src/core/hle/kernel/physical_core.cpp b/src/core/hle/kernel/physical_core.cpp index 7477668e4..18a5f40f8 100644 --- a/src/core/hle/kernel/physical_core.cpp +++ b/src/core/hle/kernel/physical_core.cpp | |||
| @@ -58,6 +58,7 @@ bool PhysicalCore::IsInterrupted() const { | |||
| 58 | void PhysicalCore::Interrupt() { | 58 | void PhysicalCore::Interrupt() { |
| 59 | guard->lock(); | 59 | guard->lock(); |
| 60 | interrupts[core_index].SetInterrupt(true); | 60 | interrupts[core_index].SetInterrupt(true); |
| 61 | arm_interface->SignalInterrupt(); | ||
| 61 | guard->unlock(); | 62 | guard->unlock(); |
| 62 | } | 63 | } |
| 63 | 64 | ||