diff --git a/Utilities/GDBDebugServer.cpp b/Utilities/GDBDebugServer.cpp index 373aef10bb..8bba7e278d 100644 --- a/Utilities/GDBDebugServer.cpp +++ b/Utilities/GDBDebugServer.cpp @@ -4,7 +4,7 @@ #include "GDBDebugServer.h" #include "Log.h" #include -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "Emu/CPU/CPUThread.h" diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index 6b2789daf7..c30afa6ee0 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "Emu/Cell/RawSPUThread.h" diff --git a/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp b/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp index acec564bfd..ee14edba6e 100644 --- a/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp @@ -4,7 +4,7 @@ #include "Emu/Cell/PPUModule.h" #include "Emu/Cell/PPUOpcodes.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/RSX/GSRender.h" #include "cellGcmSys.h" @@ -37,6 +37,7 @@ struct CellGcmSysConfig { }; u64 system_mode = 0; +u32 reserved_size = 0; u32 local_size = 0; u32 local_addr = 0; @@ -68,6 +69,7 @@ u32 gcmGetLocalMemorySize(u32 sdk_version) } CellGcmOffsetTable offsetTable; +u16 IoMapTable[0xC00]; void InitOffsetTable() { @@ -76,6 +78,10 @@ void InitOffsetTable() memset(offsetTable.ioAddress.get_ptr(), 0xFF, 3072 * sizeof(u16)); memset(offsetTable.eaAddress.get_ptr(), 0xFF, 512 * sizeof(u16)); + memset(IoMapTable, 0, 3072 * sizeof(u16)); + + memset(RSXIOMem.ea, 0xFF, 512 * sizeof(u16)); + memset(RSXIOMem.io, 0xFF, 3072 * sizeof(u16)); } //---------------------------------------------------------------------------- @@ -364,15 +370,17 @@ s32 _cellGcmInitBody(vm::pptr context, u32 cmdSize, u32 ioSi cellGcmSys.warning("*** local memory(addr=0x%x, size=0x%x)", local_addr, local_size); InitOffsetTable(); + + const auto render = rsx::get_current_renderer(); if (system_mode == CELL_GCM_SYSTEM_MODE_IOMAP_512MB) { cellGcmSys.warning("cellGcmInit(): 512MB io address space used"); - RSXIOMem.SetRange(0, 0x20000000 /*512MB*/); + render->main_mem_size = 0x20000000; } else { cellGcmSys.warning("cellGcmInit(): 256MB io address space used"); - RSXIOMem.SetRange(0, 0x10000000 /*256MB*/); + render->main_mem_size = 0x10000000; } if (gcmMapEaIoAddress(ioAddress, 0, ioSize, false) != CELL_OK) @@ -430,7 +438,6 @@ s32 _cellGcmInitBody(vm::pptr context, u32 cmdSize, u32 ioSi ctrl.get = 0; ctrl.ref = -1; - const auto render = rsx::get_current_renderer(); render->intr_thread = idm::make_ptr("_gcm_intr_thread", 1, 0x4000); render->intr_thread->run(); render->main_mem_addr = 0; @@ -915,7 +922,7 @@ u32 cellGcmGetMaxIoMapSize() { cellGcmSys.trace("cellGcmGetMaxIoMapSize()"); - return RSXIOMem.GetSize() - RSXIOMem.GetReservedAmount(); + return rsx::get_current_renderer()->main_mem_size - reserved_size; } void cellGcmGetOffsetTable(vm::ptr table) @@ -945,24 +952,21 @@ s32 cellGcmIoOffsetToAddress(u32 ioOffset, vm::ptr address) s32 gcmMapEaIoAddress(u32 ea, u32 io, u32 size, bool is_strict) { - if ((ea & 0xFFFFF) || (io & 0xFFFFF) || (size & 0xFFFFF)) return CELL_GCM_ERROR_FAILURE; - - const auto render = rsx::get_current_renderer(); - - // Check if the mapping was successfull - if (RSXIOMem.Map(ea, size, io)) + if (!size || (ea & 0xFFFFF) || (io & 0xFFFFF) || (size & 0xFFFFF) + || rsx::get_current_renderer()->main_mem_size < io + size) { - // Fill the offset table - for (u32 i = 0; i<(size >> 20); i++) - { - offsetTable.ioAddress[(ea >> 20) + i] = (io >> 20) + i; - offsetTable.eaAddress[(io >> 20) + i] = (ea >> 20) + i; - } + return CELL_GCM_ERROR_FAILURE; } - else + + ea >>=20, io >>= 20, size >>= 20; + + IoMapTable[ea] = size; + + // Fill the offset table and map memory + for (u32 i = 0; i < size; i++) { - cellGcmSys.error("gcmMapEaIoAddress: CELL_GCM_ERROR_FAILURE"); - return CELL_GCM_ERROR_FAILURE; + RSXIOMem.io[ea + i] = offsetTable.ioAddress[ea + i] = io + i; + RSXIOMem.ea[io + i] = offsetTable.eaAddress[io + i] = ea + i; } return CELL_OK; @@ -1009,24 +1013,23 @@ s32 cellGcmMapMainMemory(u32 ea, u32 size, vm::ptr offset) if (!size || (ea & 0xFFFFF) || (size & 0xFFFFF)) return CELL_GCM_ERROR_FAILURE; // Use the offset table to find the next free io address - for (u32 io = RSXIOMem.GetRangeStart() >> 20, end = RSXIOMem.GetRangeEnd() >> 20, unmap_count = 1; io < end; unmap_count++) + for (u32 io = 0, end = (rsx::get_current_renderer()->main_mem_size - reserved_size) >> 20, unmap_count = 1; io < end; unmap_count++) { if (static_cast(offsetTable.eaAddress[io + unmap_count - 1]) < 0) { if (unmap_count >= (size >> 20)) { - io <<= 20; + *offset = io << 20; - RSXIOMem.Map(ea, size, io); - *offset = io; + ea >>= 20, size >>= 20; - io >>= 20, ea >>= 20; + IoMapTable[ea] = size; - //fill the offset table - for (u32 i = 0; i<(size >> 20); ++i) + // Fill the offset table and map memory + for (u32 i = 0; i < size; i++) { - offsetTable.ioAddress[ea + i] = io + i; - offsetTable.eaAddress[io + i] = ea + i; + RSXIOMem.io[ea + i] = offsetTable.ioAddress[ea + i] = io + i; + RSXIOMem.ea[io + i] = offsetTable.eaAddress[io + i] = ea + i; } return CELL_OK; @@ -1059,7 +1062,7 @@ s32 cellGcmReserveIoMapSize(u32 size) return CELL_GCM_ERROR_INVALID_VALUE; } - RSXIOMem.Reserve(size); + reserved_size += size; return CELL_OK; } @@ -1067,15 +1070,14 @@ s32 cellGcmUnmapEaIoAddress(u32 ea) { cellGcmSys.trace("cellGcmUnmapEaIoAddress(ea=0x%x)", ea); - u32 size; - if (RSXIOMem.UnmapRealAddress(ea, size)) + if (const u32 size = std::exchange(IoMapTable[ea >>= 20], 0)) { - const u32 io = offsetTable.ioAddress[ea >>= 20]; + const u32 io = offsetTable.ioAddress[ea]; - for (u32 i = 0; i < size >> 20; i++) + for (u32 i = 0; i < size; i++) { - offsetTable.ioAddress[ea + i] = 0xFFFF; - offsetTable.eaAddress[io + i] = 0xFFFF; + RSXIOMem.io[ea + i] = offsetTable.ioAddress[ea + i] = 0xFFFF; + RSXIOMem.ea[io + i] = offsetTable.eaAddress[io + i] = 0xFFFF; } } else @@ -1091,15 +1093,14 @@ s32 cellGcmUnmapIoAddress(u32 io) { cellGcmSys.trace("cellGcmUnmapIoAddress(io=0x%x)", io); - u32 size; - if (RSXIOMem.UnmapAddress(io, size)) + if (u32 size = std::exchange(IoMapTable[RSXIOMem.ea[io >>= 20]], 0)) { - const u32 ea = offsetTable.eaAddress[io >>= 20]; + const u32 ea = offsetTable.eaAddress[io]; - for (u32 i = 0; i < size >> 20; i++) + for (u32 i = 0; i < size; i++) { - offsetTable.ioAddress[ea + i] = 0xFFFF; - offsetTable.eaAddress[io + i] = 0xFFFF; + RSXIOMem.io[ea + i] = offsetTable.ioAddress[ea + i] = 0xFFFF; + RSXIOMem.ea[io + i] = offsetTable.eaAddress[io + i] = 0xFFFF; } } else @@ -1121,13 +1122,13 @@ s32 cellGcmUnreserveIoMapSize(u32 size) return CELL_GCM_ERROR_INVALID_ALIGNMENT; } - if (size > RSXIOMem.GetReservedAmount()) + if (size > reserved_size) { cellGcmSys.error("cellGcmUnreserveIoMapSize: CELL_GCM_ERROR_INVALID_VALUE"); return CELL_GCM_ERROR_INVALID_VALUE; } - RSXIOMem.Unreserve(size); + reserved_size -= size; return CELL_OK; } diff --git a/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp b/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp index fcb4531fb0..815a263b70 100644 --- a/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/IdManager.h" #include "Emu/System.h" #include "Emu/Cell/PPUModule.h" diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 2f972d7ac2..6a9d383ff6 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -3,7 +3,7 @@ #include "Utilities/sysinfo.h" #include "Utilities/JIT.h" #include "Crypto/sha1.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "PPUThread.h" diff --git a/rpcs3/Emu/Cell/RawSPUThread.cpp b/rpcs3/Emu/Cell/RawSPUThread.cpp index cffcdc7661..f74986c6be 100644 --- a/rpcs3/Emu/Cell/RawSPUThread.cpp +++ b/rpcs3/Emu/Cell/RawSPUThread.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "Loader/ELF.h" diff --git a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp index 9a3dd82c57..22a72e1ffb 100644 --- a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" diff --git a/rpcs3/Emu/Cell/SPUInterpreter.cpp b/rpcs3/Emu/Cell/SPUInterpreter.cpp index 2a26a26ffb..2398726ffd 100644 --- a/rpcs3/Emu/Cell/SPUInterpreter.cpp +++ b/rpcs3/Emu/Cell/SPUInterpreter.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Utilities/JIT.h" #include "Utilities/sysinfo.h" diff --git a/rpcs3/Emu/Cell/SPURecompiler.cpp b/rpcs3/Emu/Cell/SPURecompiler.cpp index 6747c255ec..e43d9ae7ab 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.cpp +++ b/rpcs3/Emu/Cell/SPURecompiler.cpp @@ -1,7 +1,7 @@ #include "stdafx.h" #include "Emu/System.h" #include "Emu/IdManager.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Crypto/sha1.h" #include "Utilities/StrUtil.h" diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index c21e10943c..b82cf5b63e 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -2,7 +2,7 @@ #include "Utilities/JIT.h" #include "Utilities/lockless.h" #include "Utilities/sysinfo.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_cond.cpp b/rpcs3/Emu/Cell/lv2/sys_cond.cpp index a6fa51ec45..37edec6038 100644 --- a/rpcs3/Emu/Cell/lv2/sys_cond.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_cond.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "Emu/IPC.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_dbg.cpp b/rpcs3/Emu/Cell/lv2/sys_dbg.cpp index cbe0320d56..f3952b59d1 100644 --- a/rpcs3/Emu/Cell/lv2/sys_dbg.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_dbg.cpp @@ -1,7 +1,7 @@ #include "stdafx.h" #include "Emu/Cell/ErrorCodes.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "sys_dbg.h" #include "Emu/Cell/Modules/sys_lv2dbg.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_event.cpp b/rpcs3/Emu/Cell/lv2/sys_event.cpp index aa1c34458b..a449e28b79 100644 --- a/rpcs3/Emu/Cell/lv2/sys_event.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_event.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "Emu/IPC.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp b/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp index a3f39831d1..0f03444c37 100644 --- a/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "Emu/IPC.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_fs.h b/rpcs3/Emu/Cell/lv2/sys_fs.h index 48f26cb23d..da785fd03a 100644 --- a/rpcs3/Emu/Cell/lv2/sys_fs.h +++ b/rpcs3/Emu/Cell/lv2/sys_fs.h @@ -1,6 +1,6 @@ #pragma once -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/Cell/ErrorCodes.h" // Open Flags diff --git a/rpcs3/Emu/Cell/lv2/sys_gamepad.cpp b/rpcs3/Emu/Cell/lv2/sys_gamepad.cpp index 72ccafadbd..b1af71a926 100644 --- a/rpcs3/Emu/Cell/lv2/sys_gamepad.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_gamepad.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_gpio.cpp b/rpcs3/Emu/Cell/lv2/sys_gpio.cpp index 46fc34f871..9ef52d6756 100644 --- a/rpcs3/Emu/Cell/lv2/sys_gpio.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_gpio.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_interrupt.cpp b/rpcs3/Emu/Cell/lv2/sys_interrupt.cpp index 9e0a068c31..4685248345 100644 --- a/rpcs3/Emu/Cell/lv2/sys_interrupt.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_interrupt.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_lwcond.cpp b/rpcs3/Emu/Cell/lv2/sys_lwcond.cpp index 36cb6071a6..ada6da2861 100644 --- a/rpcs3/Emu/Cell/lv2/sys_lwcond.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_lwcond.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_lwmutex.cpp b/rpcs3/Emu/Cell/lv2/sys_lwmutex.cpp index 4416d98ae6..cc0137bf8e 100644 --- a/rpcs3/Emu/Cell/lv2/sys_lwmutex.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_lwmutex.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_memory.h b/rpcs3/Emu/Cell/lv2/sys_memory.h index e1e0b72c9a..95baffab11 100644 --- a/rpcs3/Emu/Cell/lv2/sys_memory.h +++ b/rpcs3/Emu/Cell/lv2/sys_memory.h @@ -1,6 +1,6 @@ #pragma once -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/Cell/ErrorCodes.h" #include "Emu/IdManager.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_mutex.cpp b/rpcs3/Emu/Cell/lv2/sys_mutex.cpp index 97238cae56..9801912ebd 100644 --- a/rpcs3/Emu/Cell/lv2/sys_mutex.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_mutex.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "Emu/IPC.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_net.cpp b/rpcs3/Emu/Cell/lv2/sys_net.cpp index a4763f4c97..55ac7d89a2 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "Emu/Cell/PPUThread.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp b/rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp index bf00d5a089..9cedff77d9 100644 --- a/rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_process.cpp b/rpcs3/Emu/Cell/lv2/sys_process.cpp index 3d56e03a1b..1f3f5b7acc 100644 --- a/rpcs3/Emu/Cell/lv2/sys_process.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_process.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_prx.cpp b/rpcs3/Emu/Cell/lv2/sys_prx.cpp index 0392657812..6422aaf098 100644 --- a/rpcs3/Emu/Cell/lv2/sys_prx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_prx.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "Crypto/unself.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_rsx.cpp b/rpcs3/Emu/Cell/lv2/sys_rsx.cpp index 45a7060960..c45e8d8cbc 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rsx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_rsx.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/Cell/PPUModule.h" #include "Emu/RSX/GSRender.h" @@ -124,10 +124,13 @@ s32 sys_rsx_context_allocate(vm::ptr context_id, vm::ptr lpar_dma_cont dmaControl.put = 0; dmaControl.ref = 0xFFFFFFFF; + memset(RSXIOMem.ea, 0xFF, 512 * sizeof(u16)); + memset(RSXIOMem.io, 0xFF, 3072 * sizeof(u16)); + if (false/*system_mode == CELL_GCM_SYSTEM_MODE_IOMAP_512MB*/) - RSXIOMem.SetRange(0, 0x20000000 /*512MB*/); + rsx::get_current_renderer()->main_mem_size = 0x20000000; //512MB else - RSXIOMem.SetRange(0, 0x10000000 /*256MB*/); + rsx::get_current_renderer()->main_mem_size = 0x10000000; //256MB sys_event_queue_attribute_t attr; attr.protocol = SYS_SYNC_PRIORITY; @@ -175,26 +178,46 @@ s32 sys_rsx_context_iomap(u32 context_id, u32 io, u32 ea, u32 size, u64 flags) { sys_rsx.warning("sys_rsx_context_iomap(context_id=0x%x, io=0x%x, ea=0x%x, size=0x%x, flags=0x%llx)", context_id, io, ea, size, flags); - if (!RSXIOMem.Map(ea, size, io)) + if (!size || io & 0xFFFFF || ea & 0xFFFFF || size & 0xFFFFF + || rsx::get_current_renderer()->main_mem_size < io + size) { return CELL_EINVAL; } + io >>= 20, ea >>= 20, size >>= 20; + + for (u32 i = 0; i < size; i++) + { + RSXIOMem.io[ea + i] = io + i; + RSXIOMem.ea[io + i] = ea + i; + } + return CELL_OK; } /* * lv2 SysCall 673 (0x2A1): sys_rsx_context_iounmap * @param context_id (IN): RSX context, E.g. 0x55555555 (in vsh.self) - * @param io_addr (IN): IO address. E.g. 0x00600000 (Start page 6) + * @param io (IN): IO address. E.g. 0x00600000 (Start page 6) * @param size (IN): Size to unmap in byte. E.g. 0x00200000 */ -s32 sys_rsx_context_iounmap(u32 context_id, u32 io_addr, u32 size) +s32 sys_rsx_context_iounmap(u32 context_id, u32 io, u32 size) { - sys_rsx.warning("sys_rsx_context_iounmap(context_id=0x%x, io_addr=0x%x, size=0x%x)", context_id, io_addr, size); - if (RSXIOMem.UnmapAddress(io_addr, size)) - return CELL_OK; - return CELL_EINVAL; + sys_rsx.warning("sys_rsx_context_iounmap(context_id=0x%x, io=0x%x, size=0x%x)", context_id, io, size); + + if (!size || rsx::get_current_renderer()->main_mem_size < io + size) + { + return CELL_EINVAL; + } + + const u32 end = (io >>= 20) + (size >>= 20); + for (u32 ea = RSXIOMem.ea[io]; io < end;) + { + RSXIOMem.io[ea++] = 0xFFFF; + RSXIOMem.ea[io++] = 0xFFFF; + } + + return CELL_OK; } /* diff --git a/rpcs3/Emu/Cell/lv2/sys_rsx.h b/rpcs3/Emu/Cell/lv2/sys_rsx.h index 0cbea30da7..61cb076b81 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rsx.h +++ b/rpcs3/Emu/Cell/lv2/sys_rsx.h @@ -114,7 +114,7 @@ s32 sys_rsx_memory_free(u32 mem_handle); s32 sys_rsx_context_allocate(vm::ptr context_id, vm::ptr lpar_dma_control, vm::ptr lpar_driver_info, vm::ptr lpar_reports, u64 mem_ctx, u64 system_mode); s32 sys_rsx_context_free(u32 context_id); s32 sys_rsx_context_iomap(u32 context_id, u32 io, u32 ea, u32 size, u64 flags); -s32 sys_rsx_context_iounmap(u32 context_id, u32 io_addr, u32 size); +s32 sys_rsx_context_iounmap(u32 context_id, u32 io, u32 size); s32 sys_rsx_context_attribute(s32 context_id, u32 package_id, u64 a3, u64 a4, u64 a5, u64 a6); s32 sys_rsx_device_map(vm::ptr dev_addr, vm::ptr a2, u32 dev_id); s32 sys_rsx_device_unmap(u32 dev_id); diff --git a/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp b/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp index 632639547c..9a83fbe559 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "Emu/IPC.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_semaphore.cpp b/rpcs3/Emu/Cell/lv2/sys_semaphore.cpp index 324cdfdd95..bc0766248d 100644 --- a/rpcs3/Emu/Cell/lv2/sys_semaphore.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_semaphore.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "Emu/IPC.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_spu.cpp b/rpcs3/Emu/Cell/lv2/sys_spu.cpp index 0be6ae9aa4..eb4c4e24d9 100644 --- a/rpcs3/Emu/Cell/lv2/sys_spu.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_spu.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "Crypto/unself.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_ss.h b/rpcs3/Emu/Cell/lv2/sys_ss.h index 0a13195c6d..c70649380e 100644 --- a/rpcs3/Emu/Cell/lv2/sys_ss.h +++ b/rpcs3/Emu/Cell/lv2/sys_ss.h @@ -1,6 +1,6 @@ #pragma once -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/Cell/ErrorCodes.h" struct CellSsOpenPSID diff --git a/rpcs3/Emu/Cell/lv2/sys_time.cpp b/rpcs3/Emu/Cell/lv2/sys_time.cpp index bf5cbaafe9..c99bc94256 100644 --- a/rpcs3/Emu/Cell/lv2/sys_time.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_time.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/Cell/ErrorCodes.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_timer.cpp b/rpcs3/Emu/Cell/lv2/sys_timer.cpp index b7040f3ee8..a71da1a9ce 100644 --- a/rpcs3/Emu/Cell/lv2/sys_timer.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_timer.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_trace.cpp b/rpcs3/Emu/Cell/lv2/sys_trace.cpp index e24a8c32c9..9dc76af187 100644 --- a/rpcs3/Emu/Cell/lv2/sys_trace.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_trace.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/Cell/ErrorCodes.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_tty.h b/rpcs3/Emu/Cell/lv2/sys_tty.h index fdf0214ecf..5fc616d51f 100644 --- a/rpcs3/Emu/Cell/lv2/sys_tty.h +++ b/rpcs3/Emu/Cell/lv2/sys_tty.h @@ -1,6 +1,6 @@ #pragma once -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/Cell/ErrorCodes.h" // TTY channels diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp index c3a8c2ed07..9195bd9994 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/Cell/ErrorCodes.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_vm.h b/rpcs3/Emu/Cell/lv2/sys_vm.h index 2942bf22c6..bfee507e8d 100644 --- a/rpcs3/Emu/Cell/lv2/sys_vm.h +++ b/rpcs3/Emu/Cell/lv2/sys_vm.h @@ -1,6 +1,6 @@ #pragma once -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/Cell/ErrorCodes.h" #include "Emu/IdManager.h" diff --git a/rpcs3/Emu/Memory/Memory.cpp b/rpcs3/Emu/Memory/Memory.cpp deleted file mode 100644 index 02c3b365e2..0000000000 --- a/rpcs3/Emu/Memory/Memory.cpp +++ /dev/null @@ -1,136 +0,0 @@ -#include "stdafx.h" -#include "Memory.h" - -VirtualMemoryBlock RSXIOMem; - -VirtualMemoryBlock* VirtualMemoryBlock::SetRange(const u32 start, const u32 size) -{ - m_range_start = start; - m_range_size = size; - - return this; -} - -bool VirtualMemoryBlock::IsInMyRange(const u32 addr, const u32 size) -{ - return addr >= m_range_start && addr + size <= m_range_start + m_range_size - GetReservedAmount(); -} - -bool VirtualMemoryBlock::Map(u32 realaddr, u32 size, u32 addr) -{ - if (!size || !IsInMyRange(addr, size)) - { - return false; - } - - m_mapped_memory.emplace_back(addr, realaddr, size); - return true; -} - -bool VirtualMemoryBlock::UnmapRealAddress(u32 realaddr, u32& size) -{ - for (u32 i = 0; i= m_mapped_memory[i].addr && addr < m_mapped_memory[i].addr + m_mapped_memory[i].size) - { - result = m_mapped_memory[i].realAddress + (addr - m_mapped_memory[i].addr); - return true; - } - } - - return false; -} - -s32 VirtualMemoryBlock::getMappedAddress(u32 realAddress) -{ - for (u32 i = 0; i= m_mapped_memory[i].realAddress && realAddress < m_mapped_memory[i].realAddress + m_mapped_memory[i].size) - { - return m_mapped_memory[i].addr + (realAddress - m_mapped_memory[i].realAddress); - } - } - - return -1; -} - -bool VirtualMemoryBlock::Reserve(u32 size) -{ - if (size + GetReservedAmount() > m_range_size) - return false; - - m_reserve_size += size; - return true; -} - -bool VirtualMemoryBlock::Unreserve(u32 size) -{ - if (size > GetReservedAmount()) - return false; - - m_reserve_size -= size; - return true; -} - -u32 VirtualMemoryBlock::GetReservedAmount() -{ - return m_reserve_size; -} - -u32 VirtualMemoryBlock::GetRangeStart() -{ - return m_range_start; -} - -u32 VirtualMemoryBlock::GetRangeEnd() -{ - return m_range_start + m_range_size - GetReservedAmount(); -} diff --git a/rpcs3/Emu/Memory/Memory.h b/rpcs3/Emu/Memory/Memory.h deleted file mode 100644 index a3348c8790..0000000000 --- a/rpcs3/Emu/Memory/Memory.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#include "MemoryBlock.h" - -extern VirtualMemoryBlock RSXIOMem; - -#include "vm.h" diff --git a/rpcs3/Emu/Memory/MemoryBlock.h b/rpcs3/Emu/Memory/MemoryBlock.h deleted file mode 100644 index 53ad84e21e..0000000000 --- a/rpcs3/Emu/Memory/MemoryBlock.h +++ /dev/null @@ -1,101 +0,0 @@ -#pragma once - -struct MemInfo -{ - u32 addr; - u32 size; - - MemInfo(u32 addr, u32 size) - : addr(addr) - , size(size) - { - } - - MemInfo() - : addr(0) - , size(0) - { - } -}; - -struct VirtualMemInfo : public MemInfo -{ - u32 realAddress; - - VirtualMemInfo(u32 addr, u32 realaddr, u32 size) - : MemInfo(addr, size) - , realAddress(realaddr) - { - } - - VirtualMemInfo() - : MemInfo(0, 0) - , realAddress(0) - { - } -}; - -class VirtualMemoryBlock -{ - std::vector m_mapped_memory; - u32 m_reserve_size = 0; - u32 m_range_start = 0; - u32 m_range_size = 0; - -public: - VirtualMemoryBlock() = default; - - VirtualMemoryBlock* SetRange(const u32 start, const u32 size); - void Clear() { m_mapped_memory.clear(); m_reserve_size = 0; m_range_start = 0; m_range_size = 0; } - u32 GetStartAddr() const { return m_range_start; } - u32 GetSize() const { return m_range_size; } - bool IsInMyRange(const u32 addr, const u32 size); - - // maps real address to virtual address space - bool Map(u32 realaddr, u32 size, u32 addr); - - // Unmap real address (please specify only starting point, no midway memory will be unmapped), returns the size of the unmapped area - bool UnmapRealAddress(u32 realaddr, u32& size); - - // Unmap address (please specify only starting point, no midway memory will be unmapped), returns the size of the unmapped area - bool UnmapAddress(u32 addr, u32& size); - - // Reserve a certain amount so no one can use it, returns true on success, false on failure - bool Reserve(u32 size); - - // Unreserve a certain amount of bytes, returns true on success, false if size is bigger than the reserved amount - bool Unreserve(u32 size); - - // Return the total amount of reserved memory - u32 GetReservedAmount(); - - // Return the start of the mapped space - u32 GetRangeStart(); - - // Return the end of the mapped space - u32 GetRangeEnd(); - - bool Read32(const u32 addr, u32* value); - - bool Write32(const u32 addr, const u32 value); - - // try to get the real address given a mapped address - // return true for success - bool getRealAddr(u32 addr, u32& result); - - u32 RealAddr(u32 addr) - { - u32 realAddr = 0; - - if (!getRealAddr(addr, realAddr)) - { - LOG_ERROR(HLE, "Getting the real address failed. (addr=0x%x)", addr); - return 0; - } - - return realAddr; - } - - // return the mapped address given a real address, if not mapped return minus one - s32 getMappedAddress(u32 realAddress); -}; diff --git a/rpcs3/Emu/Memory/vm.cpp b/rpcs3/Emu/Memory/vm.cpp index 94b50827c9..f45f0fc914 100644 --- a/rpcs3/Emu/Memory/vm.cpp +++ b/rpcs3/Emu/Memory/vm.cpp @@ -1,5 +1,4 @@ #include "stdafx.h" -#include "Memory.h" #include "Emu/System.h" #include "Utilities/mutex.h" #include "Utilities/cond.h" diff --git a/rpcs3/Emu/RSX/Capture/rsx_capture.cpp b/rpcs3/Emu/RSX/Capture/rsx_capture.cpp index 4d9b037690..72d5087606 100644 --- a/rpcs3/Emu/RSX/Capture/rsx_capture.cpp +++ b/rpcs3/Emu/RSX/Capture/rsx_capture.cpp @@ -5,7 +5,7 @@ #include "Emu/RSX/Common/surface_store.h" #include "Emu/RSX/GCM.h" #include "Emu/RSX/RSXThread.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "xxhash.h" diff --git a/rpcs3/Emu/RSX/Capture/rsx_replay.cpp b/rpcs3/Emu/RSX/Capture/rsx_replay.cpp index adc68ee8c9..963a0293f6 100644 --- a/rpcs3/Emu/RSX/Capture/rsx_replay.cpp +++ b/rpcs3/Emu/RSX/Capture/rsx_replay.cpp @@ -3,7 +3,7 @@ #include "Emu/System.h" #include "Emu/Cell/lv2/sys_rsx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/RSX/GSRender.h" #include @@ -104,12 +104,12 @@ namespace rsx fmt::throw_exception("Capture Replay: no space in io for fifo commands! size: 0x%x, lowest in capture: 0x%x, largest_free_block: 0x%x", fifo_size, lowest_iooffset, largest_free_block); } - return std::make_tuple(fifo_start_addr, fifo_size); + return std::make_tuple(fifo_start_addr, ::align(fifo_size, 0x100000)); } std::vector rsx_replay_thread::alloc_write_fifo(be_t context_id, u32 fifo_start_addr, u32 fifo_size) { - const u32 fifo_mem = vm::alloc(fifo_size, vm::main); + const u32 fifo_mem = vm::alloc(fifo_size, vm::main, 0x100000); if (fifo_mem == 0) fmt::throw_exception("Capture Replay: fifo alloc failed! size: 0x%x", fifo_size); @@ -282,7 +282,7 @@ namespace rsx if (memblock.ioOffset <= fifo_start_addr + fifo_size && fifo_start_addr <= memblock.size + memblock.offset) fmt::throw_exception("Capture Replay: overlap detected between game io allocs and fifo alloc, algorithms botched."); - if (sys_rsx_context_iomap(context_id, memblock.ioOffset, memblock.addr, memblock.size + memblock.offset, 0) != CELL_OK) + if (sys_rsx_context_iomap(context_id, memblock.ioOffset & ~0xFFFFF, memblock.addr & ~0xFFFFF, ::align(memblock.size + memblock.offset, 0x100000), 0) != CELL_OK) fmt::throw_exception("rsx io map failed for block"); } diff --git a/rpcs3/Emu/RSX/CgBinaryProgram.h b/rpcs3/Emu/RSX/CgBinaryProgram.h index 921bf96e3c..0bf39197fa 100644 --- a/rpcs3/Emu/RSX/CgBinaryProgram.h +++ b/rpcs3/Emu/RSX/CgBinaryProgram.h @@ -1,6 +1,6 @@ #pragma once #include -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/RSX/GL/GLVertexProgram.h" #include "Emu/RSX/GL/GLFragmentProgram.h" diff --git a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp index 6df1b3fbde..f12d99db57 100644 --- a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "FragmentProgramDecompiler.h" diff --git a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp index 7784a2a655..88b8cadf4e 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp @@ -3,7 +3,7 @@ #include "stdafx_d3d12.h" #include "D3D12FragmentProgramDecompiler.h" #include "D3D12CommonDecompiler.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index b91bff22ab..5478f7763e 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -1,7 +1,7 @@ #pragma once #include "D3D12Utils.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/RSX/GSRender.h" diff --git a/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp b/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp index bbea11ddb0..847e6f82cf 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp @@ -2,7 +2,7 @@ #include "stdafx.h" #include "stdafx_d3d12.h" #include "D3D12RenderTargetSets.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/RSX/GSRender.h" #include "../rsx_methods.h" diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index 5545eaeb16..ca6439a2e6 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -1,6 +1,6 @@ #include "stdafx.h" #include -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "GLFragmentProgram.h" #include "../Common/ProgramStateCache.h" diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 8df37b8fea..150c2c490c 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "GLGSRender.h" #include "GLVertexProgram.h" diff --git a/rpcs3/Emu/RSX/GSRender.cpp b/rpcs3/Emu/RSX/GSRender.cpp index 888b704e78..143cdeb4c4 100644 --- a/rpcs3/Emu/RSX/GSRender.cpp +++ b/rpcs3/Emu/RSX/GSRender.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "GSRender.h" diff --git a/rpcs3/Emu/RSX/RSXTexture.cpp b/rpcs3/Emu/RSX/RSXTexture.cpp index 3673083ad9..b984efd570 100644 --- a/rpcs3/Emu/RSX/RSXTexture.cpp +++ b/rpcs3/Emu/RSX/RSXTexture.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "RSXThread.h" #include "RSXTexture.h" #include "rsx_methods.h" diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 646956078f..5331f3fbdb 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "RSXThread.h" @@ -28,6 +28,7 @@ class GSRender; bool user_asked_for_frame_capture = false; rsx::frame_trace_data frame_debug; rsx::frame_capture_data frame_capture; +RSXIOTable RSXIOMem; extern CellGcmOffsetTable offsetTable; @@ -613,29 +614,28 @@ namespace rsx // Validate put and get registers before reading the command // TODO: Who should handle graphics exceptions?? u32 cmd; + + if (u32 addr = RSXIOMem.RealAddr(internal_get)) { - u32 get_address; + cmd = vm::read32(addr); + } + else + { + LOG_ERROR(RSX, "Invalid FIFO queue get/put registers found, get=0x%X, put=0x%X", internal_get.load(), put); - if (!RSXIOMem.getRealAddr(internal_get, get_address)) + if (mem_faults_count >= 3) { - LOG_ERROR(RSX, "Invalid FIFO queue get/put registers found, get=0x%X, put=0x%X", internal_get.load(), put); - - if (mem_faults_count >= 3) - { - LOG_ERROR(RSX, "Application has failed to recover, resetting FIFO queue"); - internal_get = restore_point.load(); - m_return_addr = restore_ret_addr; - } - else - { - mem_faults_count++; - std::this_thread::sleep_for(10ms); - } - - continue; + LOG_ERROR(RSX, "Application has failed to recover, resetting FIFO queue"); + internal_get = restore_point.load(); + m_return_addr = restore_ret_addr; + } + else + { + mem_faults_count++; + std::this_thread::sleep_for(10ms); } - cmd = vm::read32(get_address); + continue; } const u32 count = (cmd >> 18) & 0x7ff; @@ -1977,22 +1977,22 @@ namespace rsx u32 thread::ReadIO32(u32 addr) { - u32 value; - - if (!RSXIOMem.Read32(addr, &value)) + if (u32 ea = RSXIOMem.RealAddr(addr)) { - fmt::throw_exception("%s(addr=0x%x): RSXIO memory not mapped" HERE, __FUNCTION__, addr); + return vm::read32(ea); } - return value; + fmt::throw_exception("%s(addr=0x%x): RSXIO memory not mapped" HERE, __FUNCTION__, addr); } void thread::WriteIO32(u32 addr, u32 value) { - if (!RSXIOMem.Write32(addr, value)) + if (u32 ea = RSXIOMem.RealAddr(addr)) { - fmt::throw_exception("%s(addr=0x%x): RSXIO memory not mapped" HERE, __FUNCTION__, addr); + return vm::write32(ea, value); } + + fmt::throw_exception("%s(addr=0x%x): RSXIO memory not mapped" HERE, __FUNCTION__, addr); } std::pair thread::calculate_memory_requirements(const vertex_input_layout& layout, u32 vertex_count) @@ -2422,30 +2422,31 @@ namespace rsx void thread::on_notify_memory_unmapped(u32 base_address, u32 size) { + if (!m_rsx_thread_exiting && base_address < 0xC0000000) { - s32 io_addr = RSXIOMem.getMappedAddress(base_address); - if (io_addr >= 0) + u32 ea = base_address >> 20, io = RSXIOMem.io[ea]; + + if (io < 512) { if (!isHLE) { - const u64 unmap_key = u64((1ull << (size >> 20)) - 1) << ((io_addr >> 20) & 0x3f); - const u64 gcm_flag = 0x100000000ull << (io_addr >> 26); + const u64 unmap_key = u64((1ull << (size >> 20)) - 1) << (io & 0x3f); + const u64 gcm_flag = 0x100000000ull << (io >> 6); sys_event_port_send(fxm::get()->rsx_event_port, 0, gcm_flag, unmap_key); } else { - const u32 end = (base_address + size) >> 20; - for (base_address >>= 20, io_addr >>= 20; base_address < end;) + for (const u32 end = ea + (size >> 20); ea < end;) { - offsetTable.ioAddress[base_address++] = 0xFFFF; - offsetTable.eaAddress[io_addr++] = 0xFFFF; + offsetTable.ioAddress[ea++] = 0xFFFF; + offsetTable.eaAddress[io++] = 0xFFFF; } } } - } - writer_lock lock(m_mtx_task); - m_invalidated_memory_ranges.push_back({ base_address, size }); + writer_lock lock(m_mtx_task); + m_invalidated_memory_ranges.push_back({ base_address, size }); + } } //Pause/cont wrappers for FIFO ctrl. Never call this from rsx thread itself! diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 6393cd56e4..16cf1309c0 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -27,9 +27,35 @@ extern u64 get_system_time(); +struct RSXIOTable +{ + u16 ea[512]; + u16 io[3072]; + + // try to get the real address given a mapped address + // return non zero on success + inline u32 RealAddr(u32 offs) + { + if (offs & 0xE0000000) + { + return 0; // offset is beyond the limit + } + + const s32 upper = this->ea[offs >> 20] << 20; + + if (upper < 0) + { + return 0; + } + + return upper | (offs & 0xFFFFF); + } +}; + extern bool user_asked_for_frame_capture; extern rsx::frame_trace_data frame_debug; extern rsx::frame_capture_data frame_capture; +extern RSXIOTable RSXIOMem; namespace rsx { @@ -278,7 +304,7 @@ namespace rsx std::shared_ptr m_decompiler_thread; protected: - atomic_t m_rsx_thread_exiting{false}; + atomic_t m_rsx_thread_exiting{true}; s32 m_return_addr{-1}, restore_ret_addr{-1}; std::array vertex_push_buffers; std::vector element_push_buffer; @@ -354,7 +380,7 @@ namespace rsx u32 ctxt_addr; u32 label_addr; - u32 local_mem_addr, main_mem_addr; + u32 local_mem_addr, main_mem_addr, main_mem_size{0}; bool m_rtts_dirty; bool m_textures_dirty[16]; diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index c254961476..a0f14d39ce 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "VKFragmentProgram.h" diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 3f3747f0ce..4e867408ed 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "VKGSRender.h" #include "../rsx_methods.h" diff --git a/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp b/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp index 403a333d01..9aafef0e29 100644 --- a/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp +++ b/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "VKGSRender.h" #include "../rsx_methods.h" diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index c06aa2e696..45c6128d46 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -1,7 +1,7 @@ #include "stdafx.h" #include "rsx_methods.h" #include "RSXThread.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "rsx_utils.h" #include "rsx_decode.h" diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index dd38ce7087..430d8e3636 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -1,6 +1,6 @@ #include "stdafx.h" #include "Utilities/bin_patch.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/Cell/PPUThread.h" @@ -1403,7 +1403,6 @@ void Emulator::Stop(bool restart) LOG_NOTICE(GENERAL, "Objects cleared..."); - RSXIOMem.Clear(); vm::close(); if (do_exit) diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 9429745954..e6b9b18a9b 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -327,9 +327,6 @@ - - $(IntDir)OldMemory.obj - @@ -546,8 +543,6 @@ - - diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index d8f1fbd98f..82d37b991e 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -116,9 +116,6 @@ Emu\Audio - - Emu\Memory - Emu\Memory @@ -838,12 +835,6 @@ Emu\Audio - - Emu\Memory - - - Emu\Memory - Loader diff --git a/rpcs3/rpcs3qt/auto_pause_settings_dialog.h b/rpcs3/rpcs3qt/auto_pause_settings_dialog.h index 62afb65769..51a637feb0 100644 --- a/rpcs3/rpcs3qt/auto_pause_settings_dialog.h +++ b/rpcs3/rpcs3qt/auto_pause_settings_dialog.h @@ -2,7 +2,7 @@ #include "stdafx.h" #include "Emu/System.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "table_item_delegate.h" #include diff --git a/rpcs3/rpcs3qt/debugger_frame.h b/rpcs3/rpcs3qt/debugger_frame.h index 7d6ba85248..4794fc036c 100644 --- a/rpcs3/rpcs3qt/debugger_frame.h +++ b/rpcs3/rpcs3qt/debugger_frame.h @@ -1,7 +1,7 @@ #pragma once #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "Emu/CPU/CPUThread.h" diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 8850863fff..5c3fa13f2e 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -4,7 +4,7 @@ #include "table_item_delegate.h" #include "custom_table_widget_item.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Loader/PSF.h" #include "Utilities/types.h" diff --git a/rpcs3/rpcs3qt/instruction_editor_dialog.h b/rpcs3/rpcs3qt/instruction_editor_dialog.h index bb8d3eda65..90b66e13bb 100644 --- a/rpcs3/rpcs3qt/instruction_editor_dialog.h +++ b/rpcs3/rpcs3qt/instruction_editor_dialog.h @@ -2,7 +2,7 @@ #include "stdafx.h" #include "Emu/System.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/CPU/CPUThread.h" #include "Emu/CPU/CPUDisAsm.h" #include "Emu/Cell/PPUThread.h" diff --git a/rpcs3/rpcs3qt/kernel_explorer.cpp b/rpcs3/rpcs3qt/kernel_explorer.cpp index a02eae4a09..8b2cf3ccb6 100644 --- a/rpcs3/rpcs3qt/kernel_explorer.cpp +++ b/rpcs3/rpcs3qt/kernel_explorer.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 6072ae36b4..b369db2714 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -37,7 +37,7 @@ #include "stdafx.h" #include "Emu/System.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Crypto/unpkg.h" #include "Crypto/unself.h" diff --git a/rpcs3/rpcs3qt/memory_string_searcher.h b/rpcs3/rpcs3qt/memory_string_searcher.h index d7e9aa946e..12949299a7 100644 --- a/rpcs3/rpcs3qt/memory_string_searcher.h +++ b/rpcs3/rpcs3qt/memory_string_searcher.h @@ -1,7 +1,7 @@ #pragma once #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include diff --git a/rpcs3/rpcs3qt/memory_viewer_panel.cpp b/rpcs3/rpcs3qt/memory_viewer_panel.cpp index a8f59a3f37..b94ab4954d 100644 --- a/rpcs3/rpcs3qt/memory_viewer_panel.cpp +++ b/rpcs3/rpcs3qt/memory_viewer_panel.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "memory_viewer_panel.h" diff --git a/rpcs3/rpcs3qt/msg_dialog_frame.h b/rpcs3/rpcs3qt/msg_dialog_frame.h index b3f388bf3b..f4c171852b 100644 --- a/rpcs3/rpcs3qt/msg_dialog_frame.h +++ b/rpcs3/rpcs3qt/msg_dialog_frame.h @@ -4,7 +4,7 @@ #include "Emu/Memory/vm.h" #include "Emu/Cell/Modules/cellMsgDialog.h" #include "Emu/System.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/Cell/lv2/sys_time.h" #include diff --git a/rpcs3/rpcs3qt/rsx_debugger.cpp b/rpcs3/rpcs3qt/rsx_debugger.cpp index b454d69a37..ed5956359e 100644 --- a/rpcs3/rpcs3qt/rsx_debugger.cpp +++ b/rpcs3/rpcs3qt/rsx_debugger.cpp @@ -215,8 +215,7 @@ rsx_debugger::rsx_debugger(std::shared_ptr gui_settings, QWidget* { if (const auto render = rsx::get_current_renderer()) { - u32 realAddr; - if (RSXIOMem.getRealAddr(render->ctrl->get.load(), realAddr)) + if (u32 realAddr = RSXIOMem.RealAddr(render->ctrl->get.load())) { m_addr = realAddr; UpdateInformation(); @@ -227,8 +226,7 @@ rsx_debugger::rsx_debugger(std::shared_ptr gui_settings, QWidget* { if (const auto render = rsx::get_current_renderer()) { - u32 realAddr; - if (RSXIOMem.getRealAddr(render->ctrl->put.load(), realAddr)) + if (u32 realAddr = RSXIOMem.RealAddr(render->ctrl->put.load())) { m_addr = realAddr; UpdateInformation(); diff --git a/rpcs3/rpcs3qt/rsx_debugger.h b/rpcs3/rpcs3qt/rsx_debugger.h index a945c7c7df..a40d377717 100644 --- a/rpcs3/rpcs3qt/rsx_debugger.h +++ b/rpcs3/rpcs3qt/rsx_debugger.h @@ -2,7 +2,7 @@ #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "Emu/RSX/GSRender.h" diff --git a/rpcs3/rpcs3qt/save_data_dialog.h b/rpcs3/rpcs3qt/save_data_dialog.h index 8c2cea36c7..c0db209e19 100644 --- a/rpcs3/rpcs3qt/save_data_dialog.h +++ b/rpcs3/rpcs3qt/save_data_dialog.h @@ -1,7 +1,7 @@ #pragma once #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/Cell/Modules/cellSaveData.h" class save_data_dialog : public SaveDialogBase diff --git a/rpcs3/rpcs3qt/save_data_info_dialog.h b/rpcs3/rpcs3qt/save_data_info_dialog.h index ae4e79f972..5f72c18bfe 100644 --- a/rpcs3/rpcs3qt/save_data_info_dialog.h +++ b/rpcs3/rpcs3qt/save_data_info_dialog.h @@ -2,7 +2,7 @@ // I just want the struct for the save data. #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/Cell/Modules/cellSaveData.h" #include diff --git a/rpcs3/rpcs3qt/save_data_list_dialog.h b/rpcs3/rpcs3qt/save_data_list_dialog.h index 27dd466387..4273eaa22d 100644 --- a/rpcs3/rpcs3qt/save_data_list_dialog.h +++ b/rpcs3/rpcs3qt/save_data_list_dialog.h @@ -3,7 +3,7 @@ // I just want the struct for the save data. #include "stdafx.h" #include "Emu/System.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/Cell/Modules/cellSaveData.h" #include "gui_settings.h" diff --git a/rpcs3/rpcs3qt/save_manager_dialog.h b/rpcs3/rpcs3qt/save_manager_dialog.h index 25d0ddd7dd..4671b49f32 100644 --- a/rpcs3/rpcs3qt/save_manager_dialog.h +++ b/rpcs3/rpcs3qt/save_manager_dialog.h @@ -1,7 +1,7 @@ #pragma once #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/Cell/Modules/cellSaveData.h" #include "gui_settings.h" diff --git a/rpcs3/rpcs3qt/trophy_manager_dialog.cpp b/rpcs3/rpcs3qt/trophy_manager_dialog.cpp index de70349806..e800d1520b 100644 --- a/rpcs3/rpcs3qt/trophy_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/trophy_manager_dialog.cpp @@ -11,7 +11,7 @@ #include "rpcs3/Emu/VFS.h" #include "Emu/System.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/Cell/Modules/sceNpTrophy.h" #include "yaml-cpp/yaml.h" diff --git a/rpcs3/rpcs3qt/trophy_notification_frame.h b/rpcs3/rpcs3qt/trophy_notification_frame.h index 135729d816..31b650e0ed 100644 --- a/rpcs3/rpcs3qt/trophy_notification_frame.h +++ b/rpcs3/rpcs3qt/trophy_notification_frame.h @@ -1,7 +1,7 @@ #pragma once #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/Cell/Modules/sceNpTrophy.h" #include diff --git a/rpcs3/rpcs3qt/trophy_notification_helper.h b/rpcs3/rpcs3qt/trophy_notification_helper.h index 4f3849e98c..4a585a4ffa 100644 --- a/rpcs3/rpcs3qt/trophy_notification_helper.h +++ b/rpcs3/rpcs3qt/trophy_notification_helper.h @@ -1,7 +1,7 @@ #pragma once #include "stdafx.h" -#include "Emu/Memory/Memory.h" +#include "Emu/Memory/vm.h" #include "Emu/Cell/Modules/sceNpTrophy.h" #include