summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2018-03-16 18:22:14 -0400
committerGravatar bunnei2018-03-16 18:32:24 -0400
commit403f8e79eaade7209c6cfd7a9d4334ce5add28df (patch)
tree71ab181d8299e7608fa3f856ee0394d66ee55c8f /src
parentsvc: Use more correct values for GetInfo MapRegion and NewMapRegion. (diff)
downloadyuzu-403f8e79eaade7209c6cfd7a9d4334ce5add28df.tar.gz
yuzu-403f8e79eaade7209c6cfd7a9d4334ce5add28df.tar.xz
yuzu-403f8e79eaade7209c6cfd7a9d4334ce5add28df.zip
arm_interface: Support unmapping previously mapped memory.
Diffstat (limited to 'src')
-rw-r--r--src/core/arm/arm_interface.h6
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.cpp4
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.h2
-rw-r--r--src/core/arm/unicorn/arm_unicorn.cpp4
-rw-r--r--src/core/arm/unicorn/arm_unicorn.h1
-rw-r--r--src/core/hle/kernel/vm_manager.cpp3
6 files changed, 18 insertions, 2 deletions
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h
index 5ae60214e..6667c7dba 100644
--- a/src/core/arm/arm_interface.h
+++ b/src/core/arm/arm_interface.h
@@ -39,8 +39,12 @@ public:
39 Run(1); 39 Run(1);
40 } 40 }
41 41
42 /// Maps a backing memory region for the CPU
42 virtual void MapBackingMemory(VAddr address, size_t size, u8* memory, 43 virtual void MapBackingMemory(VAddr address, size_t size, u8* memory,
43 Kernel::VMAPermission perms) {} 44 Kernel::VMAPermission perms) = 0;
45
46 /// Unmaps a region of memory that was previously mapped using MapBackingMemory
47 virtual void UnmapMemory(VAddr address, size_t size) = 0;
44 48
45 /// Clear all instruction cache 49 /// Clear all instruction cache
46 virtual void ClearInstructionCache() = 0; 50 virtual void ClearInstructionCache() = 0;
diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp
index 4da07b177..0902c6df3 100644
--- a/src/core/arm/dynarmic/arm_dynarmic.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic.cpp
@@ -136,6 +136,10 @@ void ARM_Dynarmic::MapBackingMemory(u64 address, size_t size, u8* memory,
136 inner_unicorn.MapBackingMemory(address, size, memory, perms); 136 inner_unicorn.MapBackingMemory(address, size, memory, perms);
137} 137}
138 138
139void ARM_Dynarmic::UnmapMemory(u64 address, size_t size) {
140 inner_unicorn.UnmapMemory(address, size);
141}
142
139void ARM_Dynarmic::SetPC(u64 pc) { 143void ARM_Dynarmic::SetPC(u64 pc) {
140 jit->SetPC(pc); 144 jit->SetPC(pc);
141} 145}
diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h
index 1d9dcf5ff..fd1a44802 100644
--- a/src/core/arm/dynarmic/arm_dynarmic.h
+++ b/src/core/arm/dynarmic/arm_dynarmic.h
@@ -19,7 +19,7 @@ public:
19 19
20 void MapBackingMemory(VAddr address, size_t size, u8* memory, 20 void MapBackingMemory(VAddr address, size_t size, u8* memory,
21 Kernel::VMAPermission perms) override; 21 Kernel::VMAPermission perms) override;
22 22 void UnmapMemory(u64 address, size_t size) override;
23 void SetPC(u64 pc) override; 23 void SetPC(u64 pc) override;
24 u64 GetPC() const override; 24 u64 GetPC() const override;
25 u64 GetReg(int index) const override; 25 u64 GetReg(int index) const override;
diff --git a/src/core/arm/unicorn/arm_unicorn.cpp b/src/core/arm/unicorn/arm_unicorn.cpp
index 5d2956bfd..162c766fd 100644
--- a/src/core/arm/unicorn/arm_unicorn.cpp
+++ b/src/core/arm/unicorn/arm_unicorn.cpp
@@ -77,6 +77,10 @@ void ARM_Unicorn::MapBackingMemory(VAddr address, size_t size, u8* memory,
77 CHECKED(uc_mem_map_ptr(uc, address, size, static_cast<u32>(perms), memory)); 77 CHECKED(uc_mem_map_ptr(uc, address, size, static_cast<u32>(perms), memory));
78} 78}
79 79
80void ARM_Unicorn::UnmapMemory(VAddr address, size_t size) {
81 CHECKED(uc_mem_unmap(uc, address, size));
82}
83
80void ARM_Unicorn::SetPC(u64 pc) { 84void ARM_Unicorn::SetPC(u64 pc) {
81 CHECKED(uc_reg_write(uc, UC_ARM64_REG_PC, &pc)); 85 CHECKED(uc_reg_write(uc, UC_ARM64_REG_PC, &pc));
82} 86}
diff --git a/src/core/arm/unicorn/arm_unicorn.h b/src/core/arm/unicorn/arm_unicorn.h
index c9a561dec..00b5b1865 100644
--- a/src/core/arm/unicorn/arm_unicorn.h
+++ b/src/core/arm/unicorn/arm_unicorn.h
@@ -14,6 +14,7 @@ public:
14 ~ARM_Unicorn(); 14 ~ARM_Unicorn();
15 void MapBackingMemory(VAddr address, size_t size, u8* memory, 15 void MapBackingMemory(VAddr address, size_t size, u8* memory,
16 Kernel::VMAPermission perms) override; 16 Kernel::VMAPermission perms) override;
17 void UnmapMemory(VAddr address, size_t size) override;
17 void SetPC(u64 pc) override; 18 void SetPC(u64 pc) override;
18 u64 GetPC() const override; 19 u64 GetPC() const override;
19 u64 GetReg(int index) const override; 20 u64 GetReg(int index) const override;
diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp
index 4748297d1..1c2f873aa 100644
--- a/src/core/hle/kernel/vm_manager.cpp
+++ b/src/core/hle/kernel/vm_manager.cpp
@@ -184,6 +184,9 @@ ResultCode VMManager::UnmapRange(VAddr target, u64 size) {
184 } 184 }
185 185
186 ASSERT(FindVMA(target)->second.size >= size); 186 ASSERT(FindVMA(target)->second.size >= size);
187
188 Core::CPU().UnmapMemory(target, size);
189
187 return RESULT_SUCCESS; 190 return RESULT_SUCCESS;
188} 191}
189 192