diff --git a/include/dynarmic/A64/exclusive_monitor.h b/include/dynarmic/A64/exclusive_monitor.h index 0e0c3b11..6e2d167b 100644 --- a/include/dynarmic/A64/exclusive_monitor.h +++ b/include/dynarmic/A64/exclusive_monitor.h @@ -46,6 +46,8 @@ public: /// Unmark everything. void Clear(); + /// Unmark processor id + void Clear(size_t processor_id); private: bool CheckAndClear(size_t processor_id, VAddr address, size_t size); @@ -53,7 +55,7 @@ private: void Lock(); void Unlock(); - static constexpr VAddr RESERVATION_GRANULE_MASK = 0xFFFF'FFFF'FFFF'FFF0ull; + static constexpr VAddr RESERVATION_GRANULE_MASK = 0xFFFF'FFFF'FFFF'FFFFull; static constexpr VAddr INVALID_EXCLUSIVE_ADDRESS = 0xDEAD'DEAD'DEAD'DEADull; std::atomic_flag is_locked; std::vector exclusive_addresses; diff --git a/src/backend/x64/a64_exclusive_monitor.cpp b/src/backend/x64/a64_exclusive_monitor.cpp index bd0582a0..0744c4e1 100644 --- a/src/backend/x64/a64_exclusive_monitor.cpp +++ b/src/backend/x64/a64_exclusive_monitor.cpp @@ -60,5 +60,12 @@ void ExclusiveMonitor::Clear() { Unlock(); } +void ExclusiveMonitor::Clear(size_t processor_id) { + Lock(); + exclusive_addresses[processor_id] = INVALID_EXCLUSIVE_ADDRESS; + Unlock(); +} + + } // namespace A64 } // namespace Dynarmic