diff options
| author | 2020-11-13 23:20:32 -0800 | |
|---|---|---|
| committer | 2020-11-29 01:31:52 -0800 | |
| commit | 63fd1bb50302867b233325f253b1e2abbc379875 (patch) | |
| tree | 65204a55cc87b2b4ef7260744ff96fabc813c9f6 /src/core/arm | |
| parent | hle: kernel: time_manager: Avoid a crash on process exit. (diff) | |
| download | yuzu-63fd1bb50302867b233325f253b1e2abbc379875.tar.gz yuzu-63fd1bb50302867b233325f253b1e2abbc379875.tar.xz yuzu-63fd1bb50302867b233325f253b1e2abbc379875.zip | |
core: arm: Implement InvalidateCacheRange for CPU cache invalidation.
Diffstat (limited to 'src/core/arm')
| -rw-r--r-- | src/core/arm/arm_interface.h | 19 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 7 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.h | 1 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.cpp | 7 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.h | 1 |
5 files changed, 29 insertions, 6 deletions
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index b3d8ceaf8..70098c526 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h | |||
| @@ -70,12 +70,19 @@ public: | |||
| 70 | /// Clear all instruction cache | 70 | /// Clear all instruction cache |
| 71 | virtual void ClearInstructionCache() = 0; | 71 | virtual void ClearInstructionCache() = 0; |
| 72 | 72 | ||
| 73 | /// Notifies CPU emulation that the current page table has changed. | 73 | /** |
| 74 | /// | 74 | * Clear instruction cache range |
| 75 | /// @param new_page_table The new page table. | 75 | * @param addr Start address of the cache range to clear |
| 76 | /// @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 |
| 77 | /// This can be either 32, 36, or 39 on official software. | 77 | */ |
| 78 | /// | 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 | */ | ||
| 79 | virtual void PageTableChanged(Common::PageTable& new_page_table, | 86 | virtual void PageTableChanged(Common::PageTable& new_page_table, |
| 80 | std::size_t new_address_space_size_in_bits) = 0; | 87 | std::size_t new_address_space_size_in_bits) = 0; |
| 81 | 88 | ||
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index af23206f5..193fd7d62 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp | |||
| @@ -286,6 +286,13 @@ void ARM_Dynarmic_32::ClearInstructionCache() { | |||
| 286 | jit->ClearCache(); | 286 | jit->ClearCache(); |
| 287 | } | 287 | } |
| 288 | 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 | |||
| 289 | void ARM_Dynarmic_32::ClearExclusiveState() { | 296 | void ARM_Dynarmic_32::ClearExclusiveState() { |
| 290 | jit->ClearExclusiveState(); | 297 | jit->ClearExclusiveState(); |
| 291 | } | 298 | } |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h index e16b689c8..35e9ced48 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.h +++ b/src/core/arm/dynarmic/arm_dynarmic_32.h | |||
| @@ -59,6 +59,7 @@ public: | |||
| 59 | void ClearExclusiveState() override; | 59 | void ClearExclusiveState() override; |
| 60 | 60 | ||
| 61 | void ClearInstructionCache() override; | 61 | void ClearInstructionCache() override; |
| 62 | void InvalidateCacheRange(VAddr addr, std::size_t size) override; | ||
| 62 | void PageTableChanged(Common::PageTable& new_page_table, | 63 | void PageTableChanged(Common::PageTable& new_page_table, |
| 63 | std::size_t new_address_space_size_in_bits) override; | 64 | std::size_t new_address_space_size_in_bits) override; |
| 64 | 65 | ||
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 1c9fd18b5..0f0585d0f 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp | |||
| @@ -322,6 +322,13 @@ void ARM_Dynarmic_64::ClearInstructionCache() { | |||
| 322 | jit->ClearCache(); | 322 | jit->ClearCache(); |
| 323 | } | 323 | } |
| 324 | 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 | |||
| 325 | void ARM_Dynarmic_64::ClearExclusiveState() { | 332 | void ARM_Dynarmic_64::ClearExclusiveState() { |
| 326 | jit->ClearExclusiveState(); | 333 | jit->ClearExclusiveState(); |
| 327 | } | 334 | } |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h index aa0a5c424..329b59a32 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.h +++ b/src/core/arm/dynarmic/arm_dynarmic_64.h | |||
| @@ -56,6 +56,7 @@ public: | |||
| 56 | void ClearExclusiveState() override; | 56 | void ClearExclusiveState() override; |
| 57 | 57 | ||
| 58 | void ClearInstructionCache() override; | 58 | void ClearInstructionCache() override; |
| 59 | void InvalidateCacheRange(VAddr addr, std::size_t size) override; | ||
| 59 | void PageTableChanged(Common::PageTable& new_page_table, | 60 | void PageTableChanged(Common::PageTable& new_page_table, |
| 60 | std::size_t new_address_space_size_in_bits) override; | 61 | std::size_t new_address_space_size_in_bits) override; |
| 61 | 62 | ||