diff options
Diffstat (limited to '')
| -rw-r--r-- | src/core/hle/kernel/address_arbiter.cpp | 18 | ||||
| -rw-r--r-- | src/core/hle/kernel/address_arbiter.h | 13 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 17 |
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_ | |||
| 42 | AddressArbiter::AddressArbiter(Core::System& system) : system{system} {} | 42 | AddressArbiter::AddressArbiter(Core::System& system) : system{system} {} |
| 43 | AddressArbiter::~AddressArbiter() = default; | 43 | AddressArbiter::~AddressArbiter() = default; |
| 44 | 44 | ||
| 45 | ResultCode AddressArbiter::SignalToAddress(VAddr address, s32 num_to_wake) { | 45 | ResultCode 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 | |||
| 59 | ResultCode 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 | ||
| 66 | ResultCode AddressArbiter::ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr address, s32 value, | 80 | ResultCode 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 | |||
| 49 | private: | ||
| 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 | |||
| 57 | private: | ||
| 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 |