summaryrefslogtreecommitdiff
path: root/src/core/arm
diff options
context:
space:
mode:
authorGravatar bunnei2020-11-13 23:20:32 -0800
committerGravatar bunnei2020-11-29 01:31:52 -0800
commit63fd1bb50302867b233325f253b1e2abbc379875 (patch)
tree65204a55cc87b2b4ef7260744ff96fabc813c9f6 /src/core/arm
parenthle: kernel: time_manager: Avoid a crash on process exit. (diff)
downloadyuzu-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.h19
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp7
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.h1
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp7
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.h1
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
289void 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
289void ARM_Dynarmic_32::ClearExclusiveState() { 296void 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
325void ARM_Dynarmic_64::InvalidateCacheRange(VAddr addr, std::size_t size) {
326 if (!jit) {
327 return;
328 }
329 jit->InvalidateCacheRange(addr, size);
330}
331
325void ARM_Dynarmic_64::ClearExclusiveState() { 332void 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