diff options
| author | bunnei <bunneidev@gmail.com> | 2018-12-04 12:23:19 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-12-04 12:23:19 -0500 | 
| commit | da5659fb87bbcb0fd3f77679f2573476b0140860 (patch) | |
| tree | 31fac2779ca1799a321445ebd2143a60b7d8647f | |
| parent | 7f6bc284e9eb39653bfdfba0e988311f24f14b6b (diff) | |
| parent | ac966e4213c4a60af01fa99eec8427674a569cf0 (diff) | |
Merge pull request #1857 from lioncash/res-info
 kernel/svc: Implement the resource limit svcGetInfo option
| -rw-r--r-- | src/core/hle/kernel/handle_table.cpp | 5 | ||||
| -rw-r--r-- | src/core/hle/kernel/handle_table.h | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.h | 9 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 29 | 
5 files changed, 37 insertions, 11 deletions
| diff --git a/src/core/hle/kernel/handle_table.cpp b/src/core/hle/kernel/handle_table.cpp index 1bf79b692..c8acde5b1 100644 --- a/src/core/hle/kernel/handle_table.cpp +++ b/src/core/hle/kernel/handle_table.cpp @@ -42,9 +42,10 @@ ResultVal<Handle> HandleTable::Create(SharedPtr<Object> obj) {      u16 generation = next_generation++;      // Overflow count so it fits in the 15 bits dedicated to the generation in the handle. -    // CTR-OS doesn't use generation 0, so skip straight to 1. -    if (next_generation >= (1 << 15)) +    // Horizon OS uses zero to represent an invalid handle, so skip to 1. +    if (next_generation >= (1 << 15)) {          next_generation = 1; +    }      generations[slot] = generation;      objects[slot] = std::move(obj); diff --git a/src/core/hle/kernel/handle_table.h b/src/core/hle/kernel/handle_table.h index e3f3e3fb8..6b7927fd8 100644 --- a/src/core/hle/kernel/handle_table.h +++ b/src/core/hle/kernel/handle_table.h @@ -13,6 +13,7 @@  namespace Kernel {  enum KernelHandle : Handle { +    InvalidHandle = 0,      CurrentThread = 0xFFFF8000,      CurrentProcess = 0xFFFF8001,  }; diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index 7ca538401..4ecb8c926 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp @@ -44,6 +44,10 @@ SharedPtr<Process> Process::Create(KernelCore& kernel, std::string&& name) {      return process;  } +SharedPtr<ResourceLimit> Process::GetResourceLimit() const { +    return resource_limit; +} +  void Process::LoadFromMetadata(const FileSys::ProgramMetadata& metadata) {      program_id = metadata.GetTitleID();      is_64bit_process = metadata.Is64BitProgram(); diff --git a/src/core/hle/kernel/process.h b/src/core/hle/kernel/process.h index ada845c7f..49345aa66 100644 --- a/src/core/hle/kernel/process.h +++ b/src/core/hle/kernel/process.h @@ -171,14 +171,7 @@ public:      }      /// Gets the resource limit descriptor for this process -    ResourceLimit& GetResourceLimit() { -        return *resource_limit; -    } - -    /// Gets the resource limit descriptor for this process -    const ResourceLimit& GetResourceLimit() const { -        return *resource_limit; -    } +    SharedPtr<ResourceLimit> GetResourceLimit() const;      /// Gets the default CPU ID for this process      u8 GetDefaultProcessorID() const { diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 948989b31..b022a7bc5 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -663,7 +663,7 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)          TotalMemoryUsage = 6,          TotalHeapUsage = 7,          IsCurrentProcessBeingDebugged = 8, -        ResourceHandleLimit = 9, +        RegisterResourceLimit = 9,          IdleTickCount = 10,          RandomEntropy = 11,          PerformanceCounter = 0xF0000002, @@ -787,6 +787,33 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)          *result = 0;          return RESULT_SUCCESS; +    case GetInfoType::RegisterResourceLimit: { +        if (handle != 0) { +            return ERR_INVALID_HANDLE; +        } + +        if (info_sub_id != 0) { +            return ERR_INVALID_COMBINATION; +        } + +        Process* const current_process = Core::CurrentProcess(); +        HandleTable& handle_table = current_process->GetHandleTable(); +        const auto resource_limit = current_process->GetResourceLimit(); +        if (!resource_limit) { +            *result = KernelHandle::InvalidHandle; +            // Yes, the kernel considers this a successful operation. +            return RESULT_SUCCESS; +        } + +        const auto table_result = handle_table.Create(resource_limit); +        if (table_result.Failed()) { +            return table_result.Code(); +        } + +        *result = *table_result; +        return RESULT_SUCCESS; +    } +      case GetInfoType::RandomEntropy:          if (handle != 0) {              LOG_ERROR(Kernel_SVC, "Process Handle is non zero, expected 0 result but got {:016X}", | 
