summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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