Răsfoiți Sursa

Merge pull request #3563 from bunnei/fix-ldr-memstate

services: ldr: Fix MemoryState for read/write regions of NROs.
Fernando Sahmkow 6 ani în urmă
părinte
comite
9d8886b1a4
1 a modificat fișierele cu 15 adăugiri și 5 ștergeri
  1. 15 5
      src/core/hle/service/ldr/ldr.cpp

+ 15 - 5
src/core/hle/service/ldr/ldr.cpp

@@ -342,17 +342,27 @@ public:
             return;
         }
 
-        ASSERT(
-            vm_manager
-                .MirrorMemory(*map_address, nro_address, nro_size, Kernel::MemoryState::ModuleCode)
-                .IsSuccess());
+        // Mark text and read-only region as ModuleCode
+        ASSERT(vm_manager
+                   .MirrorMemory(*map_address, nro_address, header.text_size + header.ro_size,
+                                 Kernel::MemoryState::ModuleCode)
+                   .IsSuccess());
+        // Mark read/write region as ModuleCodeData, which is necessary if this region is used for
+        // TransferMemory (e.g. Final Fantasy VIII Remastered does this)
+        ASSERT(vm_manager
+                   .MirrorMemory(*map_address + header.rw_offset, nro_address + header.rw_offset,
+                                 header.rw_size, Kernel::MemoryState::ModuleCodeData)
+                   .IsSuccess());
+        // Revoke permissions from the old memory region
         ASSERT(vm_manager.ReprotectRange(nro_address, nro_size, Kernel::VMAPermission::None)
                    .IsSuccess());
 
         if (bss_size > 0) {
+            // Mark BSS region as ModuleCodeData, which is necessary if this region is used for
+            // TransferMemory (e.g. Final Fantasy VIII Remastered does this)
             ASSERT(vm_manager
                        .MirrorMemory(*map_address + nro_size, bss_address, bss_size,
-                                     Kernel::MemoryState::ModuleCode)
+                                     Kernel::MemoryState::ModuleCodeData)
                        .IsSuccess());
             ASSERT(vm_manager.ReprotectRange(bss_address, bss_size, Kernel::VMAPermission::None)
                        .IsSuccess());