summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Markus Wick2021-05-27 22:54:22 +0200
committerGravatar Markus Wick2021-05-27 23:23:23 +0200
commit3d2e80daed4981b8f92604568b63c217fa587ad6 (patch)
tree89938c90a246c49254c4f2b97f9aef9cd0b9b336
parentMerge pull request #6346 from lat9nq/apply-config-pgc (diff)
downloadyuzu-3d2e80daed4981b8f92604568b63c217fa587ad6.tar.gz
yuzu-3d2e80daed4981b8f92604568b63c217fa587ad6.tar.xz
yuzu-3d2e80daed4981b8f92604568b63c217fa587ad6.zip
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 '')
-rw-r--r--src/core/arm/arm_interface.h3
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp21
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.h7
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp21
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.h7
-rw-r--r--src/core/hle/kernel/k_scheduler.cpp1
6 files changed, 42 insertions, 18 deletions
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h
index 77094b48f..689e3ceb5 100644
--- a/src/core/arm/arm_interface.h
+++ b/src/core/arm/arm_interface.h
@@ -65,9 +65,6 @@ public:
65 /// Step CPU by one instruction 65 /// Step CPU by one instruction
66 virtual void Step() = 0; 66 virtual void Step() = 0;
67 67
68 /// Exits execution from a callback, the callback must rewind the stack
69 virtual void ExceptionalExit() = 0;
70
71 /// Clear all instruction cache 68 /// Clear all instruction cache
72 virtual void ClearInstructionCache() = 0; 69 virtual void ClearInstructionCache() = 0;
73 70
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:
78 } 78 }
79 79
80 void CallSVC(u32 swi) override { 80 void CallSVC(u32 swi) override {
81 Kernel::Svc::Call(parent.system, swi); 81 parent.svc_called = true;
82 parent.svc_swi = swi;
83 parent.jit->HaltExecution();
82 } 84 }
83 85
84 void AddTicks(u64 ticks) override { 86 void AddTicks(u64 ticks) override {
@@ -187,11 +189,17 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable*
187} 189}
188 190
189void ARM_Dynarmic_32::Run() { 191void ARM_Dynarmic_32::Run() {
190 jit->Run(); 192 while (true) {
191} 193 jit->Run();
192 194 if (!svc_called) {
193void ARM_Dynarmic_32::ExceptionalExit() { 195 break;
194 jit->ExceptionalExit(); 196 }
197 svc_called = false;
198 Kernel::Svc::Call(system, svc_swi);
199 if (shutdown) {
200 break;
201 }
202 }
195} 203}
196 204
197void ARM_Dynarmic_32::Step() { 205void ARM_Dynarmic_32::Step() {
@@ -275,6 +283,7 @@ void ARM_Dynarmic_32::LoadContext(const ThreadContext32& ctx) {
275 283
276void ARM_Dynarmic_32::PrepareReschedule() { 284void ARM_Dynarmic_32::PrepareReschedule() {
277 jit->HaltExecution(); 285 jit->HaltExecution();
286 shutdown = true;
278} 287}
279 288
280void ARM_Dynarmic_32::ClearInstructionCache() { 289void ARM_Dynarmic_32::ClearInstructionCache() {
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h
index b882b0c59..fa6f4f430 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.h
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.h
@@ -42,7 +42,6 @@ public:
42 u32 GetPSTATE() const override; 42 u32 GetPSTATE() const override;
43 void SetPSTATE(u32 pstate) override; 43 void SetPSTATE(u32 pstate) override;
44 void Run() override; 44 void Run() override;
45 void ExceptionalExit() override;
46 void Step() override; 45 void Step() override;
47 VAddr GetTlsAddress() const override; 46 VAddr GetTlsAddress() const override;
48 void SetTlsAddress(VAddr address) override; 47 void SetTlsAddress(VAddr address) override;
@@ -82,6 +81,12 @@ private:
82 std::size_t core_index; 81 std::size_t core_index;
83 DynarmicExclusiveMonitor& exclusive_monitor; 82 DynarmicExclusiveMonitor& exclusive_monitor;
84 std::shared_ptr<Dynarmic::A32::Jit> jit; 83 std::shared_ptr<Dynarmic::A32::Jit> jit;
84
85 // SVC callback
86 u32 svc_swi{};
87 bool svc_called{};
88
89 bool shutdown{};
85}; 90};
86 91
87} // namespace Core 92} // namespace Core
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:
102 } 102 }
103 103
104 void CallSVC(u32 swi) override { 104 void CallSVC(u32 swi) override {
105 Kernel::Svc::Call(parent.system, swi); 105 parent.svc_called = true;
106 parent.svc_swi = swi;
107 parent.jit->HaltExecution();
106 } 108 }
107 109
108 void AddTicks(u64 ticks) override { 110 void AddTicks(u64 ticks) override {
@@ -227,11 +229,17 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable*
227} 229}
228 230
229void ARM_Dynarmic_64::Run() { 231void ARM_Dynarmic_64::Run() {
230 jit->Run(); 232 while (true) {
231} 233 jit->Run();
232 234 if (!svc_called) {
233void ARM_Dynarmic_64::ExceptionalExit() { 235 break;
234 jit->ExceptionalExit(); 236 }
237 svc_called = false;
238 Kernel::Svc::Call(system, svc_swi);
239 if (shutdown) {
240 break;
241 }
242 }
235} 243}
236 244
237void ARM_Dynarmic_64::Step() { 245void ARM_Dynarmic_64::Step() {
@@ -320,6 +328,7 @@ void ARM_Dynarmic_64::LoadContext(const ThreadContext64& ctx) {
320 328
321void ARM_Dynarmic_64::PrepareReschedule() { 329void ARM_Dynarmic_64::PrepareReschedule() {
322 jit->HaltExecution(); 330 jit->HaltExecution();
331 shutdown = true;
323} 332}
324 333
325void ARM_Dynarmic_64::ClearInstructionCache() { 334void ARM_Dynarmic_64::ClearInstructionCache() {
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h
index 92f715f19..5214a8147 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.h
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.h
@@ -40,7 +40,6 @@ public:
40 void SetPSTATE(u32 pstate) override; 40 void SetPSTATE(u32 pstate) override;
41 void Run() override; 41 void Run() override;
42 void Step() override; 42 void Step() override;
43 void ExceptionalExit() override;
44 VAddr GetTlsAddress() const override; 43 VAddr GetTlsAddress() const override;
45 void SetTlsAddress(VAddr address) override; 44 void SetTlsAddress(VAddr address) override;
46 void SetTPIDR_EL0(u64 value) override; 45 void SetTPIDR_EL0(u64 value) override;
@@ -75,6 +74,12 @@ private:
75 DynarmicExclusiveMonitor& exclusive_monitor; 74 DynarmicExclusiveMonitor& exclusive_monitor;
76 75
77 std::shared_ptr<Dynarmic::A64::Jit> jit; 76 std::shared_ptr<Dynarmic::A64::Jit> jit;
77
78 // SVC callback
79 u32 svc_swi{};
80 bool svc_called{};
81
82 bool shutdown{};
78}; 83};
79 84
80} // namespace Core 85} // namespace Core
diff --git a/src/core/hle/kernel/k_scheduler.cpp b/src/core/hle/kernel/k_scheduler.cpp
index 2f82fbcd6..6a7d80d03 100644
--- a/src/core/hle/kernel/k_scheduler.cpp
+++ b/src/core/hle/kernel/k_scheduler.cpp
@@ -659,7 +659,6 @@ void KScheduler::Unload(KThread* thread) {
659 659
660 if (thread) { 660 if (thread) {
661 if (thread->IsCallingSvc()) { 661 if (thread->IsCallingSvc()) {
662 system.ArmInterface(core_id).ExceptionalExit();
663 thread->ClearIsCallingSvc(); 662 thread->ClearIsCallingSvc();
664 } 663 }
665 if (!thread->IsTerminationRequested()) { 664 if (!thread->IsTerminationRequested()) {