Kaynağa Gözat

Memory: Do correct Phys->Virt address translation for non-APP linheap

Yuri Kunde Schlesner 10 yıl önce
ebeveyn
işleme
6aa90e13f9

+ 4 - 2
src/core/hle/kernel/process.cpp

@@ -130,9 +130,11 @@ void Process::Run(s32 main_thread_priority, u32 stack_size) {
     Kernel::SetupMainThread(codeset->entrypoint, main_thread_priority);
     Kernel::SetupMainThread(codeset->entrypoint, main_thread_priority);
 }
 }
 
 
+VAddr Process::GetLinearHeapAreaAddress() const {
+    return kernel_version < 0x22C ? Memory::LINEAR_HEAP_VADDR : Memory::NEW_LINEAR_HEAP_VADDR;
+}
 VAddr Process::GetLinearHeapBase() const {
 VAddr Process::GetLinearHeapBase() const {
-    return (kernel_version < 0x22C ? Memory::LINEAR_HEAP_VADDR : Memory::NEW_LINEAR_HEAP_VADDR)
-            + memory_region->base;
+    return GetLinearHeapAreaAddress() + memory_region->base;
 }
 }
 
 
 VAddr Process::GetLinearHeapLimit() const {
 VAddr Process::GetLinearHeapLimit() const {

+ 1 - 0
src/core/hle/kernel/process.h

@@ -143,6 +143,7 @@ public:
     /// Bitmask of the used TLS slots
     /// Bitmask of the used TLS slots
     std::bitset<300> used_tls_slots;
     std::bitset<300> used_tls_slots;
 
 
+    VAddr GetLinearHeapAreaAddress() const;
     VAddr GetLinearHeapBase() const;
     VAddr GetLinearHeapBase() const;
     VAddr GetLinearHeapLimit() const;
     VAddr GetLinearHeapLimit() const;
 
 

+ 1 - 1
src/core/memory.cpp

@@ -291,7 +291,7 @@ VAddr PhysicalToVirtualAddress(const PAddr addr) {
     } else if (addr >= VRAM_PADDR && addr < VRAM_PADDR_END) {
     } else if (addr >= VRAM_PADDR && addr < VRAM_PADDR_END) {
         return addr - VRAM_PADDR + VRAM_VADDR;
         return addr - VRAM_PADDR + VRAM_VADDR;
     } else if (addr >= FCRAM_PADDR && addr < FCRAM_PADDR_END) {
     } else if (addr >= FCRAM_PADDR && addr < FCRAM_PADDR_END) {
-        return addr - FCRAM_PADDR + Kernel::g_current_process->GetLinearHeapBase();
+        return addr - FCRAM_PADDR + Kernel::g_current_process->GetLinearHeapAreaAddress();
     } else if (addr >= DSP_RAM_PADDR && addr < DSP_RAM_PADDR_END) {
     } else if (addr >= DSP_RAM_PADDR && addr < DSP_RAM_PADDR_END) {
         return addr - DSP_RAM_PADDR + DSP_RAM_VADDR;
         return addr - DSP_RAM_PADDR + DSP_RAM_VADDR;
     } else if (addr >= IO_AREA_PADDR && addr < IO_AREA_PADDR_END) {
     } else if (addr >= IO_AREA_PADDR && addr < IO_AREA_PADDR_END) {