diff options
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 37 | 
1 files changed, 36 insertions, 1 deletions
| diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 9d1b000b5..1f19d5576 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -1424,6 +1424,41 @@ static ResultCode GetResourceLimitCurrentValue(u64* out_value, Handle resource_l      return RESULT_SUCCESS;  } +static ResultCode SetResourceLimitLimitValue(Handle resource_limit, u32 resource_type, u64 value) { +    LOG_DEBUG(Kernel_SVC, "called. Handle={:08X}, Resource type={}, Value={}", resource_limit, +              resource_type, value); + +    const auto type = static_cast<ResourceType>(resource_type); +    if (!IsValidResourceType(type)) { +        LOG_ERROR(Kernel_SVC, "Invalid resource limit type: '{}'", resource_type); +        return ERR_INVALID_ENUM_VALUE; +    } + +    auto& kernel = Core::System::GetInstance().Kernel(); +    auto* const current_process = kernel.CurrentProcess(); +    ASSERT(current_process != nullptr); + +    auto resource_limit_object = +        current_process->GetHandleTable().Get<ResourceLimit>(resource_limit); +    if (!resource_limit_object) { +        LOG_ERROR(Kernel_SVC, "Handle to non-existent resource limit instance used. Handle={:08X}", +                  resource_limit); +        return ERR_INVALID_HANDLE; +    } + +    const auto set_result = resource_limit_object->SetLimitValue(type, static_cast<s64>(value)); +    if (set_result.IsError()) { +        LOG_ERROR( +            Kernel_SVC, +            "Attempted to lower resource limit ({}) for category '{}' below its current value ({})", +            resource_limit_object->GetMaxResourceValue(type), resource_type, +            resource_limit_object->GetCurrentResourceValue(type)); +        return set_result; +    } + +    return RESULT_SUCCESS; +} +  namespace {  struct FunctionDef {      using Func = void(); @@ -1561,7 +1596,7 @@ static const FunctionDef SVC_Table[] = {      {0x7B, nullptr, "TerminateProcess"},      {0x7C, SvcWrap<GetProcessInfo>, "GetProcessInfo"},      {0x7D, SvcWrap<CreateResourceLimit>, "CreateResourceLimit"}, -    {0x7E, nullptr, "SetResourceLimitLimitValue"}, +    {0x7E, SvcWrap<SetResourceLimitLimitValue>, "SetResourceLimitLimitValue"},      {0x7F, nullptr, "CallSecureMonitor"},  }; | 
