diff options
Diffstat (limited to 'src/core/hle')
| -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)          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 | 
