From 499035512b43f87eb396206b464eeb05da767314 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lassi=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Tue, 25 Sep 2018 23:34:45 +0300 Subject: [PATCH] Split Emu/Memory into more logical headers - Add vm_locking.h and vm_reservation.h and move relevant functions and types to these headers. - Change include order and make vm_ptr.h, vm_var.h and vm_ref.h headers usable invidually and them including vm.h instead of other way around - Because usage of vm::ptr now requires including vm_ptr.h instead of vm.h updated multiple #includes - Added additional #includes to vm_reservation.h and vm_locking to where vm::reservation_* and locking related functions are used --- rpcs3/Emu/CPU/CPUThread.cpp | 2 +- rpcs3/Emu/Cell/Modules/cellAudioOut.h | 2 +- rpcs3/Emu/Cell/Modules/cellMsgDialog.h | 1 + rpcs3/Emu/Cell/Modules/cellOskDialog.h | 2 +- rpcs3/Emu/Cell/Modules/cellSaveData.h | 4 +- rpcs3/Emu/Cell/Modules/sceNpTrophy.h | 2 +- rpcs3/Emu/Cell/PPUInterpreter.cpp | 1 + rpcs3/Emu/Cell/PPUModule.h | 3 +- rpcs3/Emu/Cell/PPUThread.cpp | 2 +- rpcs3/Emu/Cell/PPUThread.h | 3 +- rpcs3/Emu/Cell/SPUThread.cpp | 3 +- rpcs3/Emu/Cell/lv2/lv2.cpp | 1 + rpcs3/Emu/Cell/lv2/sys_dbg.h | 2 + rpcs3/Emu/Cell/lv2/sys_fs.h | 2 +- rpcs3/Emu/Cell/lv2/sys_gamepad.h | 1 + rpcs3/Emu/Cell/lv2/sys_gpio.h | 2 + rpcs3/Emu/Cell/lv2/sys_memory.cpp | 1 + rpcs3/Emu/Cell/lv2/sys_memory.h | 2 +- rpcs3/Emu/Cell/lv2/sys_mmapper.cpp | 1 + rpcs3/Emu/Cell/lv2/sys_mmapper.h | 1 + rpcs3/Emu/Cell/lv2/sys_overlay.cpp | 3 +- rpcs3/Emu/Cell/lv2/sys_ppu_thread.h | 1 + rpcs3/Emu/Cell/lv2/sys_process.cpp | 3 +- rpcs3/Emu/Cell/lv2/sys_process.h | 2 + rpcs3/Emu/Cell/lv2/sys_rsx.h | 2 + rpcs3/Emu/Cell/lv2/sys_sync.h | 2 +- rpcs3/Emu/Cell/lv2/sys_time.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_time.h | 2 + rpcs3/Emu/Cell/lv2/sys_tty.h | 2 +- rpcs3/Emu/Cell/lv2/sys_usbd.h | 2 +- rpcs3/Emu/Cell/lv2/sys_vm.h | 2 +- rpcs3/Emu/Memory/vm.cpp | 8 ++- rpcs3/Emu/Memory/vm.h | 90 +++----------------------- rpcs3/Emu/Memory/vm_locking.h | 48 ++++++++++++++ rpcs3/Emu/Memory/vm_ptr.h | 1 + rpcs3/Emu/Memory/vm_ref.h | 4 ++ rpcs3/Emu/Memory/vm_reservation.h | 45 +++++++++++++ rpcs3/Emu/Memory/vm_var.h | 1 + rpcs3/Emu/RSX/GCM.h | 2 +- rpcs3/Emu/RSX/rsx_methods.cpp | 4 +- 40 files changed, 160 insertions(+), 104 deletions(-) create mode 100644 rpcs3/Emu/Memory/vm_locking.h create mode 100644 rpcs3/Emu/Memory/vm_reservation.h diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index 75130fe545..dc60f89484 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -1,6 +1,6 @@ #include "stdafx.h" #include "Emu/System.h" -#include "Emu/Memory/vm.h" +#include "Emu/Memory/vm_locking.h" #include "CPUThread.h" #include "Emu/IdManager.h" #include "Utilities/GDBDebugServer.h" diff --git a/rpcs3/Emu/Cell/Modules/cellAudioOut.h b/rpcs3/Emu/Cell/Modules/cellAudioOut.h index 24af5c5250..eff14f2063 100644 --- a/rpcs3/Emu/Cell/Modules/cellAudioOut.h +++ b/rpcs3/Emu/Cell/Modules/cellAudioOut.h @@ -1,6 +1,6 @@ #pragma once - +#include "Emu/Memory/vm_ptr.h" // Error codes enum diff --git a/rpcs3/Emu/Cell/Modules/cellMsgDialog.h b/rpcs3/Emu/Cell/Modules/cellMsgDialog.h index 0b11d3bbc5..307f1b593b 100644 --- a/rpcs3/Emu/Cell/Modules/cellMsgDialog.h +++ b/rpcs3/Emu/Cell/Modules/cellMsgDialog.h @@ -1,6 +1,7 @@ #pragma once #include "Utilities/BitField.h" +#include "Emu/Memory/vm_ptr.h" enum { diff --git a/rpcs3/Emu/Cell/Modules/cellOskDialog.h b/rpcs3/Emu/Cell/Modules/cellOskDialog.h index 0312f43033..d13706810c 100644 --- a/rpcs3/Emu/Cell/Modules/cellOskDialog.h +++ b/rpcs3/Emu/Cell/Modules/cellOskDialog.h @@ -1,6 +1,6 @@ #pragma once - +#include "Emu/Memory/vm_ptr.h" // error codes enum CellOskDialogError : u32 diff --git a/rpcs3/Emu/Cell/Modules/cellSaveData.h b/rpcs3/Emu/Cell/Modules/cellSaveData.h index a7fe68e48e..42208c1a23 100644 --- a/rpcs3/Emu/Cell/Modules/cellSaveData.h +++ b/rpcs3/Emu/Cell/Modules/cellSaveData.h @@ -1,6 +1,6 @@ -#pragma once - +#pragma once +#include // Return codes enum CellSaveDataError : u32 diff --git a/rpcs3/Emu/Cell/Modules/sceNpTrophy.h b/rpcs3/Emu/Cell/Modules/sceNpTrophy.h index 65ee6b403d..fc9501e7c1 100644 --- a/rpcs3/Emu/Cell/Modules/sceNpTrophy.h +++ b/rpcs3/Emu/Cell/Modules/sceNpTrophy.h @@ -1,6 +1,6 @@ #pragma once - +#include "Emu/Memory/vm_ptr.h" // Error codes enum SceNpTrophyError : u32 diff --git a/rpcs3/Emu/Cell/PPUInterpreter.cpp b/rpcs3/Emu/Cell/PPUInterpreter.cpp index 0efc68092e..9ebf971566 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.cpp +++ b/rpcs3/Emu/Cell/PPUInterpreter.cpp @@ -1,4 +1,5 @@ #include "stdafx.h" +#include "Emu/Memory/vm_reservation.h" #include "Emu/System.h" #include "PPUThread.h" #include "PPUInterpreter.h" diff --git a/rpcs3/Emu/Cell/PPUModule.h b/rpcs3/Emu/Cell/PPUModule.h index cdbe53b81f..6bb44e1b5d 100644 --- a/rpcs3/Emu/Cell/PPUModule.h +++ b/rpcs3/Emu/Cell/PPUModule.h @@ -1,9 +1,10 @@ -#pragma once +#pragma once #include "PPUFunction.h" #include "PPUCallback.h" #include "ErrorCodes.h" #include +#include "Emu/Memory/vm_var.h" // Helper function constexpr const char* ppu_select_name(const char* name, u32 id) diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index cd8a9b7d38..6e1d19e376 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/vm.h" +#include "Emu/Memory/vm_reservation.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "PPUThread.h" diff --git a/rpcs3/Emu/Cell/PPUThread.h b/rpcs3/Emu/Cell/PPUThread.h index 65f6ead43c..e4f4fb9184 100644 --- a/rpcs3/Emu/Cell/PPUThread.h +++ b/rpcs3/Emu/Cell/PPUThread.h @@ -1,7 +1,8 @@ #pragma once #include "../CPU/CPUThread.h" -#include "../Memory/vm.h" +#include "../Memory/vm_ref.h" +#include "../Memory/vm_ptr.h" #include "Utilities/lockless.h" enum class ppu_cmd : u32 diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 2cc406010b..184122ba5e 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -1,7 +1,8 @@ #include "stdafx.h" #include "Utilities/JIT.h" #include "Utilities/sysinfo.h" -#include "Emu/Memory/vm.h" +#include "Emu/Memory/vm_ptr.h" +#include "Emu/Memory/vm_reservation.h" #include "Emu/System.h" #include "Emu/IdManager.h" diff --git a/rpcs3/Emu/Cell/lv2/lv2.cpp b/rpcs3/Emu/Cell/lv2/lv2.cpp index 8c0c6166d2..4c8121ce64 100644 --- a/rpcs3/Emu/Cell/lv2/lv2.cpp +++ b/rpcs3/Emu/Cell/lv2/lv2.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "Emu/System.h" +#include "Emu/Memory/vm_ptr.h" #include "Emu/Cell/PPUFunction.h" #include "Emu/Cell/ErrorCodes.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_dbg.h b/rpcs3/Emu/Cell/lv2/sys_dbg.h index 0fec0b828a..e142d732a2 100644 --- a/rpcs3/Emu/Cell/lv2/sys_dbg.h +++ b/rpcs3/Emu/Cell/lv2/sys_dbg.h @@ -1,5 +1,7 @@ #pragma once +#include "Emu/Memory/vm_ptr.h" + // Syscalls error_code sys_dbg_read_process_memory(s32 pid, u32 address, u32 size, vm::ptr data); diff --git a/rpcs3/Emu/Cell/lv2/sys_fs.h b/rpcs3/Emu/Cell/lv2/sys_fs.h index 3d6a0e4da7..2ce8496360 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/vm.h" +#include "Emu/Memory/vm_ptr.h" #include "Emu/Cell/ErrorCodes.h" // Open Flags diff --git a/rpcs3/Emu/Cell/lv2/sys_gamepad.h b/rpcs3/Emu/Cell/lv2/sys_gamepad.h index 9e9a6ff9a9..c743a5239f 100644 --- a/rpcs3/Emu/Cell/lv2/sys_gamepad.h +++ b/rpcs3/Emu/Cell/lv2/sys_gamepad.h @@ -1,6 +1,7 @@ #pragma once #include "Emu/Cell/ErrorCodes.h" +#include "Emu/Memory/vm_ptr.h" //Syscalls diff --git a/rpcs3/Emu/Cell/lv2/sys_gpio.h b/rpcs3/Emu/Cell/lv2/sys_gpio.h index 4dfe7e7873..cd49166780 100644 --- a/rpcs3/Emu/Cell/lv2/sys_gpio.h +++ b/rpcs3/Emu/Cell/lv2/sys_gpio.h @@ -1,5 +1,7 @@ #pragma once +#include "Emu/Memory/vm_ptr.h" + enum : u64 { SYS_GPIO_UNKNOWN_DEVICE_ID, diff --git a/rpcs3/Emu/Cell/lv2/sys_memory.cpp b/rpcs3/Emu/Cell/lv2/sys_memory.cpp index 6ec7031ac4..7e469209e0 100644 --- a/rpcs3/Emu/Cell/lv2/sys_memory.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_memory.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "Utilities/VirtualMemory.h" +#include "Emu/Memory/vm_locking.h" #include "Emu/IdManager.h" #include "sys_memory.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_memory.h b/rpcs3/Emu/Cell/lv2/sys_memory.h index 804e98476d..03816c78c7 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/vm.h" +#include "Emu/Memory/vm_ptr.h" #include "Emu/Cell/ErrorCodes.h" #include "Emu/IdManager.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp b/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp index 8dc332a507..826f32f4f5 100644 --- a/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp @@ -2,6 +2,7 @@ #include "Emu/Cell/PPUThread.h" #include "sys_ppu_thread.h" #include "Emu/Cell/lv2/sys_event.h" +#include "Emu/Memory/vm_var.h" #include "Utilities/VirtualMemory.h" #include "sys_memory.h" #include "sys_mmapper.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_mmapper.h b/rpcs3/Emu/Cell/lv2/sys_mmapper.h index ecc206a03d..e121433f1c 100644 --- a/rpcs3/Emu/Cell/lv2/sys_mmapper.h +++ b/rpcs3/Emu/Cell/lv2/sys_mmapper.h @@ -2,6 +2,7 @@ #include "sys_sync.h" #include +#include "Emu/Memory/vm_ptr.h" struct lv2_memory_container; diff --git a/rpcs3/Emu/Cell/lv2/sys_overlay.cpp b/rpcs3/Emu/Cell/lv2/sys_overlay.cpp index 99ebf627a8..1984fba9a5 100644 --- a/rpcs3/Emu/Cell/lv2/sys_overlay.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_overlay.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" -#include "Emu/Memory/vm.h" + +#include "Emu/Memory/vm_ptr.h" #include "Emu/System.h" #include "Emu/IdManager.h" #include "Crypto/unself.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_ppu_thread.h b/rpcs3/Emu/Cell/lv2/sys_ppu_thread.h index 82fb9f5d92..880b9f5182 100644 --- a/rpcs3/Emu/Cell/lv2/sys_ppu_thread.h +++ b/rpcs3/Emu/Cell/lv2/sys_ppu_thread.h @@ -1,6 +1,7 @@ #pragma once #include "sys_sync.h" +#include "Emu/Memory/vm_ptr.h" class ppu_thread; diff --git a/rpcs3/Emu/Cell/lv2/sys_process.cpp b/rpcs3/Emu/Cell/lv2/sys_process.cpp index ad89d76d61..790ffb0bc4 100644 --- a/rpcs3/Emu/Cell/lv2/sys_process.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_process.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" -#include "Emu/Memory/vm.h" +#include "Utilities/types.h" +#include "Emu/Memory/vm_ptr.h" #include "Emu/System.h" #include "Emu/IdManager.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_process.h b/rpcs3/Emu/Cell/lv2/sys_process.h index dd103431b3..0ae695b9a0 100644 --- a/rpcs3/Emu/Cell/lv2/sys_process.h +++ b/rpcs3/Emu/Cell/lv2/sys_process.h @@ -1,5 +1,7 @@ #pragma once +#include "Emu/Memory/vm_ptr.h" + // Process Local Object Type enum : u32 { diff --git a/rpcs3/Emu/Cell/lv2/sys_rsx.h b/rpcs3/Emu/Cell/lv2/sys_rsx.h index c60a474280..c491ed33dc 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rsx.h +++ b/rpcs3/Emu/Cell/lv2/sys_rsx.h @@ -1,5 +1,7 @@ #pragma once +#include "Emu/Memory/vm_ptr.h" + struct RsxDriverInfo { be_t version_driver; // 0x0 diff --git a/rpcs3/Emu/Cell/lv2/sys_sync.h b/rpcs3/Emu/Cell/lv2/sys_sync.h index 429b1c74ed..960fab7fe0 100644 --- a/rpcs3/Emu/Cell/lv2/sys_sync.h +++ b/rpcs3/Emu/Cell/lv2/sys_sync.h @@ -4,7 +4,7 @@ #include "Utilities/sema.h" #include "Utilities/cond.h" -#include "Emu/Memory/vm.h" +#include "Emu/Memory/vm_locking.h" #include "Emu/CPU/CPUThread.h" #include "Emu/Cell/ErrorCodes.h" #include "Emu/IdManager.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_time.cpp b/rpcs3/Emu/Cell/lv2/sys_time.cpp index 2af01bd2b5..c3ff1067bd 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/vm.h" +#include "Emu/Memory/vm_ptr.h" #include "Emu/System.h" #include "Emu/Cell/ErrorCodes.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_time.h b/rpcs3/Emu/Cell/lv2/sys_time.h index 651019ff72..5b4c61ffe6 100644 --- a/rpcs3/Emu/Cell/lv2/sys_time.h +++ b/rpcs3/Emu/Cell/lv2/sys_time.h @@ -1,5 +1,7 @@ #pragma once +#include "Emu/Memory/vm_ptr.h" + // SysCalls s32 sys_time_get_timezone(vm::ptr timezone, vm::ptr summertime); s32 sys_time_get_current_time(vm::ptr sec, vm::ptr nsec); diff --git a/rpcs3/Emu/Cell/lv2/sys_tty.h b/rpcs3/Emu/Cell/lv2/sys_tty.h index 5fc616d51f..69a66f9b53 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/vm.h" +#include "Emu/Memory/vm_ptr.h" #include "Emu/Cell/ErrorCodes.h" // TTY channels diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.h b/rpcs3/Emu/Cell/lv2/sys_usbd.h index a38545f9b4..6fdf6e55da 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.h +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.h @@ -1,6 +1,6 @@ #pragma once - +#include "Emu/Memory/vm_ptr.h" // SysCalls diff --git a/rpcs3/Emu/Cell/lv2/sys_vm.h b/rpcs3/Emu/Cell/lv2/sys_vm.h index b50eb45e0c..fb2f26d3ea 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/vm.h" +#include "Emu/Memory/vm_ptr.h" #include "Emu/Cell/ErrorCodes.h" #include "Emu/IdManager.h" #include "sys_memory.h" diff --git a/rpcs3/Emu/Memory/vm.cpp b/rpcs3/Emu/Memory/vm.cpp index 2db4b2f07c..e270ef655c 100644 --- a/rpcs3/Emu/Memory/vm.cpp +++ b/rpcs3/Emu/Memory/vm.cpp @@ -1,4 +1,10 @@ -#include "stdafx.h" +#include "stdafx.h" +#include "vm_locking.h" +#include "vm_ptr.h" +#include "vm_ref.h" +#include "vm_reservation.h" +#include "vm_var.h" + #include "Emu/System.h" #include "Utilities/mutex.h" #include "Utilities/cond.h" diff --git a/rpcs3/Emu/Memory/vm.h b/rpcs3/Emu/Memory/vm.h index 2f58ca60e9..e8a178ab24 100644 --- a/rpcs3/Emu/Memory/vm.h +++ b/rpcs3/Emu/Memory/vm.h @@ -3,11 +3,11 @@ #include #include #include +#include "Utilities/types.h" +#include "Utilities/Atomic.h" #include "Utilities/VirtualMemory.h" - -class shared_mutex; -class cpu_thread; -class shared_cond; +#include "Utilities/StrFmt.h" +#include "Utilities/BEType.h" namespace vm { @@ -18,6 +18,8 @@ namespace vm extern u8* const g_reservations; extern u8* const g_reservations2; + struct writer_lock; + enum memory_location_t : uint { main, @@ -48,79 +50,6 @@ namespace vm // Address type enum addr_t : u32 {}; - extern shared_mutex g_mutex; - - extern thread_local atomic_t* g_tls_locked; - - // Register reader - void passive_lock(cpu_thread& cpu); - atomic_t* passive_lock(const u32 begin, const u32 end); - - // Unregister reader - void passive_unlock(cpu_thread& cpu); - - // Unregister reader (foreign thread) - void cleanup_unlock(cpu_thread& cpu) noexcept; - - // Optimization (set cpu_flag::memory) - void temporary_unlock(cpu_thread& cpu) noexcept; - void temporary_unlock() noexcept; - - class reader_lock final - { - bool m_upgraded = false; - - public: - reader_lock(const reader_lock&) = delete; - reader_lock& operator=(const reader_lock&) = delete; - reader_lock(); - ~reader_lock(); - - void upgrade(); - }; - - struct writer_lock final - { - writer_lock(const writer_lock&) = delete; - writer_lock& operator=(const writer_lock&) = delete; - writer_lock(u32 addr = 0); - ~writer_lock(); - }; - - // Get reservation status for further atomic update: last update timestamp - inline atomic_t& reservation_acquire(u32 addr, u32 size) - { - // Access reservation info: stamp and the lock bit - return reinterpret_cast*>(g_reservations)[addr / 128]; - } - - // Update reservation status - inline void reservation_update(u32 addr, u32 size, bool lsb = false) - { - // Update reservation info with new timestamp - reservation_acquire(addr, size) += 128; - } - - // Get reservation sync variable - inline shared_cond& reservation_notifier(u32 addr, u32 size) - { - return *reinterpret_cast(g_reservations2 + addr / 128 * 8); - } - - void reservation_lock_internal(atomic_t&); - - inline atomic_t& reservation_lock(u32 addr, u32 size) - { - auto& res = vm::reservation_acquire(addr, size); - - if (UNLIKELY(atomic_storage::bts(res.raw(), 0))) - { - reservation_lock_internal(res); - } - - return res; - } - // Change memory protection of specified memory region bool page_protect(u32 addr, u32 size, u8 flags_test = 0, u8 flags_set = 0, u8 flags_clear = 0); @@ -172,11 +101,11 @@ namespace vm // Get memory at specified address (if size = 0, addr assumed exact) std::pair> get(u32 addr, u32 size = 0); - // Internal - u32 imp_used(const vm::writer_lock&); - // Get allocated memory count u32 used(); + + // Internal + u32 imp_used(const vm::writer_lock&); }; // Create new memory block with specified parameters and return it @@ -343,4 +272,3 @@ namespace vm void close(); } -#include "vm_var.h" diff --git a/rpcs3/Emu/Memory/vm_locking.h b/rpcs3/Emu/Memory/vm_locking.h new file mode 100644 index 0000000000..330d8865c1 --- /dev/null +++ b/rpcs3/Emu/Memory/vm_locking.h @@ -0,0 +1,48 @@ +#pragma once + +#include "vm.h" + +class cpu_thread; +class shared_mutex; + +namespace vm +{ + extern shared_mutex g_mutex; + + extern thread_local atomic_t* g_tls_locked; + + // Register reader + void passive_lock(cpu_thread& cpu); + atomic_t* passive_lock(const u32 begin, const u32 end); + + // Unregister reader + void passive_unlock(cpu_thread& cpu); + + // Unregister reader (foreign thread) + void cleanup_unlock(cpu_thread& cpu) noexcept; + + // Optimization (set cpu_flag::memory) + void temporary_unlock(cpu_thread& cpu) noexcept; + void temporary_unlock() noexcept; + + class reader_lock final + { + bool m_upgraded = false; + + public: + reader_lock(const reader_lock&) = delete; + reader_lock& operator=(const reader_lock&) = delete; + reader_lock(); + ~reader_lock(); + + void upgrade(); + }; + + struct writer_lock final + { + writer_lock(const writer_lock&) = delete; + writer_lock& operator=(const writer_lock&) = delete; + writer_lock(u32 addr = 0); + ~writer_lock(); + }; +} // namespace vm diff --git a/rpcs3/Emu/Memory/vm_ptr.h b/rpcs3/Emu/Memory/vm_ptr.h index 3e9a84cb1e..b4c02b9377 100644 --- a/rpcs3/Emu/Memory/vm_ptr.h +++ b/rpcs3/Emu/Memory/vm_ptr.h @@ -1,5 +1,6 @@ #pragma once +#include "Utilities/types.h" #include "vm_ref.h" class ppu_thread; diff --git a/rpcs3/Emu/Memory/vm_ref.h b/rpcs3/Emu/Memory/vm_ref.h index b6348f2a72..c0525d1c6c 100644 --- a/rpcs3/Emu/Memory/vm_ref.h +++ b/rpcs3/Emu/Memory/vm_ref.h @@ -1,5 +1,9 @@ #pragma once +#include +#include "Utilities/BEType.h" +#include "vm.h" + namespace vm { template diff --git a/rpcs3/Emu/Memory/vm_reservation.h b/rpcs3/Emu/Memory/vm_reservation.h new file mode 100644 index 0000000000..1e32dac32e --- /dev/null +++ b/rpcs3/Emu/Memory/vm_reservation.h @@ -0,0 +1,45 @@ +#pragma once + +#include "vm.h" +#include "Utilities/cond.h" + +class notifier; + +namespace vm +{ + + // Get reservation status for further atomic update: last update timestamp + inline atomic_t& reservation_acquire(u32 addr, u32 size) + { + // Access reservation info: stamp and the lock bit + return reinterpret_cast*>(g_reservations)[addr / 128]; + } + + // Update reservation status + inline void reservation_update(u32 addr, u32 size, bool lsb = false) + { + // Update reservation info with new timestamp + reservation_acquire(addr, size) += 128; + } + + // Get reservation sync variable + inline shared_cond& reservation_notifier(u32 addr, u32 size) + { + return *reinterpret_cast(g_reservations2 + addr / 128 * 8); + } + + void reservation_lock_internal(atomic_t&); + + inline atomic_t& reservation_lock(u32 addr, u32 size) + { + auto& res = vm::reservation_acquire(addr, size); + + if (UNLIKELY(atomic_storage::bts(res.raw(), 0))) + { + reservation_lock_internal(res); + } + + return res; + } + +} // namespace vm diff --git a/rpcs3/Emu/Memory/vm_var.h b/rpcs3/Emu/Memory/vm_var.h index 05c8b9f717..ba3ba82804 100644 --- a/rpcs3/Emu/Memory/vm_var.h +++ b/rpcs3/Emu/Memory/vm_var.h @@ -1,6 +1,7 @@ #pragma once #include "vm_ptr.h" +#include "Utilities/BEType.h" namespace vm { diff --git a/rpcs3/Emu/RSX/GCM.h b/rpcs3/Emu/RSX/GCM.h index 1e46c70015..cefddc32a6 100644 --- a/rpcs3/Emu/RSX/GCM.h +++ b/rpcs3/Emu/RSX/GCM.h @@ -1,6 +1,6 @@ #pragma once -#include "Emu/Memory/vm.h" +#include "Emu/Memory/vm_ptr.h" #include "gcm_enums.h" #include "gcm_printing.h" diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index 730aa668ac..3516831351 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -1,7 +1,7 @@ -#include "stdafx.h" +#include "stdafx.h" #include "rsx_methods.h" #include "RSXThread.h" -#include "Emu/Memory/vm.h" +#include "Emu/Memory/vm_reservation.h" #include "Emu/System.h" #include "rsx_utils.h" #include "rsx_decode.h"