From 02b450ff19f58b5b906d22f51ac42e32215a0593 Mon Sep 17 00:00:00 2001 From: flyinghead Date: Wed, 28 Aug 2019 14:08:13 +0200 Subject: [PATCH] Fix vram and code block protection in 32-bit mode --- core/hw/mem/_vmem.cpp | 4 ++-- core/hw/sh4/dyna/blockmanager.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/hw/mem/_vmem.cpp b/core/hw/mem/_vmem.cpp index 07be68087..71413b6c4 100644 --- a/core/hw/mem/_vmem.cpp +++ b/core/hw/mem/_vmem.cpp @@ -694,7 +694,7 @@ void _vmem_enable_mmu(bool enable) void _vmem_protect_vram(u32 addr, u32 size) { addr &= VRAM_MASK; - if (!mmu_enabled()) + if (!mmu_enabled() || !_nvmem_4gb_space()) { mem_region_lock(virt_ram_base + 0x04000000 + addr, size); // P0 //mem_region_lock(virt_ram_base + 0x06000000 + addr, size); // P0 - mirror @@ -728,7 +728,7 @@ void _vmem_protect_vram(u32 addr, u32 size) void _vmem_unprotect_vram(u32 addr, u32 size) { addr &= VRAM_MASK; - if (!mmu_enabled()) + if (!mmu_enabled() || !_nvmem_4gb_space()) { mem_region_unlock(virt_ram_base + 0x04000000 + addr, size); // P0 //mem_region_unlock(virt_ram_base + 0x06000000 + addr, size); // P0 - mirror diff --git a/core/hw/sh4/dyna/blockmanager.cpp b/core/hw/sh4/dyna/blockmanager.cpp index 18844836d..b1287dafc 100644 --- a/core/hw/sh4/dyna/blockmanager.cpp +++ b/core/hw/sh4/dyna/blockmanager.cpp @@ -434,7 +434,7 @@ void bm_Reset() static void bm_LockPage(u32 addr) { addr = addr & (RAM_MASK - PAGE_MASK); - if (!mmu_enabled()) + if (!mmu_enabled() || !_nvmem_4gb_space()) mem_region_lock(virt_ram_base + 0x0C000000 + addr, PAGE_SIZE); if (_nvmem_4gb_space()) { @@ -447,7 +447,7 @@ static void bm_LockPage(u32 addr) static void bm_UnlockPage(u32 addr) { addr = addr & (RAM_MASK - PAGE_MASK); - if (!mmu_enabled()) + if (!mmu_enabled() || !_nvmem_4gb_space()) mem_region_unlock(virt_ram_base + 0x0C000000 + addr, PAGE_SIZE); if (_nvmem_4gb_space()) { @@ -719,7 +719,7 @@ void RuntimeBlockInfo::Discard() void RuntimeBlockInfo::SetProtectedFlags() { // Don't write protect rom and BIOS/IP.BIN (Grandia II) - if (!IsOnRam(addr) || (vaddr & 0x1FFF0000) == 0x0c000000) + if (!IsOnRam(addr) || (addr & 0x1FFF0000) == 0x0c000000) { this->read_only = false; unprotected_blocks++; @@ -778,7 +778,7 @@ bool bm_RamWriteAccess(void *p) return false; } u32 addr = (u8*)p - virt_ram_base; - if (mmu_enabled() && (addr & 0x80000000) == 0) + if (mmu_enabled() && _nvmem_4gb_space() && (addr & 0x80000000) == 0) // If mmu enabled, let vmem32 manage user space // shouldn't be necessary since it's called first return false;