11#include " exclusive_monitor_interface.h"
22
3- ExclusiveMonitor::ExclusiveMonitor (IMemory & /* memory*/ , uint32_t processorCount) :
4- Dynarmic::ExclusiveMonitor(processorCount)
3+ ExclusiveMonitor::ExclusiveMonitor (IMemory & memory, uint32_t processorCount) :
4+ Dynarmic::ExclusiveMonitor(processorCount),
5+ m_memory(memory)
56{
67}
78
8- uint8_t ExclusiveMonitor::ExclusiveRead8 (uint32_t /* coreIndex*/ , uint64_t /* addr*/ )
9+ uint8_t ExclusiveMonitor::ExclusiveRead8 (uint32_t coreIndex, uint64_t addr)
910{
10- __debugbreak ();
11- return 0 ;
11+ return ReadAndMark<uint16_t >(coreIndex, addr, [&]() -> uint32_t { return m_memory.Read8 (addr); });
1212}
1313
14- uint16_t ExclusiveMonitor::ExclusiveRead16 (uint32_t /* coreIndex*/ , uint64_t /* addr*/ )
14+ uint16_t ExclusiveMonitor::ExclusiveRead16 (uint32_t coreIndex, uint64_t addr)
1515{
16- __debugbreak ();
17- return 0 ;
16+ return ReadAndMark<uint16_t >(coreIndex, addr, [&]() -> uint32_t { return m_memory.Read16 (addr); });
1817}
1918
20- uint32_t ExclusiveMonitor::ExclusiveRead32 (uint32_t /* coreIndex*/ , uint64_t /* addr*/ )
19+ uint32_t ExclusiveMonitor::ExclusiveRead32 (uint32_t coreIndex, uint64_t addr)
2120{
22- __debugbreak ();
23- return 0 ;
21+ return ReadAndMark<uint32_t >(coreIndex, addr, [&]() -> uint32_t { return m_memory.Read32 (addr); });
2422}
2523
26- uint64_t ExclusiveMonitor::ExclusiveRead64 (uint32_t /* coreIndex*/ , uint64_t /* addr*/ )
24+ uint64_t ExclusiveMonitor::ExclusiveRead64 (uint32_t coreIndex, uint64_t addr)
2725{
28- __debugbreak ();
29- return 0 ;
26+ return ReadAndMark<uint64_t >(coreIndex, addr, [&]() -> uint64_t { return m_memory.Read64 (addr); });
3027}
3128
32- void ExclusiveMonitor::ClearExclusive (uint32_t /* coreIndex*/ )
29+ void ExclusiveMonitor::ClearExclusive (uint32_t coreIndex)
3330{
34- __debugbreak ( );
31+ ClearProcessor (coreIndex );
3532}
3633
37- bool ExclusiveMonitor::ExclusiveWrite8 (uint32_t /* coreIndex*/ , uint64_t /* addr*/ , uint8_t /* value*/ )
34+ bool ExclusiveMonitor::ExclusiveWrite8 (uint32_t coreIndex, uint64_t addr, uint8_t value)
3835{
39- __debugbreak ();
40- return false ;
36+ return DoExclusiveOperation<uint8_t >(coreIndex, addr, [&](uint8_t expected) -> bool {
37+ return m_memory.WriteExclusive8 (addr, value, expected);
38+ });
4139}
4240
43- bool ExclusiveMonitor::ExclusiveWrite16 (uint32_t /* coreIndex*/ , uint64_t /* addr*/ , uint16_t /* value*/ )
41+ bool ExclusiveMonitor::ExclusiveWrite16 (uint32_t coreIndex, uint64_t addr, uint16_t value)
4442{
45- __debugbreak ();
46- return false ;
43+ return DoExclusiveOperation<uint16_t >(coreIndex, addr, [&](uint16_t expected) -> bool {
44+ return m_memory.WriteExclusive16 (addr, value, expected);
45+ });
4746}
4847
49- bool ExclusiveMonitor::ExclusiveWrite32 (uint32_t /* coreIndex*/ , uint64_t /* addr*/ , uint32_t /* value*/ )
48+ bool ExclusiveMonitor::ExclusiveWrite32 (uint32_t coreIndex, uint64_t addr, uint32_t value)
5049{
51- __debugbreak ();
52- return false ;
50+ return DoExclusiveOperation<uint32_t >(coreIndex, addr, [&](uint32_t expected) -> bool {
51+ return m_memory.WriteExclusive32 (addr, value, expected);
52+ });
5353}
5454
55- bool ExclusiveMonitor::ExclusiveWrite64 (uint32_t /* coreIndex*/ , uint64_t /* addr*/ , uint64_t /* value*/ )
55+ bool ExclusiveMonitor::ExclusiveWrite64 (uint32_t coreIndex, uint64_t addr, uint64_t value)
5656{
57- __debugbreak ();
58- return false ;
57+ return DoExclusiveOperation<uint64_t >(coreIndex, addr, [&](uint64_t expected) -> bool {
58+ return m_memory.WriteExclusive64 (addr , value, expected);
59+ });
5960}
0 commit comments