diff options
| author | 2018-12-03 18:46:22 -0500 | |
|---|---|---|
| committer | 2018-12-03 18:46:22 -0500 | |
| commit | 9f1ac96afa8f4480e3d7b3112720cf839ccd86d8 (patch) | |
| tree | a7dea90876c2cc0d13364cbd3409bfd071b94e52 | |
| parent | Merge pull request #1842 from lioncash/slot (diff) | |
| parent | svc: Use the current process' handle table for retrieving the process instanc... (diff) | |
| download | yuzu-9f1ac96afa8f4480e3d7b3112720cf839ccd86d8.tar.gz yuzu-9f1ac96afa8f4480e3d7b3112720cf839ccd86d8.tar.xz yuzu-9f1ac96afa8f4480e3d7b3112720cf839ccd86d8.zip | |
Merge pull request #1840 from lioncash/info
svc: Reorganize svcGetInfo, handle more error cases for existing implemented info categories
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 150 |
1 files changed, 100 insertions, 50 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 051b09d00..e86d60c22 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -683,37 +683,110 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id) | |||
| 683 | ThreadTickCount = 0xF0000002, | 683 | ThreadTickCount = 0xF0000002, |
| 684 | }; | 684 | }; |
| 685 | 685 | ||
| 686 | const auto* current_process = Core::CurrentProcess(); | 686 | const auto info_id_type = static_cast<GetInfoType>(info_id); |
| 687 | const auto& vm_manager = current_process->VMManager(); | ||
| 688 | 687 | ||
| 689 | switch (static_cast<GetInfoType>(info_id)) { | 688 | switch (info_id_type) { |
| 690 | case GetInfoType::AllowedCpuIdBitmask: | 689 | case GetInfoType::AllowedCpuIdBitmask: |
| 691 | *result = current_process->GetAllowedProcessorMask(); | ||
| 692 | break; | ||
| 693 | case GetInfoType::AllowedThreadPrioBitmask: | 690 | case GetInfoType::AllowedThreadPrioBitmask: |
| 694 | *result = current_process->GetAllowedThreadPriorityMask(); | ||
| 695 | break; | ||
| 696 | case GetInfoType::MapRegionBaseAddr: | 691 | case GetInfoType::MapRegionBaseAddr: |
| 697 | *result = vm_manager.GetMapRegionBaseAddress(); | ||
| 698 | break; | ||
| 699 | case GetInfoType::MapRegionSize: | 692 | case GetInfoType::MapRegionSize: |
| 700 | *result = vm_manager.GetMapRegionSize(); | ||
| 701 | break; | ||
| 702 | case GetInfoType::HeapRegionBaseAddr: | 693 | case GetInfoType::HeapRegionBaseAddr: |
| 703 | *result = vm_manager.GetHeapRegionBaseAddress(); | ||
| 704 | break; | ||
| 705 | case GetInfoType::HeapRegionSize: | 694 | case GetInfoType::HeapRegionSize: |
| 706 | *result = vm_manager.GetHeapRegionSize(); | 695 | case GetInfoType::ASLRRegionBaseAddr: |
| 707 | break; | 696 | case GetInfoType::ASLRRegionSize: |
| 697 | case GetInfoType::NewMapRegionBaseAddr: | ||
| 698 | case GetInfoType::NewMapRegionSize: | ||
| 708 | case GetInfoType::TotalMemoryUsage: | 699 | case GetInfoType::TotalMemoryUsage: |
| 709 | *result = vm_manager.GetTotalMemoryUsage(); | ||
| 710 | break; | ||
| 711 | case GetInfoType::TotalHeapUsage: | 700 | case GetInfoType::TotalHeapUsage: |
| 712 | *result = vm_manager.GetTotalHeapUsage(); | 701 | case GetInfoType::IsVirtualAddressMemoryEnabled: |
| 713 | break; | 702 | case GetInfoType::PersonalMmHeapUsage: |
| 703 | case GetInfoType::TitleId: | ||
| 704 | case GetInfoType::UserExceptionContextAddr: { | ||
| 705 | if (info_sub_id != 0) { | ||
| 706 | return ERR_INVALID_ENUM_VALUE; | ||
| 707 | } | ||
| 708 | |||
| 709 | const auto& current_process_handle_table = Core::CurrentProcess()->GetHandleTable(); | ||
| 710 | const auto process = current_process_handle_table.Get<Process>(static_cast<Handle>(handle)); | ||
| 711 | if (!process) { | ||
| 712 | return ERR_INVALID_HANDLE; | ||
| 713 | } | ||
| 714 | |||
| 715 | switch (info_id_type) { | ||
| 716 | case GetInfoType::AllowedCpuIdBitmask: | ||
| 717 | *result = process->GetAllowedProcessorMask(); | ||
| 718 | return RESULT_SUCCESS; | ||
| 719 | |||
| 720 | case GetInfoType::AllowedThreadPrioBitmask: | ||
| 721 | *result = process->GetAllowedThreadPriorityMask(); | ||
| 722 | return RESULT_SUCCESS; | ||
| 723 | |||
| 724 | case GetInfoType::MapRegionBaseAddr: | ||
| 725 | *result = process->VMManager().GetMapRegionBaseAddress(); | ||
| 726 | return RESULT_SUCCESS; | ||
| 727 | |||
| 728 | case GetInfoType::MapRegionSize: | ||
| 729 | *result = process->VMManager().GetMapRegionSize(); | ||
| 730 | return RESULT_SUCCESS; | ||
| 731 | |||
| 732 | case GetInfoType::HeapRegionBaseAddr: | ||
| 733 | *result = process->VMManager().GetHeapRegionBaseAddress(); | ||
| 734 | return RESULT_SUCCESS; | ||
| 735 | |||
| 736 | case GetInfoType::HeapRegionSize: | ||
| 737 | *result = process->VMManager().GetHeapRegionSize(); | ||
| 738 | return RESULT_SUCCESS; | ||
| 739 | |||
| 740 | case GetInfoType::ASLRRegionBaseAddr: | ||
| 741 | *result = process->VMManager().GetASLRRegionBaseAddress(); | ||
| 742 | return RESULT_SUCCESS; | ||
| 743 | |||
| 744 | case GetInfoType::ASLRRegionSize: | ||
| 745 | *result = process->VMManager().GetASLRRegionSize(); | ||
| 746 | return RESULT_SUCCESS; | ||
| 747 | |||
| 748 | case GetInfoType::NewMapRegionBaseAddr: | ||
| 749 | *result = process->VMManager().GetNewMapRegionBaseAddress(); | ||
| 750 | return RESULT_SUCCESS; | ||
| 751 | |||
| 752 | case GetInfoType::NewMapRegionSize: | ||
| 753 | *result = process->VMManager().GetNewMapRegionSize(); | ||
| 754 | return RESULT_SUCCESS; | ||
| 755 | |||
| 756 | case GetInfoType::TotalMemoryUsage: | ||
| 757 | *result = process->VMManager().GetTotalMemoryUsage(); | ||
| 758 | return RESULT_SUCCESS; | ||
| 759 | |||
| 760 | case GetInfoType::TotalHeapUsage: | ||
| 761 | *result = process->VMManager().GetTotalHeapUsage(); | ||
| 762 | return RESULT_SUCCESS; | ||
| 763 | |||
| 764 | case GetInfoType::IsVirtualAddressMemoryEnabled: | ||
| 765 | *result = process->IsVirtualMemoryEnabled(); | ||
| 766 | return RESULT_SUCCESS; | ||
| 767 | |||
| 768 | case GetInfoType::TitleId: | ||
| 769 | *result = process->GetTitleID(); | ||
| 770 | return RESULT_SUCCESS; | ||
| 771 | |||
| 772 | case GetInfoType::UserExceptionContextAddr: | ||
| 773 | LOG_WARNING(Kernel_SVC, | ||
| 774 | "(STUBBED) Attempted to query user exception context address, returned 0"); | ||
| 775 | *result = 0; | ||
| 776 | return RESULT_SUCCESS; | ||
| 777 | |||
| 778 | default: | ||
| 779 | break; | ||
| 780 | } | ||
| 781 | |||
| 782 | LOG_WARNING(Kernel_SVC, "(STUBBED) Unimplemented svcGetInfo id=0x{:016X}", info_id); | ||
| 783 | return ERR_INVALID_ENUM_VALUE; | ||
| 784 | } | ||
| 785 | |||
| 714 | case GetInfoType::IsCurrentProcessBeingDebugged: | 786 | case GetInfoType::IsCurrentProcessBeingDebugged: |
| 715 | *result = 0; | 787 | *result = 0; |
| 716 | break; | 788 | return RESULT_SUCCESS; |
| 789 | |||
| 717 | case GetInfoType::RandomEntropy: | 790 | case GetInfoType::RandomEntropy: |
| 718 | if (handle != 0) { | 791 | if (handle != 0) { |
| 719 | LOG_ERROR(Kernel_SVC, "Process Handle is non zero, expected 0 result but got {:016X}", | 792 | LOG_ERROR(Kernel_SVC, "Process Handle is non zero, expected 0 result but got {:016X}", |
| @@ -727,37 +800,15 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id) | |||
| 727 | return ERR_INVALID_COMBINATION; | 800 | return ERR_INVALID_COMBINATION; |
| 728 | } | 801 | } |
| 729 | 802 | ||
| 730 | *result = current_process->GetRandomEntropy(info_sub_id); | 803 | *result = Core::CurrentProcess()->GetRandomEntropy(info_sub_id); |
| 731 | return RESULT_SUCCESS; | 804 | return RESULT_SUCCESS; |
| 732 | break; | 805 | |
| 733 | case GetInfoType::ASLRRegionBaseAddr: | ||
| 734 | *result = vm_manager.GetASLRRegionBaseAddress(); | ||
| 735 | break; | ||
| 736 | case GetInfoType::ASLRRegionSize: | ||
| 737 | *result = vm_manager.GetASLRRegionSize(); | ||
| 738 | break; | ||
| 739 | case GetInfoType::NewMapRegionBaseAddr: | ||
| 740 | *result = vm_manager.GetNewMapRegionBaseAddress(); | ||
| 741 | break; | ||
| 742 | case GetInfoType::NewMapRegionSize: | ||
| 743 | *result = vm_manager.GetNewMapRegionSize(); | ||
| 744 | break; | ||
| 745 | case GetInfoType::IsVirtualAddressMemoryEnabled: | ||
| 746 | *result = current_process->IsVirtualMemoryEnabled(); | ||
| 747 | break; | ||
| 748 | case GetInfoType::TitleId: | ||
| 749 | *result = current_process->GetTitleID(); | ||
| 750 | break; | ||
| 751 | case GetInfoType::PrivilegedProcessId: | 806 | case GetInfoType::PrivilegedProcessId: |
| 752 | LOG_WARNING(Kernel_SVC, | 807 | LOG_WARNING(Kernel_SVC, |
| 753 | "(STUBBED) Attempted to query privileged process id bounds, returned 0"); | 808 | "(STUBBED) Attempted to query privileged process id bounds, returned 0"); |
| 754 | *result = 0; | 809 | *result = 0; |
| 755 | break; | 810 | return RESULT_SUCCESS; |
| 756 | case GetInfoType::UserExceptionContextAddr: | 811 | |
| 757 | LOG_WARNING(Kernel_SVC, | ||
| 758 | "(STUBBED) Attempted to query user exception context address, returned 0"); | ||
| 759 | *result = 0; | ||
| 760 | break; | ||
| 761 | case GetInfoType::ThreadTickCount: { | 812 | case GetInfoType::ThreadTickCount: { |
| 762 | constexpr u64 num_cpus = 4; | 813 | constexpr u64 num_cpus = 4; |
| 763 | if (info_sub_id != 0xFFFFFFFFFFFFFFFF && info_sub_id >= num_cpus) { | 814 | if (info_sub_id != 0xFFFFFFFFFFFFFFFF && info_sub_id >= num_cpus) { |
| @@ -767,7 +818,7 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id) | |||
| 767 | } | 818 | } |
| 768 | 819 | ||
| 769 | const auto thread = | 820 | const auto thread = |
| 770 | current_process->GetHandleTable().Get<Thread>(static_cast<Handle>(handle)); | 821 | Core::CurrentProcess()->GetHandleTable().Get<Thread>(static_cast<Handle>(handle)); |
| 771 | if (!thread) { | 822 | if (!thread) { |
| 772 | LOG_ERROR(Kernel_SVC, "Thread handle does not exist, handle=0x{:08X}", | 823 | LOG_ERROR(Kernel_SVC, "Thread handle does not exist, handle=0x{:08X}", |
| 773 | static_cast<Handle>(handle)); | 824 | static_cast<Handle>(handle)); |
| @@ -790,14 +841,13 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id) | |||
| 790 | } | 841 | } |
| 791 | 842 | ||
| 792 | *result = out_ticks; | 843 | *result = out_ticks; |
| 793 | break; | 844 | return RESULT_SUCCESS; |
| 794 | } | 845 | } |
| 846 | |||
| 795 | default: | 847 | default: |
| 796 | LOG_WARNING(Kernel_SVC, "(STUBBED) Unimplemented svcGetInfo id=0x{:016X}", info_id); | 848 | LOG_WARNING(Kernel_SVC, "(STUBBED) Unimplemented svcGetInfo id=0x{:016X}", info_id); |
| 797 | return ERR_INVALID_ENUM_VALUE; | 849 | return ERR_INVALID_ENUM_VALUE; |
| 798 | } | 850 | } |
| 799 | |||
| 800 | return RESULT_SUCCESS; | ||
| 801 | } | 851 | } |
| 802 | 852 | ||
| 803 | /// Sets the thread activity | 853 | /// Sets the thread activity |