From 299af768e847fc5240ad05ff4144fe39111f41ce Mon Sep 17 00:00:00 2001 From: Eladash Date: Sat, 15 Feb 2020 08:56:57 +0200 Subject: [PATCH] HLE cellGcmSys: Make cellGcmAddressToOffset accurate --- rpcs3/Emu/Cell/Modules/cellGcmSys.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp b/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp index 9374112e68..5c2440a0c0 100644 --- a/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp @@ -891,26 +891,22 @@ error_code cellGcmAddressToOffset(u32 address, vm::ptr offset) { cellGcmSys.trace("cellGcmAddressToOffset(address=0x%x, offset=*0x%x)", address, offset); - // Address not on main memory or local memory - if (address >= 0xD0000000) - { - return CELL_GCM_ERROR_FAILURE; - } + const auto cfg = g_fxo->get(); u32 result; - // Address in local memory - if ((address >> 28) == 0xC) + // Test if address is within local memory + if (const u32 offs = address - cfg->local_addr; offs < cfg->local_size) { - result = address - rsx::constants::local_mem_base; + result = offs; } // Address in main memory else check else { - const u32 upper12Bits = g_fxo->get()->offsetTable.ioAddress[address >> 20]; + const u32 upper12Bits = cfg->offsetTable.ioAddress[address >> 20]; // If the address is mapped in IO - if (upper12Bits != 0xFFFF) + if (upper12Bits << 20 < rsx::get_current_renderer()->main_mem_size) { result = (upper12Bits << 20) | (address & 0xFFFFF); }