summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/svc.cpp150
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