diff options
| author | 2020-12-03 15:32:45 -0800 | |
|---|---|---|
| committer | 2020-12-03 15:32:45 -0800 | |
| commit | 69aaad9b9684570284efcdb5921e54d0f5983838 (patch) | |
| tree | 364256228dfcdfc989a597aca2a6c753b173f93a /src/core/arm | |
| parent | Merge pull request #5059 from lioncash/mouse (diff) | |
| parent | kernel: scheduler: Minor cleanup to remove duplicated code. (diff) | |
| download | yuzu-69aaad9b9684570284efcdb5921e54d0f5983838.tar.gz yuzu-69aaad9b9684570284efcdb5921e54d0f5983838.tar.xz yuzu-69aaad9b9684570284efcdb5921e54d0f5983838.zip | |
Merge pull request #4996 from bunnei/use-4jits
Kernel: Refactor to use 4-instances of Dynarmic & various cleanups and improvements
Diffstat (limited to 'src/core/arm')
| -rw-r--r-- | src/core/arm/arm_interface.h | 22 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 11 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.h | 2 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.cpp | 11 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.h | 2 |
5 files changed, 42 insertions, 6 deletions
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index 1f24051e4..70098c526 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h | |||
| @@ -64,15 +64,25 @@ public: | |||
| 64 | /// Step CPU by one instruction | 64 | /// Step CPU by one instruction |
| 65 | virtual void Step() = 0; | 65 | virtual void Step() = 0; |
| 66 | 66 | ||
| 67 | /// Exits execution from a callback, the callback must rewind the stack | ||
| 68 | virtual void ExceptionalExit() = 0; | ||
| 69 | |||
| 67 | /// Clear all instruction cache | 70 | /// Clear all instruction cache |
| 68 | virtual void ClearInstructionCache() = 0; | 71 | virtual void ClearInstructionCache() = 0; |
| 69 | 72 | ||
| 70 | /// Notifies CPU emulation that the current page table has changed. | 73 | /** |
| 71 | /// | 74 | * Clear instruction cache range |
| 72 | /// @param new_page_table The new page table. | 75 | * @param addr Start address of the cache range to clear |
| 73 | /// @param new_address_space_size_in_bits The new usable size of the address space in bits. | 76 | * @param size Size of the cache range to clear, starting at addr |
| 74 | /// This can be either 32, 36, or 39 on official software. | 77 | */ |
| 75 | /// | 78 | virtual void InvalidateCacheRange(VAddr addr, std::size_t size) = 0; |
| 79 | |||
| 80 | /** | ||
| 81 | * Notifies CPU emulation that the current page table has changed. | ||
| 82 | * @param new_page_table The new page table. | ||
| 83 | * @param new_address_space_size_in_bits The new usable size of the address space in bits. | ||
| 84 | * This can be either 32, 36, or 39 on official software. | ||
| 85 | */ | ||
| 76 | virtual void PageTableChanged(Common::PageTable& new_page_table, | 86 | virtual void PageTableChanged(Common::PageTable& new_page_table, |
| 77 | std::size_t new_address_space_size_in_bits) = 0; | 87 | std::size_t new_address_space_size_in_bits) = 0; |
| 78 | 88 | ||
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 6dc03f3b1..193fd7d62 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp | |||
| @@ -189,6 +189,10 @@ void ARM_Dynarmic_32::Run() { | |||
| 189 | jit->Run(); | 189 | jit->Run(); |
| 190 | } | 190 | } |
| 191 | 191 | ||
| 192 | void ARM_Dynarmic_32::ExceptionalExit() { | ||
| 193 | jit->ExceptionalExit(); | ||
| 194 | } | ||
| 195 | |||
| 192 | void ARM_Dynarmic_32::Step() { | 196 | void ARM_Dynarmic_32::Step() { |
| 193 | jit->Step(); | 197 | jit->Step(); |
| 194 | } | 198 | } |
| @@ -282,6 +286,13 @@ void ARM_Dynarmic_32::ClearInstructionCache() { | |||
| 282 | jit->ClearCache(); | 286 | jit->ClearCache(); |
| 283 | } | 287 | } |
| 284 | 288 | ||
| 289 | void ARM_Dynarmic_32::InvalidateCacheRange(VAddr addr, std::size_t size) { | ||
| 290 | if (!jit) { | ||
| 291 | return; | ||
| 292 | } | ||
| 293 | jit->InvalidateCacheRange(static_cast<u32>(addr), size); | ||
| 294 | } | ||
| 295 | |||
| 285 | void ARM_Dynarmic_32::ClearExclusiveState() { | 296 | void ARM_Dynarmic_32::ClearExclusiveState() { |
| 286 | jit->ClearExclusiveState(); | 297 | jit->ClearExclusiveState(); |
| 287 | } | 298 | } |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h index 2bab31b92..35e9ced48 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.h +++ b/src/core/arm/dynarmic/arm_dynarmic_32.h | |||
| @@ -42,6 +42,7 @@ 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; | ||
| 45 | void Step() override; | 46 | void Step() override; |
| 46 | VAddr GetTlsAddress() const override; | 47 | VAddr GetTlsAddress() const override; |
| 47 | void SetTlsAddress(VAddr address) override; | 48 | void SetTlsAddress(VAddr address) override; |
| @@ -58,6 +59,7 @@ public: | |||
| 58 | void ClearExclusiveState() override; | 59 | void ClearExclusiveState() override; |
| 59 | 60 | ||
| 60 | void ClearInstructionCache() override; | 61 | void ClearInstructionCache() override; |
| 62 | void InvalidateCacheRange(VAddr addr, std::size_t size) override; | ||
| 61 | void PageTableChanged(Common::PageTable& new_page_table, | 63 | void PageTableChanged(Common::PageTable& new_page_table, |
| 62 | std::size_t new_address_space_size_in_bits) override; | 64 | std::size_t new_address_space_size_in_bits) override; |
| 63 | 65 | ||
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 5c2060d78..0f0585d0f 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp | |||
| @@ -220,6 +220,10 @@ void ARM_Dynarmic_64::Run() { | |||
| 220 | jit->Run(); | 220 | jit->Run(); |
| 221 | } | 221 | } |
| 222 | 222 | ||
| 223 | void ARM_Dynarmic_64::ExceptionalExit() { | ||
| 224 | jit->ExceptionalExit(); | ||
| 225 | } | ||
| 226 | |||
| 223 | void ARM_Dynarmic_64::Step() { | 227 | void ARM_Dynarmic_64::Step() { |
| 224 | cb->InterpreterFallback(jit->GetPC(), 1); | 228 | cb->InterpreterFallback(jit->GetPC(), 1); |
| 225 | } | 229 | } |
| @@ -318,6 +322,13 @@ void ARM_Dynarmic_64::ClearInstructionCache() { | |||
| 318 | jit->ClearCache(); | 322 | jit->ClearCache(); |
| 319 | } | 323 | } |
| 320 | 324 | ||
| 325 | void ARM_Dynarmic_64::InvalidateCacheRange(VAddr addr, std::size_t size) { | ||
| 326 | if (!jit) { | ||
| 327 | return; | ||
| 328 | } | ||
| 329 | jit->InvalidateCacheRange(addr, size); | ||
| 330 | } | ||
| 331 | |||
| 321 | void ARM_Dynarmic_64::ClearExclusiveState() { | 332 | void ARM_Dynarmic_64::ClearExclusiveState() { |
| 322 | jit->ClearExclusiveState(); | 333 | jit->ClearExclusiveState(); |
| 323 | } | 334 | } |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h index 28e11a17d..329b59a32 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.h +++ b/src/core/arm/dynarmic/arm_dynarmic_64.h | |||
| @@ -40,6 +40,7 @@ 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; | ||
| 43 | VAddr GetTlsAddress() const override; | 44 | VAddr GetTlsAddress() const override; |
| 44 | void SetTlsAddress(VAddr address) override; | 45 | void SetTlsAddress(VAddr address) override; |
| 45 | void SetTPIDR_EL0(u64 value) override; | 46 | void SetTPIDR_EL0(u64 value) override; |
| @@ -55,6 +56,7 @@ public: | |||
| 55 | void ClearExclusiveState() override; | 56 | void ClearExclusiveState() override; |
| 56 | 57 | ||
| 57 | void ClearInstructionCache() override; | 58 | void ClearInstructionCache() override; |
| 59 | void InvalidateCacheRange(VAddr addr, std::size_t size) override; | ||
| 58 | void PageTableChanged(Common::PageTable& new_page_table, | 60 | void PageTableChanged(Common::PageTable& new_page_table, |
| 59 | std::size_t new_address_space_size_in_bits) override; | 61 | std::size_t new_address_space_size_in_bits) override; |
| 60 | 62 | ||