summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2020-03-15 15:54:40 -0400
committerGravatar Fernando Sahmkow2020-06-27 11:35:50 -0400
commit25565dffd588006aace7530486e71ff318dc5550 (patch)
treee30556e18f3dae60ea6cb8d32b84fbcc42860d24 /src
parentCPU_Manager: Correct stopping on SingleCore. (diff)
downloadyuzu-25565dffd588006aace7530486e71ff318dc5550.tar.gz
yuzu-25565dffd588006aace7530486e71ff318dc5550.tar.xz
yuzu-25565dffd588006aace7530486e71ff318dc5550.zip
ARM: Addapt to new Exclusive Monitor Interface.
Diffstat (limited to 'src')
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp22
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.h10
-rw-r--r--src/core/arm/exclusive_monitor.h10
-rw-r--r--src/core/hle/kernel/address_arbiter.cpp9
-rw-r--r--src/core/hle/kernel/svc.cpp4
5 files changed, 24 insertions, 31 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
index 84b872f0b..2e664cfa8 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
@@ -180,8 +180,6 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable&
180 return std::make_shared<Dynarmic::A64::Jit>(config); 180 return std::make_shared<Dynarmic::A64::Jit>(config);
181} 181}
182 182
183
184
185void ARM_Dynarmic_64::Run() { 183void ARM_Dynarmic_64::Run() {
186 jit->Run(); 184 jit->Run();
187} 185}
@@ -297,24 +295,24 @@ DynarmicExclusiveMonitor::DynarmicExclusiveMonitor(Memory::Memory& memory, std::
297 295
298DynarmicExclusiveMonitor::~DynarmicExclusiveMonitor() = default; 296DynarmicExclusiveMonitor::~DynarmicExclusiveMonitor() = default;
299 297
300void DynarmicExclusiveMonitor::SetExclusive8(std::size_t core_index, VAddr addr) { 298u8 DynarmicExclusiveMonitor::ExclusiveRead8(std::size_t core_index, VAddr addr) {
301 monitor.Mark<u8>(core_index, addr, 1, [&]() -> u8 { return memory.Read8(addr); }); 299 return monitor.ReadAndMark<u8>(core_index, addr, [&]() -> u8 { return memory.Read8(addr); });
302} 300}
303 301
304void DynarmicExclusiveMonitor::SetExclusive16(std::size_t core_index, VAddr addr) { 302u16 DynarmicExclusiveMonitor::ExclusiveRead16(std::size_t core_index, VAddr addr) {
305 monitor.Mark<u16>(core_index, addr, 2, [&]() -> u16 { return memory.Read16(addr); }); 303 return monitor.ReadAndMark<u16>(core_index, addr, [&]() -> u16 { return memory.Read16(addr); });
306} 304}
307 305
308void DynarmicExclusiveMonitor::SetExclusive32(std::size_t core_index, VAddr addr) { 306u32 DynarmicExclusiveMonitor::ExclusiveRead32(std::size_t core_index, VAddr addr) {
309 monitor.Mark<u32>(core_index, addr, 4, [&]() -> u32 { return memory.Read32(addr); }); 307 return monitor.ReadAndMark<u32>(core_index, addr, [&]() -> u32 { return memory.Read32(addr); });
310} 308}
311 309
312void DynarmicExclusiveMonitor::SetExclusive64(std::size_t core_index, VAddr addr) { 310u64 DynarmicExclusiveMonitor::ExclusiveRead64(std::size_t core_index, VAddr addr) {
313 monitor.Mark<u64>(core_index, addr, 8, [&]() -> u64 { return memory.Read64(addr); }); 311 return monitor.ReadAndMark<u64>(core_index, addr, [&]() -> u64 { return memory.Read64(addr); });
314} 312}
315 313
316void DynarmicExclusiveMonitor::SetExclusive128(std::size_t core_index, VAddr addr) { 314u128 DynarmicExclusiveMonitor::ExclusiveRead128(std::size_t core_index, VAddr addr) {
317 monitor.Mark<u128>(core_index, addr, 16, [&]() -> u128 { 315 return monitor.ReadAndMark<u128>(core_index, addr, [&]() -> u128 {
318 u128 result; 316 u128 result;
319 result[0] = memory.Read64(addr); 317 result[0] = memory.Read64(addr);
320 result[1] = memory.Read64(addr + 8); 318 result[1] = memory.Read64(addr + 8);
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h
index 3ead59f16..5560578ad 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.h
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.h
@@ -82,11 +82,11 @@ public:
82 explicit DynarmicExclusiveMonitor(Memory::Memory& memory, std::size_t core_count); 82 explicit DynarmicExclusiveMonitor(Memory::Memory& memory, std::size_t core_count);
83 ~DynarmicExclusiveMonitor() override; 83 ~DynarmicExclusiveMonitor() override;
84 84
85 void SetExclusive8(std::size_t core_index, VAddr addr) override; 85 u8 ExclusiveRead8(std::size_t core_index, VAddr addr) override;
86 void SetExclusive16(std::size_t core_index, VAddr addr) override; 86 u16 ExclusiveRead16(std::size_t core_index, VAddr addr) override;
87 void SetExclusive32(std::size_t core_index, VAddr addr) override; 87 u32 ExclusiveRead32(std::size_t core_index, VAddr addr) override;
88 void SetExclusive64(std::size_t core_index, VAddr addr) override; 88 u64 ExclusiveRead64(std::size_t core_index, VAddr addr) override;
89 void SetExclusive128(std::size_t core_index, VAddr addr) override; 89 u128 ExclusiveRead128(std::size_t core_index, VAddr addr) override;
90 void ClearExclusive() override; 90 void ClearExclusive() override;
91 91
92 bool ExclusiveWrite8(std::size_t core_index, VAddr vaddr, u8 value) override; 92 bool ExclusiveWrite8(std::size_t core_index, VAddr vaddr, u8 value) override;
diff --git a/src/core/arm/exclusive_monitor.h b/src/core/arm/exclusive_monitor.h
index 2ee312eee..62f6e6023 100644
--- a/src/core/arm/exclusive_monitor.h
+++ b/src/core/arm/exclusive_monitor.h
@@ -18,11 +18,11 @@ class ExclusiveMonitor {
18public: 18public:
19 virtual ~ExclusiveMonitor(); 19 virtual ~ExclusiveMonitor();
20 20
21 virtual void SetExclusive8(std::size_t core_index, VAddr addr) = 0; 21 virtual u8 ExclusiveRead8(std::size_t core_index, VAddr addr) = 0;
22 virtual void SetExclusive16(std::size_t core_index, VAddr addr) = 0; 22 virtual u16 ExclusiveRead16(std::size_t core_index, VAddr addr) = 0;
23 virtual void SetExclusive32(std::size_t core_index, VAddr addr) = 0; 23 virtual u32 ExclusiveRead32(std::size_t core_index, VAddr addr) = 0;
24 virtual void SetExclusive64(std::size_t core_index, VAddr addr) = 0; 24 virtual u64 ExclusiveRead64(std::size_t core_index, VAddr addr) = 0;
25 virtual void SetExclusive128(std::size_t core_index, VAddr addr) = 0; 25 virtual u128 ExclusiveRead128(std::size_t core_index, VAddr addr) = 0;
26 virtual void ClearExclusive() = 0; 26 virtual void ClearExclusive() = 0;
27 27
28 virtual bool ExclusiveWrite8(std::size_t core_index, VAddr vaddr, u8 value) = 0; 28 virtual bool ExclusiveWrite8(std::size_t core_index, VAddr vaddr, u8 value) = 0;
diff --git a/src/core/hle/kernel/address_arbiter.cpp b/src/core/hle/kernel/address_arbiter.cpp
index e8f22b598..4d2a9b35d 100644
--- a/src/core/hle/kernel/address_arbiter.cpp
+++ b/src/core/hle/kernel/address_arbiter.cpp
@@ -80,8 +80,7 @@ ResultCode AddressArbiter::IncrementAndSignalToAddressIfEqual(VAddr address, s32
80 auto& monitor = system.Monitor(); 80 auto& monitor = system.Monitor();
81 u32 current_value; 81 u32 current_value;
82 do { 82 do {
83 monitor.SetExclusive32(current_core, address); 83 current_value = monitor.ExclusiveRead32(current_core, address);
84 current_value = memory.Read32(address);
85 84
86 if (current_value != value) { 85 if (current_value != value) {
87 return ERR_INVALID_STATE; 86 return ERR_INVALID_STATE;
@@ -110,8 +109,7 @@ ResultCode AddressArbiter::ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr a
110 auto& monitor = system.Monitor(); 109 auto& monitor = system.Monitor();
111 s32 updated_value; 110 s32 updated_value;
112 do { 111 do {
113 monitor.SetExclusive32(current_core, address); 112 updated_value = monitor.ExclusiveRead32(current_core, address);
114 updated_value = memory.Read32(address);
115 113
116 if (updated_value != value) { 114 if (updated_value != value) {
117 return ERR_INVALID_STATE; 115 return ERR_INVALID_STATE;
@@ -186,8 +184,7 @@ ResultCode AddressArbiter::WaitForAddressIfLessThan(VAddr address, s32 value, s6
186 const std::size_t current_core = system.CurrentCoreIndex(); 184 const std::size_t current_core = system.CurrentCoreIndex();
187 auto& monitor = system.Monitor(); 185 auto& monitor = system.Monitor();
188 do { 186 do {
189 monitor.SetExclusive32(current_core, address); 187 current_value = static_cast<s32>(monitor.ExclusiveRead32(current_core, address));
190 current_value = static_cast<s32>(memory.Read32(address));
191 if (should_decrement) { 188 if (should_decrement) {
192 decrement_value = current_value - 1; 189 decrement_value = current_value - 1;
193 } else { 190 } else {
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 9b9f9402e..36e9c48f9 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -1653,10 +1653,8 @@ static void SignalProcessWideKey(Core::System& system, VAddr condition_variable_
1653 u32 update_val = 0; 1653 u32 update_val = 0;
1654 const VAddr mutex_address = thread->GetMutexWaitAddress(); 1654 const VAddr mutex_address = thread->GetMutexWaitAddress();
1655 do { 1655 do {
1656 monitor.SetExclusive32(current_core, mutex_address);
1657
1658 // If the mutex is not yet acquired, acquire it. 1656 // If the mutex is not yet acquired, acquire it.
1659 mutex_val = memory.Read32(mutex_address); 1657 mutex_val = monitor.ExclusiveRead32(current_core, mutex_address);
1660 1658
1661 if (mutex_val != 0) { 1659 if (mutex_val != 0) {
1662 update_val = mutex_val | Mutex::MutexHasWaitersFlag; 1660 update_val = mutex_val | Mutex::MutexHasWaitersFlag;