forked from eden-emu/eden
		
	services: ldr: Fix MemoryState for read/write regions of NROs.
- Fixes #3541, used by Final Fantasy VIII Remastered.
This commit is contained in:
		
							parent
							
								
									c10bdacf04
								
							
						
					
					
						commit
						7ee7aa21b1
					
				
					 1 changed files with 15 additions and 5 deletions
				
			
		|  | @ -342,17 +342,27 @@ public: | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         ASSERT( |         // Mark text and read-only region as ModuleCode
 | ||||||
|             vm_manager |         ASSERT(vm_manager | ||||||
|                 .MirrorMemory(*map_address, nro_address, nro_size, Kernel::MemoryState::ModuleCode) |                    .MirrorMemory(*map_address, nro_address, header.text_size + header.ro_size, | ||||||
|  |                                  Kernel::MemoryState::ModuleCode) | ||||||
|                    .IsSuccess()); |                    .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) |         ASSERT(vm_manager.ReprotectRange(nro_address, nro_size, Kernel::VMAPermission::None) | ||||||
|                    .IsSuccess()); |                    .IsSuccess()); | ||||||
| 
 | 
 | ||||||
|         if (bss_size > 0) { |         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 |             ASSERT(vm_manager | ||||||
|                        .MirrorMemory(*map_address + nro_size, bss_address, bss_size, |                        .MirrorMemory(*map_address + nro_size, bss_address, bss_size, | ||||||
|                                      Kernel::MemoryState::ModuleCode) |                                      Kernel::MemoryState::ModuleCodeData) | ||||||
|                        .IsSuccess()); |                        .IsSuccess()); | ||||||
|             ASSERT(vm_manager.ReprotectRange(bss_address, bss_size, Kernel::VMAPermission::None) |             ASSERT(vm_manager.ReprotectRange(bss_address, bss_size, Kernel::VMAPermission::None) | ||||||
|                        .IsSuccess()); |                        .IsSuccess()); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 bunnei
						bunnei