From b5d8b24a3c4a19a6f70cd5da37615605804b54f6 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Sat, 7 Mar 2020 15:07:29 -0400 Subject: [PATCH] Exclusive Monitor: Allow clearing a single processor. --- include/dynarmic/A64/exclusive_monitor.h | 4 +++- src/backend/x64/a64_exclusive_monitor.cpp | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) 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