diff options
| author | 2018-03-16 18:22:14 -0400 | |
|---|---|---|
| committer | 2018-03-16 18:32:24 -0400 | |
| commit | 403f8e79eaade7209c6cfd7a9d4334ce5add28df (patch) | |
| tree | 71ab181d8299e7608fa3f856ee0394d66ee55c8f /src | |
| parent | svc: Use more correct values for GetInfo MapRegion and NewMapRegion. (diff) | |
| download | yuzu-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.h | 6 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.cpp | 4 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.h | 2 | ||||
| -rw-r--r-- | src/core/arm/unicorn/arm_unicorn.cpp | 4 | ||||
| -rw-r--r-- | src/core/arm/unicorn/arm_unicorn.h | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/vm_manager.cpp | 3 |
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 | ||
| 139 | void ARM_Dynarmic::UnmapMemory(u64 address, size_t size) { | ||
| 140 | inner_unicorn.UnmapMemory(address, size); | ||
| 141 | } | ||
| 142 | |||
| 139 | void ARM_Dynarmic::SetPC(u64 pc) { | 143 | void 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 | ||
| 80 | void ARM_Unicorn::UnmapMemory(VAddr address, size_t size) { | ||
| 81 | CHECKED(uc_mem_unmap(uc, address, size)); | ||
| 82 | } | ||
| 83 | |||
| 80 | void ARM_Unicorn::SetPC(u64 pc) { | 84 | void 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 | ||