|
|
|
@ -683,37 +683,110 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id) |
|
|
|
ThreadTickCount = 0xF0000002, |
|
|
|
}; |
|
|
|
|
|
|
|
const auto* current_process = Core::CurrentProcess(); |
|
|
|
const auto& vm_manager = current_process->VMManager(); |
|
|
|
const auto info_id_type = static_cast<GetInfoType>(info_id); |
|
|
|
|
|
|
|
switch (static_cast<GetInfoType>(info_id)) { |
|
|
|
switch (info_id_type) { |
|
|
|
case GetInfoType::AllowedCpuIdBitmask: |
|
|
|
*result = current_process->GetAllowedProcessorMask(); |
|
|
|
break; |
|
|
|
case GetInfoType::AllowedThreadPrioBitmask: |
|
|
|
*result = current_process->GetAllowedThreadPriorityMask(); |
|
|
|
break; |
|
|
|
case GetInfoType::MapRegionBaseAddr: |
|
|
|
*result = vm_manager.GetMapRegionBaseAddress(); |
|
|
|
break; |
|
|
|
case GetInfoType::MapRegionSize: |
|
|
|
*result = vm_manager.GetMapRegionSize(); |
|
|
|
break; |
|
|
|
case GetInfoType::HeapRegionBaseAddr: |
|
|
|
*result = vm_manager.GetHeapRegionBaseAddress(); |
|
|
|
break; |
|
|
|
case GetInfoType::HeapRegionSize: |
|
|
|
*result = vm_manager.GetHeapRegionSize(); |
|
|
|
break; |
|
|
|
case GetInfoType::ASLRRegionBaseAddr: |
|
|
|
case GetInfoType::ASLRRegionSize: |
|
|
|
case GetInfoType::NewMapRegionBaseAddr: |
|
|
|
case GetInfoType::NewMapRegionSize: |
|
|
|
case GetInfoType::TotalMemoryUsage: |
|
|
|
*result = vm_manager.GetTotalMemoryUsage(); |
|
|
|
break; |
|
|
|
case GetInfoType::TotalHeapUsage: |
|
|
|
*result = vm_manager.GetTotalHeapUsage(); |
|
|
|
break; |
|
|
|
case GetInfoType::IsVirtualAddressMemoryEnabled: |
|
|
|
case GetInfoType::PersonalMmHeapUsage: |
|
|
|
case GetInfoType::TitleId: |
|
|
|
case GetInfoType::UserExceptionContextAddr: { |
|
|
|
if (info_sub_id != 0) { |
|
|
|
return ERR_INVALID_ENUM_VALUE; |
|
|
|
} |
|
|
|
|
|
|
|
const auto& current_process_handle_table = Core::CurrentProcess()->GetHandleTable(); |
|
|
|
const auto process = current_process_handle_table.Get<Process>(static_cast<Handle>(handle)); |
|
|
|
if (!process) { |
|
|
|
return ERR_INVALID_HANDLE; |
|
|
|
} |
|
|
|
|
|
|
|
switch (info_id_type) { |
|
|
|
case GetInfoType::AllowedCpuIdBitmask: |
|
|
|
*result = process->GetAllowedProcessorMask(); |
|
|
|
return RESULT_SUCCESS; |
|
|
|
|
|
|
|
case GetInfoType::AllowedThreadPrioBitmask: |
|
|
|
*result = process->GetAllowedThreadPriorityMask(); |
|
|
|
return RESULT_SUCCESS; |
|
|
|
|
|
|
|
case GetInfoType::MapRegionBaseAddr: |
|
|
|
*result = process->VMManager().GetMapRegionBaseAddress(); |
|
|
|
return RESULT_SUCCESS; |
|
|
|
|
|
|
|
case GetInfoType::MapRegionSize: |
|
|
|
*result = process->VMManager().GetMapRegionSize(); |
|
|
|
return RESULT_SUCCESS; |
|
|
|
|
|
|
|
case GetInfoType::HeapRegionBaseAddr: |
|
|
|
*result = process->VMManager().GetHeapRegionBaseAddress(); |
|
|
|
return RESULT_SUCCESS; |
|
|
|
|
|
|
|
case GetInfoType::HeapRegionSize: |
|
|
|
*result = process->VMManager().GetHeapRegionSize(); |
|
|
|
return RESULT_SUCCESS; |
|
|
|
|
|
|
|
case GetInfoType::ASLRRegionBaseAddr: |
|
|
|
*result = process->VMManager().GetASLRRegionBaseAddress(); |
|
|
|
return RESULT_SUCCESS; |
|
|
|
|
|
|
|
case GetInfoType::ASLRRegionSize: |
|
|
|
*result = process->VMManager().GetASLRRegionSize(); |
|
|
|
return RESULT_SUCCESS; |
|
|
|
|
|
|
|
case GetInfoType::NewMapRegionBaseAddr: |
|
|
|
*result = process->VMManager().GetNewMapRegionBaseAddress(); |
|
|
|
return RESULT_SUCCESS; |
|
|
|
|
|
|
|
case GetInfoType::NewMapRegionSize: |
|
|
|
*result = process->VMManager().GetNewMapRegionSize(); |
|
|
|
return RESULT_SUCCESS; |
|
|
|
|
|
|
|
case GetInfoType::TotalMemoryUsage: |
|
|
|
*result = process->VMManager().GetTotalMemoryUsage(); |
|
|
|
return RESULT_SUCCESS; |
|
|
|
|
|
|
|
case GetInfoType::TotalHeapUsage: |
|
|
|
*result = process->VMManager().GetTotalHeapUsage(); |
|
|
|
return RESULT_SUCCESS; |
|
|
|
|
|
|
|
case GetInfoType::IsVirtualAddressMemoryEnabled: |
|
|
|
*result = process->IsVirtualMemoryEnabled(); |
|
|
|
return RESULT_SUCCESS; |
|
|
|
|
|
|
|
case GetInfoType::TitleId: |
|
|
|
*result = process->GetTitleID(); |
|
|
|
return RESULT_SUCCESS; |
|
|
|
|
|
|
|
case GetInfoType::UserExceptionContextAddr: |
|
|
|
LOG_WARNING(Kernel_SVC, |
|
|
|
"(STUBBED) Attempted to query user exception context address, returned 0"); |
|
|
|
*result = 0; |
|
|
|
return RESULT_SUCCESS; |
|
|
|
|
|
|
|
default: |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
LOG_WARNING(Kernel_SVC, "(STUBBED) Unimplemented svcGetInfo id=0x{:016X}", info_id); |
|
|
|
return ERR_INVALID_ENUM_VALUE; |
|
|
|
} |
|
|
|
|
|
|
|
case GetInfoType::IsCurrentProcessBeingDebugged: |
|
|
|
*result = 0; |
|
|
|
break; |
|
|
|
return RESULT_SUCCESS; |
|
|
|
|
|
|
|
case GetInfoType::RandomEntropy: |
|
|
|
if (handle != 0) { |
|
|
|
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) |
|
|
|
return ERR_INVALID_COMBINATION; |
|
|
|
} |
|
|
|
|
|
|
|
*result = current_process->GetRandomEntropy(info_sub_id); |
|
|
|
*result = Core::CurrentProcess()->GetRandomEntropy(info_sub_id); |
|
|
|
return RESULT_SUCCESS; |
|
|
|
break; |
|
|
|
case GetInfoType::ASLRRegionBaseAddr: |
|
|
|
*result = vm_manager.GetASLRRegionBaseAddress(); |
|
|
|
break; |
|
|
|
case GetInfoType::ASLRRegionSize: |
|
|
|
*result = vm_manager.GetASLRRegionSize(); |
|
|
|
break; |
|
|
|
case GetInfoType::NewMapRegionBaseAddr: |
|
|
|
*result = vm_manager.GetNewMapRegionBaseAddress(); |
|
|
|
break; |
|
|
|
case GetInfoType::NewMapRegionSize: |
|
|
|
*result = vm_manager.GetNewMapRegionSize(); |
|
|
|
break; |
|
|
|
case GetInfoType::IsVirtualAddressMemoryEnabled: |
|
|
|
*result = current_process->IsVirtualMemoryEnabled(); |
|
|
|
break; |
|
|
|
case GetInfoType::TitleId: |
|
|
|
*result = current_process->GetTitleID(); |
|
|
|
break; |
|
|
|
|
|
|
|
case GetInfoType::PrivilegedProcessId: |
|
|
|
LOG_WARNING(Kernel_SVC, |
|
|
|
"(STUBBED) Attempted to query privileged process id bounds, returned 0"); |
|
|
|
*result = 0; |
|
|
|
break; |
|
|
|
case GetInfoType::UserExceptionContextAddr: |
|
|
|
LOG_WARNING(Kernel_SVC, |
|
|
|
"(STUBBED) Attempted to query user exception context address, returned 0"); |
|
|
|
*result = 0; |
|
|
|
break; |
|
|
|
return RESULT_SUCCESS; |
|
|
|
|
|
|
|
case GetInfoType::ThreadTickCount: { |
|
|
|
constexpr u64 num_cpus = 4; |
|
|
|
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) |
|
|
|
} |
|
|
|
|
|
|
|
const auto thread = |
|
|
|
current_process->GetHandleTable().Get<Thread>(static_cast<Handle>(handle)); |
|
|
|
Core::CurrentProcess()->GetHandleTable().Get<Thread>(static_cast<Handle>(handle)); |
|
|
|
if (!thread) { |
|
|
|
LOG_ERROR(Kernel_SVC, "Thread handle does not exist, handle=0x{:08X}", |
|
|
|
static_cast<Handle>(handle)); |
|
|
|
@ -790,14 +841,13 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id) |
|
|
|
} |
|
|
|
|
|
|
|
*result = out_ticks; |
|
|
|
break; |
|
|
|
return RESULT_SUCCESS; |
|
|
|
} |
|
|
|
|
|
|
|
default: |
|
|
|
LOG_WARNING(Kernel_SVC, "(STUBBED) Unimplemented svcGetInfo id=0x{:016X}", info_id); |
|
|
|
return ERR_INVALID_ENUM_VALUE; |
|
|
|
} |
|
|
|
|
|
|
|
return RESULT_SUCCESS; |
|
|
|
} |
|
|
|
|
|
|
|
/// Sets the thread activity
|
|
|
|
|