summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
m---------externals/dynarmic0
-rw-r--r--src/core/arm/arm_interface.h3
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp22
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.h1
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp21
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.h1
-rw-r--r--src/core/hle/kernel/physical_core.cpp1
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
223void ARM_Dynarmic_32::Run() { 219void 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
317void ARM_Dynarmic_32::SignalInterrupt() {
318 jit->HaltExecution(Dynarmic::HaltReason::UserDefined2);
319}
320
321void ARM_Dynarmic_32::ClearInstructionCache() { 321void 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
285void ARM_Dynarmic_64::Run() { 280void 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
383void ARM_Dynarmic_64::SignalInterrupt() {
384 jit->HaltExecution(Dynarmic::HaltReason::UserDefined2);
385}
386
388void ARM_Dynarmic_64::ClearInstructionCache() { 387void 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 {
58void PhysicalCore::Interrupt() { 58void 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