diff options
| author | 2020-04-03 10:14:56 -0400 | |
|---|---|---|
| committer | 2020-04-03 10:14:56 -0400 | |
| commit | 9d8886b1a4327cfb35e222a3bb7c50ca32382090 (patch) | |
| tree | d32e0f35df3a77661cb542445acb51e200d49ec6 /src | |
| parent | Merge pull request #3595 from ReinUsesLisp/c4715-silence (diff) | |
| parent | services: ldr: Fix MemoryState for read/write regions of NROs. (diff) | |
| download | yuzu-9d8886b1a4327cfb35e222a3bb7c50ca32382090.tar.gz yuzu-9d8886b1a4327cfb35e222a3bb7c50ca32382090.tar.xz yuzu-9d8886b1a4327cfb35e222a3bb7c50ca32382090.zip | |
Merge pull request #3563 from bunnei/fix-ldr-memstate
services: ldr: Fix MemoryState for read/write regions of NROs.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/ldr/ldr.cpp | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/core/hle/service/ldr/ldr.cpp b/src/core/hle/service/ldr/ldr.cpp index 157aeec88..647943020 100644 --- a/src/core/hle/service/ldr/ldr.cpp +++ b/src/core/hle/service/ldr/ldr.cpp | |||
| @@ -342,17 +342,27 @@ public: | |||
| 342 | return; | 342 | return; |
| 343 | } | 343 | } |
| 344 | 344 | ||
| 345 | ASSERT( | 345 | // Mark text and read-only region as ModuleCode |
| 346 | vm_manager | 346 | ASSERT(vm_manager |
| 347 | .MirrorMemory(*map_address, nro_address, nro_size, Kernel::MemoryState::ModuleCode) | 347 | .MirrorMemory(*map_address, nro_address, header.text_size + header.ro_size, |
| 348 | .IsSuccess()); | 348 | Kernel::MemoryState::ModuleCode) |
| 349 | .IsSuccess()); | ||
| 350 | // Mark read/write region as ModuleCodeData, which is necessary if this region is used for | ||
| 351 | // TransferMemory (e.g. Final Fantasy VIII Remastered does this) | ||
| 352 | ASSERT(vm_manager | ||
| 353 | .MirrorMemory(*map_address + header.rw_offset, nro_address + header.rw_offset, | ||
| 354 | header.rw_size, Kernel::MemoryState::ModuleCodeData) | ||
| 355 | .IsSuccess()); | ||
| 356 | // Revoke permissions from the old memory region | ||
| 349 | ASSERT(vm_manager.ReprotectRange(nro_address, nro_size, Kernel::VMAPermission::None) | 357 | ASSERT(vm_manager.ReprotectRange(nro_address, nro_size, Kernel::VMAPermission::None) |
| 350 | .IsSuccess()); | 358 | .IsSuccess()); |
| 351 | 359 | ||
| 352 | if (bss_size > 0) { | 360 | if (bss_size > 0) { |
| 361 | // Mark BSS region as ModuleCodeData, which is necessary if this region is used for | ||
| 362 | // TransferMemory (e.g. Final Fantasy VIII Remastered does this) | ||
| 353 | ASSERT(vm_manager | 363 | ASSERT(vm_manager |
| 354 | .MirrorMemory(*map_address + nro_size, bss_address, bss_size, | 364 | .MirrorMemory(*map_address + nro_size, bss_address, bss_size, |
| 355 | Kernel::MemoryState::ModuleCode) | 365 | Kernel::MemoryState::ModuleCodeData) |
| 356 | .IsSuccess()); | 366 | .IsSuccess()); |
| 357 | ASSERT(vm_manager.ReprotectRange(bss_address, bss_size, Kernel::VMAPermission::None) | 367 | ASSERT(vm_manager.ReprotectRange(bss_address, bss_size, Kernel::VMAPermission::None) |
| 358 | .IsSuccess()); | 368 | .IsSuccess()); |