diff options
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 2d8fa6070..95ce2205a 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -693,7 +693,7 @@ static ResultCode SignalProcessWideKey(VAddr condition_variable_addr, s32 target | |||
| 693 | // Wait for an address (via Address Arbiter) | 693 | // Wait for an address (via Address Arbiter) |
| 694 | static ResultCode WaitForAddress(VAddr address, u32 type, s32 value, s64 timeout) { | 694 | static ResultCode WaitForAddress(VAddr address, u32 type, s32 value, s64 timeout) { |
| 695 | NGLOG_WARNING(Kernel_SVC, "called, address=0x{:X}, type=0x{:X}, value=0x{:X}, timeout={}", | 695 | NGLOG_WARNING(Kernel_SVC, "called, address=0x{:X}, type=0x{:X}, value=0x{:X}, timeout={}", |
| 696 | address, type, value, timeout); | 696 | address, type, value, timeout); |
| 697 | // If the passed address is a kernel virtual address, return invalid memory state. | 697 | // If the passed address is a kernel virtual address, return invalid memory state. |
| 698 | if ((address + 0x8000000000LL) < 0x7FFFE00000LL) { | 698 | if ((address + 0x8000000000LL) < 0x7FFFE00000LL) { |
| 699 | return ERR_INVALID_ADDRESS_STATE; | 699 | return ERR_INVALID_ADDRESS_STATE; |
| @@ -704,21 +704,22 @@ static ResultCode WaitForAddress(VAddr address, u32 type, s32 value, s64 timeout | |||
| 704 | } | 704 | } |
| 705 | 705 | ||
| 706 | switch ((AddressArbiter::ArbitrationType)type) { | 706 | switch ((AddressArbiter::ArbitrationType)type) { |
| 707 | case AddressArbiter::ArbitrationType::WaitIfLessThan: | 707 | case AddressArbiter::ArbitrationType::WaitIfLessThan: |
| 708 | return AddressArbiter::WaitForAddressIfLessThan(address, value, timeout, false); | 708 | return AddressArbiter::WaitForAddressIfLessThan(address, value, timeout, false); |
| 709 | case AddressArbiter::ArbitrationType::DecrementAndWaitIfLessThan: | 709 | case AddressArbiter::ArbitrationType::DecrementAndWaitIfLessThan: |
| 710 | return AddressArbiter::WaitForAddressIfLessThan(address, value, timeout, true); | 710 | return AddressArbiter::WaitForAddressIfLessThan(address, value, timeout, true); |
| 711 | case AddressArbiter::ArbitrationType::WaitIfEqual: | 711 | case AddressArbiter::ArbitrationType::WaitIfEqual: |
| 712 | return AddressArbiter::WaitForAddressIfEqual(address, value, timeout); | 712 | return AddressArbiter::WaitForAddressIfEqual(address, value, timeout); |
| 713 | default: | 713 | default: |
| 714 | return ERR_INVALID_ENUM_VALUE; | 714 | return ERR_INVALID_ENUM_VALUE; |
| 715 | } | 715 | } |
| 716 | } | 716 | } |
| 717 | 717 | ||
| 718 | // Signals to an address (via Address Arbiter) | 718 | // Signals to an address (via Address Arbiter) |
| 719 | static ResultCode SignalToAddress(VAddr address, u32 type, s32 value, s32 num_to_wake) { | 719 | static ResultCode SignalToAddress(VAddr address, u32 type, s32 value, s32 num_to_wake) { |
| 720 | NGLOG_WARNING(Kernel_SVC, "called, address=0x{:X}, type=0x{:X}, value=0x{:X}, num_to_wake=0x{:X}", | 720 | NGLOG_WARNING(Kernel_SVC, |
| 721 | address, type, value, num_to_wake); | 721 | "called, address=0x{:X}, type=0x{:X}, value=0x{:X}, num_to_wake=0x{:X}", address, |
| 722 | type, value, num_to_wake); | ||
| 722 | // If the passed address is a kernel virtual address, return invalid memory state. | 723 | // If the passed address is a kernel virtual address, return invalid memory state. |
| 723 | if ((address + 0x8000000000LL) < 0x7FFFE00000LL) { | 724 | if ((address + 0x8000000000LL) < 0x7FFFE00000LL) { |
| 724 | return ERR_INVALID_ADDRESS_STATE; | 725 | return ERR_INVALID_ADDRESS_STATE; |
| @@ -729,14 +730,15 @@ static ResultCode SignalToAddress(VAddr address, u32 type, s32 value, s32 num_to | |||
| 729 | } | 730 | } |
| 730 | 731 | ||
| 731 | switch ((AddressArbiter::SignalType)type) { | 732 | switch ((AddressArbiter::SignalType)type) { |
| 732 | case AddressArbiter::SignalType::Signal: | 733 | case AddressArbiter::SignalType::Signal: |
| 733 | return AddressArbiter::SignalToAddress(address, num_to_wake); | 734 | return AddressArbiter::SignalToAddress(address, num_to_wake); |
| 734 | case AddressArbiter::SignalType::IncrementAndSignalIfEqual: | 735 | case AddressArbiter::SignalType::IncrementAndSignalIfEqual: |
| 735 | return AddressArbiter::IncrementAndSignalToAddressIfEqual(address, value, num_to_wake); | 736 | return AddressArbiter::IncrementAndSignalToAddressIfEqual(address, value, num_to_wake); |
| 736 | case AddressArbiter::SignalType::ModifyByWaitingCountAndSignalIfEqual: | 737 | case AddressArbiter::SignalType::ModifyByWaitingCountAndSignalIfEqual: |
| 737 | return AddressArbiter::ModifyByWaitingCountAndSignalToAddressIfEqual(address, value, num_to_wake); | 738 | return AddressArbiter::ModifyByWaitingCountAndSignalToAddressIfEqual(address, value, |
| 738 | default: | 739 | num_to_wake); |
| 739 | return ERR_INVALID_ENUM_VALUE; | 740 | default: |
| 741 | return ERR_INVALID_ENUM_VALUE; | ||
| 740 | } | 742 | } |
| 741 | } | 743 | } |
| 742 | 744 | ||