summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/core/hle/kernel/address_arbiter.cpp18
-rw-r--r--src/core/hle/kernel/address_arbiter.h13
-rw-r--r--src/core/hle/kernel/svc.cpp17
3 files changed, 26 insertions, 22 deletions
diff --git a/src/core/hle/kernel/address_arbiter.cpp b/src/core/hle/kernel/address_arbiter.cpp
index b6269c708..352190da8 100644
--- a/src/core/hle/kernel/address_arbiter.cpp
+++ b/src/core/hle/kernel/address_arbiter.cpp
@@ -42,7 +42,21 @@ void WakeThreads(const std::vector<SharedPtr<Thread>>& waiting_threads, s32 num_
42AddressArbiter::AddressArbiter(Core::System& system) : system{system} {} 42AddressArbiter::AddressArbiter(Core::System& system) : system{system} {}
43AddressArbiter::~AddressArbiter() = default; 43AddressArbiter::~AddressArbiter() = default;
44 44
45ResultCode AddressArbiter::SignalToAddress(VAddr address, s32 num_to_wake) { 45ResultCode AddressArbiter::SignalToAddress(VAddr address, SignalType type, s32 value,
46 s32 num_to_wake) {
47 switch (type) {
48 case SignalType::Signal:
49 return SignalToAddressOnly(address, num_to_wake);
50 case SignalType::IncrementAndSignalIfEqual:
51 return IncrementAndSignalToAddressIfEqual(address, value, num_to_wake);
52 case SignalType::ModifyByWaitingCountAndSignalIfEqual:
53 return ModifyByWaitingCountAndSignalToAddressIfEqual(address, value, num_to_wake);
54 default:
55 return ERR_INVALID_ENUM_VALUE;
56 }
57}
58
59ResultCode AddressArbiter::SignalToAddressOnly(VAddr address, s32 num_to_wake) {
46 const std::vector<SharedPtr<Thread>> waiting_threads = GetThreadsWaitingOnAddress(address); 60 const std::vector<SharedPtr<Thread>> waiting_threads = GetThreadsWaitingOnAddress(address);
47 WakeThreads(waiting_threads, num_to_wake); 61 WakeThreads(waiting_threads, num_to_wake);
48 return RESULT_SUCCESS; 62 return RESULT_SUCCESS;
@@ -60,7 +74,7 @@ ResultCode AddressArbiter::IncrementAndSignalToAddressIfEqual(VAddr address, s32
60 } 74 }
61 75
62 Memory::Write32(address, static_cast<u32>(value + 1)); 76 Memory::Write32(address, static_cast<u32>(value + 1));
63 return SignalToAddress(address, num_to_wake); 77 return SignalToAddressOnly(address, num_to_wake);
64} 78}
65 79
66ResultCode AddressArbiter::ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr address, s32 value, 80ResultCode AddressArbiter::ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr address, s32 value,
diff --git a/src/core/hle/kernel/address_arbiter.h b/src/core/hle/kernel/address_arbiter.h
index ebda75b2a..801ab6dab 100644
--- a/src/core/hle/kernel/address_arbiter.h
+++ b/src/core/hle/kernel/address_arbiter.h
@@ -40,8 +40,15 @@ public:
40 AddressArbiter(AddressArbiter&&) = default; 40 AddressArbiter(AddressArbiter&&) = default;
41 AddressArbiter& operator=(AddressArbiter&&) = delete; 41 AddressArbiter& operator=(AddressArbiter&&) = delete;
42 42
43 /// Signals an address being waited on with a particular signaling type.
44 ResultCode SignalToAddress(VAddr address, SignalType type, s32 value, s32 num_to_wake);
45
46 /// Waits on an address with a particular arbitration type.
47 ResultCode WaitForAddress(VAddr address, ArbitrationType type, s32 value, s64 timeout_ns);
48
49private:
43 /// Signals an address being waited on. 50 /// Signals an address being waited on.
44 ResultCode SignalToAddress(VAddr address, s32 num_to_wake); 51 ResultCode SignalToAddressOnly(VAddr address, s32 num_to_wake);
45 52
46 /// Signals an address being waited on and increments its value if equal to the value argument. 53 /// Signals an address being waited on and increments its value if equal to the value argument.
47 ResultCode IncrementAndSignalToAddressIfEqual(VAddr address, s32 value, s32 num_to_wake); 54 ResultCode IncrementAndSignalToAddressIfEqual(VAddr address, s32 value, s32 num_to_wake);
@@ -51,10 +58,6 @@ public:
51 ResultCode ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr address, s32 value, 58 ResultCode ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr address, s32 value,
52 s32 num_to_wake); 59 s32 num_to_wake);
53 60
54 /// Waits on an address with a particular arbitration type.
55 ResultCode WaitForAddress(VAddr address, ArbitrationType type, s32 value, s64 timeout_ns);
56
57private:
58 /// Waits on an address if the value passed is less than the argument value, 61 /// Waits on an address if the value passed is less than the argument value,
59 /// optionally decrementing. 62 /// optionally decrementing.
60 ResultCode WaitForAddressIfLessThan(VAddr address, s32 value, s64 timeout, 63 ResultCode WaitForAddressIfLessThan(VAddr address, s32 value, s64 timeout,
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 82ceb235c..d44def658 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -1499,22 +1499,9 @@ static ResultCode SignalToAddress(VAddr address, u32 type, s32 value, s32 num_to
1499 return ERR_INVALID_ADDRESS; 1499 return ERR_INVALID_ADDRESS;
1500 } 1500 }
1501 1501
1502 const auto signal_type = static_cast<AddressArbiter::SignalType>(type);
1502 auto& address_arbiter = Core::System::GetInstance().Kernel().AddressArbiter(); 1503 auto& address_arbiter = Core::System::GetInstance().Kernel().AddressArbiter();
1503 switch (static_cast<AddressArbiter::SignalType>(type)) { 1504 return address_arbiter.SignalToAddress(address, signal_type, value, num_to_wake);
1504 case AddressArbiter::SignalType::Signal:
1505 return address_arbiter.SignalToAddress(address, num_to_wake);
1506 case AddressArbiter::SignalType::IncrementAndSignalIfEqual:
1507 return address_arbiter.IncrementAndSignalToAddressIfEqual(address, value, num_to_wake);
1508 case AddressArbiter::SignalType::ModifyByWaitingCountAndSignalIfEqual:
1509 return address_arbiter.ModifyByWaitingCountAndSignalToAddressIfEqual(address, value,
1510 num_to_wake);
1511 default:
1512 LOG_ERROR(Kernel_SVC,
1513 "Invalid signal type, expected Signal, IncrementAndSignalIfEqual "
1514 "or ModifyByWaitingCountAndSignalIfEqual but got {}",
1515 type);
1516 return ERR_INVALID_ENUM_VALUE;
1517 }
1518} 1505}
1519 1506
1520/// This returns the total CPU ticks elapsed since the CPU was powered-on 1507/// This returns the total CPU ticks elapsed since the CPU was powered-on