diff options
| author | 2020-03-15 15:54:40 -0400 | |
|---|---|---|
| committer | 2020-06-27 11:35:50 -0400 | |
| commit | 25565dffd588006aace7530486e71ff318dc5550 (patch) | |
| tree | e30556e18f3dae60ea6cb8d32b84fbcc42860d24 /src | |
| parent | CPU_Manager: Correct stopping on SingleCore. (diff) | |
| download | yuzu-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.cpp | 22 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.h | 10 | ||||
| -rw-r--r-- | src/core/arm/exclusive_monitor.h | 10 | ||||
| -rw-r--r-- | src/core/hle/kernel/address_arbiter.cpp | 9 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 4 |
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 | |||
| 185 | void ARM_Dynarmic_64::Run() { | 183 | void ARM_Dynarmic_64::Run() { |
| 186 | jit->Run(); | 184 | jit->Run(); |
| 187 | } | 185 | } |
| @@ -297,24 +295,24 @@ DynarmicExclusiveMonitor::DynarmicExclusiveMonitor(Memory::Memory& memory, std:: | |||
| 297 | 295 | ||
| 298 | DynarmicExclusiveMonitor::~DynarmicExclusiveMonitor() = default; | 296 | DynarmicExclusiveMonitor::~DynarmicExclusiveMonitor() = default; |
| 299 | 297 | ||
| 300 | void DynarmicExclusiveMonitor::SetExclusive8(std::size_t core_index, VAddr addr) { | 298 | u8 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 | ||
| 304 | void DynarmicExclusiveMonitor::SetExclusive16(std::size_t core_index, VAddr addr) { | 302 | u16 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 | ||
| 308 | void DynarmicExclusiveMonitor::SetExclusive32(std::size_t core_index, VAddr addr) { | 306 | u32 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 | ||
| 312 | void DynarmicExclusiveMonitor::SetExclusive64(std::size_t core_index, VAddr addr) { | 310 | u64 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 | ||
| 316 | void DynarmicExclusiveMonitor::SetExclusive128(std::size_t core_index, VAddr addr) { | 314 | u128 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 { | |||
| 18 | public: | 18 | public: |
| 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; |