From 546be9b6f9dec0c8a257f917f7be7caa7c659841 Mon Sep 17 00:00:00 2001 From: PSI-Rockin Date: Fri, 10 May 2024 21:23:18 -0400 Subject: [PATCH] RO: Unmap CROs when unloaded Thanks @noumidev --- src/core/services/ldr_ro.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/core/services/ldr_ro.cpp b/src/core/services/ldr_ro.cpp index 00a09475..421ff1aa 100644 --- a/src/core/services/ldr_ro.cpp +++ b/src/core/services/ldr_ro.cpp @@ -22,6 +22,7 @@ namespace CROHeader { NameOffset = 0x084, NextCRO = 0x088, PrevCRO = 0x08C, + FileSize = 0x090, OnUnresolved = 0x0AC, CodeOffset = 0x0B0, DataOffset = 0x0B8, @@ -177,6 +178,10 @@ public: mem.write32(croPointer + CROHeader::PrevCRO, prevCRO); } + u32 getSize() { + return mem.read32(croPointer + CROHeader::FileSize); + } + void write32(u32 addr, u32 value) { // Note: some games export symbols to the static module, which doesn't contain any segments. // Instead, its segments point to ROM segments. We need this special write handler for writes to .text, which @@ -1400,7 +1405,12 @@ void LDRService::unloadCRO(u32 messagePointer) { Helpers::panic("Failed to unrebase CRO"); } - // TODO: unmap the CRO from the pagetable + u32 size = cro.getSize(); + bool succeeded = mem.mapVirtualMemory(mapVaddr, croPointer, size >> 12, false, false, false, + MemoryState::Locked, MemoryState::AliasCode, MemoryState::Free, MemoryState::Private); + if (!succeeded) { + Helpers::panic("Failed to unmap CRO"); + } kernel.clearInstructionCache();