diff --git a/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp b/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp index 784f193af5..32d46e8e21 100644 --- a/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGcmSys.cpp @@ -1086,8 +1086,8 @@ s32 cellGcmUnmapEaIoAddress(u32 ea) for (u32 i = 0; i < size; i++) { - RSXIOMem.io[ea + i] = offsetTable.ioAddress[ea + i] = 0xFFFF; - RSXIOMem.ea[io + i] = offsetTable.eaAddress[io + i] = 0xFFFF; + RSXIOMem.io[ea + i].release(offsetTable.ioAddress[ea + i] = 0xFFFF); + RSXIOMem.ea[io + i].release(offsetTable.eaAddress[io + i] = 0xFFFF); } } else @@ -1109,8 +1109,8 @@ s32 cellGcmUnmapIoAddress(u32 io) for (u32 i = 0; i < size; i++) { - RSXIOMem.io[ea + i] = offsetTable.ioAddress[ea + i] = 0xFFFF; - RSXIOMem.ea[io + i] = offsetTable.eaAddress[io + i] = 0xFFFF; + RSXIOMem.io[ea + i].release(offsetTable.ioAddress[ea + i] = 0xFFFF); + RSXIOMem.ea[io + i].release(offsetTable.eaAddress[io + i] = 0xFFFF); } } else diff --git a/rpcs3/Emu/Cell/lv2/sys_rsx.cpp b/rpcs3/Emu/Cell/lv2/sys_rsx.cpp index b1e620d14c..bc0f669424 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rsx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_rsx.cpp @@ -196,8 +196,8 @@ s32 sys_rsx_context_iomap(u32 context_id, u32 io, u32 ea, u32 size, u64 flags) for (u32 i = 0; i < size; i++) { - RSXIOMem.io[ea + i] = io + i; - RSXIOMem.ea[io + i] = ea + i; + RSXIOMem.io[ea + i].release(io + i); + RSXIOMem.ea[io + i].release(ea + i); } return CELL_OK; @@ -221,8 +221,8 @@ s32 sys_rsx_context_iounmap(u32 context_id, u32 io, u32 size) const u32 end = (io >>= 20) + (size >>= 20); for (u32 ea = RSXIOMem.ea[io]; io < end;) { - RSXIOMem.io[ea++] = 0xFFFF; - RSXIOMem.ea[io++] = 0xFFFF; + RSXIOMem.io[ea++].release(0xFFFF); + RSXIOMem.ea[io++].release(0xFFFF); } return CELL_OK; diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index ab55b4c7fa..4701e040d6 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -27,21 +27,25 @@ extern u64 get_system_time(); struct RSXIOTable { - u16 ea[4096]; - u16 io[3072]; + atomic_t ea[4096]; + atomic_t io[3072]; // try to get the real address given a mapped address // return non zero on success inline u32 RealAddr(u32 offs) { - const u32 upper = this->ea[offs >> 20]; + u32 result = this->ea[offs >> 20].load(); - if (static_cast(upper) < 0) + if (static_cast(result) < 0) { return 0; } - return (upper << 20) | (offs & 0xFFFFF); + result <<= 20; result |= (offs & 0xFFFFF); + + ASSUME(result != 0); + + return result; } };