summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Lioncash2018-12-02 01:37:15 -0500
committerGravatar Lioncash2018-12-02 03:40:10 -0500
commit6712e7402cb6535a6a308bc62f523826347d047a (patch)
treecbdeee68c5d2120435d282868475d23f1675e54d /src
parentFix debug build (diff)
downloadyuzu-6712e7402cb6535a6a308bc62f523826347d047a.tar.gz
yuzu-6712e7402cb6535a6a308bc62f523826347d047a.tar.xz
yuzu-6712e7402cb6535a6a308bc62f523826347d047a.zip
svc: Reorganize svcGetInfo, handle more error cases for existing implemented info categories
Our implementation of svcGetInfo was slightly incorrect in that we weren't doing proper error checking everywhere. Instead, reorganize it to be similar to how the kernel seems to do it.
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/svc.cpp149
1 files changed, 99 insertions, 50 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 3339777c1..2a7477247 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -682,37 +682,109 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)
682 ThreadTickCount = 0xF0000002, 682 ThreadTickCount = 0xF0000002,
683 }; 683 };
684 684
685 const auto* current_process = Core::CurrentProcess(); 685 const auto info_id_type = static_cast<GetInfoType>(info_id);
686 const auto& vm_manager = current_process->VMManager();
687 686
688 switch (static_cast<GetInfoType>(info_id)) { 687 switch (info_id_type) {
689 case GetInfoType::AllowedCpuIdBitmask: 688 case GetInfoType::AllowedCpuIdBitmask:
690 *result = current_process->GetAllowedProcessorMask();
691 break;
692 case GetInfoType::AllowedThreadPrioBitmask: 689 case GetInfoType::AllowedThreadPrioBitmask:
693 *result = current_process->GetAllowedThreadPriorityMask();
694 break;
695 case GetInfoType::MapRegionBaseAddr: 690 case GetInfoType::MapRegionBaseAddr:
696 *result = vm_manager.GetMapRegionBaseAddress();
697 break;
698 case GetInfoType::MapRegionSize: 691 case GetInfoType::MapRegionSize:
699 *result = vm_manager.GetMapRegionSize();
700 break;
701 case GetInfoType::HeapRegionBaseAddr: 692 case GetInfoType::HeapRegionBaseAddr:
702 *result = vm_manager.GetHeapRegionBaseAddress();
703 break;
704 case GetInfoType::HeapRegionSize: 693 case GetInfoType::HeapRegionSize:
705 *result = vm_manager.GetHeapRegionSize(); 694 case GetInfoType::ASLRRegionBaseAddr:
706 break; 695 case GetInfoType::ASLRRegionSize:
696 case GetInfoType::NewMapRegionBaseAddr:
697 case GetInfoType::NewMapRegionSize:
707 case GetInfoType::TotalMemoryUsage: 698 case GetInfoType::TotalMemoryUsage:
708 *result = vm_manager.GetTotalMemoryUsage();
709 break;
710 case GetInfoType::TotalHeapUsage: 699 case GetInfoType::TotalHeapUsage:
711 *result = vm_manager.GetTotalHeapUsage(); 700 case GetInfoType::IsVirtualAddressMemoryEnabled:
712 break; 701 case GetInfoType::PersonalMmHeapUsage:
702 case GetInfoType::TitleId:
703 case GetInfoType::UserExceptionContextAddr: {
704 if (info_sub_id != 0) {
705 return ERR_INVALID_ENUM_VALUE;
706 }
707
708 const auto* process = Core::CurrentProcess();
709 if (!process) {
710 return ERR_INVALID_HANDLE;
711 }
712
713 switch (info_id_type) {
714 case GetInfoType::AllowedCpuIdBitmask:
715 *result = process->GetAllowedProcessorMask();
716 return RESULT_SUCCESS;
717
718 case GetInfoType::AllowedThreadPrioBitmask:
719 *result = process->GetAllowedThreadPriorityMask();
720 return RESULT_SUCCESS;
721
722 case GetInfoType::MapRegionBaseAddr:
723 *result = process->VMManager().GetMapRegionBaseAddress();
724 return RESULT_SUCCESS;
725
726 case GetInfoType::MapRegionSize:
727 *result = process->VMManager().GetMapRegionSize();
728 return RESULT_SUCCESS;
729
730 case GetInfoType::HeapRegionBaseAddr:
731 *result = process->VMManager().GetHeapRegionBaseAddress();
732 return RESULT_SUCCESS;
733
734 case GetInfoType::HeapRegionSize:
735 *result = process->VMManager().GetHeapRegionSize();
736 return RESULT_SUCCESS;
737
738 case GetInfoType::ASLRRegionBaseAddr:
739 *result = process->VMManager().GetASLRRegionBaseAddress();
740 return RESULT_SUCCESS;
741
742 case GetInfoType::ASLRRegionSize:
743 *result = process->VMManager().GetASLRRegionSize();
744 return RESULT_SUCCESS;
745
746 case GetInfoType::NewMapRegionBaseAddr:
747 *result = process->VMManager().GetNewMapRegionBaseAddress();
748 return RESULT_SUCCESS;
749
750 case GetInfoType::NewMapRegionSize:
751 *result = process->VMManager().GetNewMapRegionSize();
752 return RESULT_SUCCESS;
753
754 case GetInfoType::TotalMemoryUsage:
755 *result = process->VMManager().GetTotalMemoryUsage();
756 return RESULT_SUCCESS;
757
758 case GetInfoType::TotalHeapUsage:
759 *result = process->VMManager().GetTotalHeapUsage();
760 return RESULT_SUCCESS;
761
762 case GetInfoType::IsVirtualAddressMemoryEnabled:
763 *result = process->IsVirtualMemoryEnabled();
764 return RESULT_SUCCESS;
765
766 case GetInfoType::TitleId:
767 *result = process->GetTitleID();
768 return RESULT_SUCCESS;
769
770 case GetInfoType::UserExceptionContextAddr:
771 LOG_WARNING(Kernel_SVC,
772 "(STUBBED) Attempted to query user exception context address, returned 0");
773 *result = 0;
774 return RESULT_SUCCESS;
775
776 default:
777 break;
778 }
779
780 LOG_WARNING(Kernel_SVC, "(STUBBED) Unimplemented svcGetInfo id=0x{:016X}", info_id);
781 return ERR_INVALID_ENUM_VALUE;
782 }
783
713 case GetInfoType::IsCurrentProcessBeingDebugged: 784 case GetInfoType::IsCurrentProcessBeingDebugged:
714 *result = 0; 785 *result = 0;
715 break; 786 return RESULT_SUCCESS;
787
716 case GetInfoType::RandomEntropy: 788 case GetInfoType::RandomEntropy:
717 if (handle != 0) { 789 if (handle != 0) {
718 LOG_ERROR(Kernel_SVC, "Process Handle is non zero, expected 0 result but got {:016X}", 790 LOG_ERROR(Kernel_SVC, "Process Handle is non zero, expected 0 result but got {:016X}",
@@ -726,37 +798,15 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)
726 return ERR_INVALID_COMBINATION; 798 return ERR_INVALID_COMBINATION;
727 } 799 }
728 800
729 *result = current_process->GetRandomEntropy(info_sub_id); 801 *result = Core::CurrentProcess()->GetRandomEntropy(info_sub_id);
730 return RESULT_SUCCESS; 802 return RESULT_SUCCESS;
731 break; 803
732 case GetInfoType::ASLRRegionBaseAddr:
733 *result = vm_manager.GetASLRRegionBaseAddress();
734 break;
735 case GetInfoType::ASLRRegionSize:
736 *result = vm_manager.GetASLRRegionSize();
737 break;
738 case GetInfoType::NewMapRegionBaseAddr:
739 *result = vm_manager.GetNewMapRegionBaseAddress();
740 break;
741 case GetInfoType::NewMapRegionSize:
742 *result = vm_manager.GetNewMapRegionSize();
743 break;
744 case GetInfoType::IsVirtualAddressMemoryEnabled:
745 *result = current_process->IsVirtualMemoryEnabled();
746 break;
747 case GetInfoType::TitleId:
748 *result = current_process->GetTitleID();
749 break;
750 case GetInfoType::PrivilegedProcessId: 804 case GetInfoType::PrivilegedProcessId:
751 LOG_WARNING(Kernel_SVC, 805 LOG_WARNING(Kernel_SVC,
752 "(STUBBED) Attempted to query privileged process id bounds, returned 0"); 806 "(STUBBED) Attempted to query privileged process id bounds, returned 0");
753 *result = 0; 807 *result = 0;
754 break; 808 return RESULT_SUCCESS;
755 case GetInfoType::UserExceptionContextAddr: 809
756 LOG_WARNING(Kernel_SVC,
757 "(STUBBED) Attempted to query user exception context address, returned 0");
758 *result = 0;
759 break;
760 case GetInfoType::ThreadTickCount: { 810 case GetInfoType::ThreadTickCount: {
761 constexpr u64 num_cpus = 4; 811 constexpr u64 num_cpus = 4;
762 if (info_sub_id != 0xFFFFFFFFFFFFFFFF && info_sub_id >= num_cpus) { 812 if (info_sub_id != 0xFFFFFFFFFFFFFFFF && info_sub_id >= num_cpus) {
@@ -766,7 +816,7 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)
766 } 816 }
767 817
768 const auto thread = 818 const auto thread =
769 current_process->GetHandleTable().Get<Thread>(static_cast<Handle>(handle)); 819 Core::CurrentProcess()->GetHandleTable().Get<Thread>(static_cast<Handle>(handle));
770 if (!thread) { 820 if (!thread) {
771 LOG_ERROR(Kernel_SVC, "Thread handle does not exist, handle=0x{:08X}", 821 LOG_ERROR(Kernel_SVC, "Thread handle does not exist, handle=0x{:08X}",
772 static_cast<Handle>(handle)); 822 static_cast<Handle>(handle));
@@ -789,14 +839,13 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)
789 } 839 }
790 840
791 *result = out_ticks; 841 *result = out_ticks;
792 break; 842 return RESULT_SUCCESS;
793 } 843 }
844
794 default: 845 default:
795 LOG_WARNING(Kernel_SVC, "(STUBBED) Unimplemented svcGetInfo id=0x{:016X}", info_id); 846 LOG_WARNING(Kernel_SVC, "(STUBBED) Unimplemented svcGetInfo id=0x{:016X}", info_id);
796 return ERR_INVALID_ENUM_VALUE; 847 return ERR_INVALID_ENUM_VALUE;
797 } 848 }
798
799 return RESULT_SUCCESS;
800} 849}
801 850
802/// Sets the thread activity 851/// Sets the thread activity