summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Lioncash2019-03-07 18:42:44 -0500
committerGravatar Lioncash2019-03-07 23:27:47 -0500
commitb7f331afa3db235db39eca041fef720873f3091a (patch)
treecf2a5f7a3744fb7ed2104bf166aa65433377f1c1
parentkernel/svc: Move address arbiter waiting behind a unified API function (diff)
downloadyuzu-b7f331afa3db235db39eca041fef720873f3091a.tar.gz
yuzu-b7f331afa3db235db39eca041fef720873f3091a.tar.xz
yuzu-b7f331afa3db235db39eca041fef720873f3091a.zip
kernel/svc: Move address arbiter signaling behind a unified API function
Similar to how WaitForAddress was isolated to its own function, we can also move the necessary conditional checking into the address arbiter class itself, allowing us to hide the implementation details of it from public use.
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