Merge pull request #1492 from lioncash/proc
svc: Implement svcGetProcessInfo
This commit is contained in:
		| @@ -24,6 +24,7 @@ class ProgramMetadata; | |||||||
| namespace Kernel { | namespace Kernel { | ||||||
|  |  | ||||||
| class KernelCore; | class KernelCore; | ||||||
|  | class ResourceLimit; | ||||||
|  |  | ||||||
| struct AddressMapping { | struct AddressMapping { | ||||||
|     // Address and size must be page-aligned |     // Address and size must be page-aligned | ||||||
| @@ -57,9 +58,23 @@ union ProcessFlags { | |||||||
|     BitField<12, 1, u16> loaded_high; ///< Application loaded high (not at 0x00100000). |     BitField<12, 1, u16> loaded_high; ///< Application loaded high (not at 0x00100000). | ||||||
| }; | }; | ||||||
|  |  | ||||||
| enum class ProcessStatus { Created, Running, Exited }; | /** | ||||||
|  |  * Indicates the status of a Process instance. | ||||||
| class ResourceLimit; |  * | ||||||
|  |  * @note These match the values as used by kernel, | ||||||
|  |  *       so new entries should only be added if RE | ||||||
|  |  *       shows that a new value has been introduced. | ||||||
|  |  */ | ||||||
|  | enum class ProcessStatus { | ||||||
|  |     Created, | ||||||
|  |     CreatedWithDebuggerAttached, | ||||||
|  |     Running, | ||||||
|  |     WaitingForDebuggerToAttach, | ||||||
|  |     DebuggerAttached, | ||||||
|  |     Exiting, | ||||||
|  |     Exited, | ||||||
|  |     DebugBreak, | ||||||
|  | }; | ||||||
|  |  | ||||||
| struct CodeSet final { | struct CodeSet final { | ||||||
|     struct Segment { |     struct Segment { | ||||||
|   | |||||||
| @@ -1098,6 +1098,29 @@ static ResultCode ClearEvent(Handle handle) { | |||||||
|     return RESULT_SUCCESS; |     return RESULT_SUCCESS; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static ResultCode GetProcessInfo(u64* out, Handle process_handle, u32 type) { | ||||||
|  |     LOG_DEBUG(Kernel_SVC, "called, handle=0x{:08X}, type=0x{:X}", process_handle, type); | ||||||
|  |  | ||||||
|  |     // This function currently only allows retrieving a process' status. | ||||||
|  |     enum class InfoType { | ||||||
|  |         Status, | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     const auto& kernel = Core::System::GetInstance().Kernel(); | ||||||
|  |     const auto process = kernel.HandleTable().Get<Process>(process_handle); | ||||||
|  |     if (!process) { | ||||||
|  |         return ERR_INVALID_HANDLE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     const auto info_type = static_cast<InfoType>(type); | ||||||
|  |     if (info_type != InfoType::Status) { | ||||||
|  |         return ERR_INVALID_ENUM_VALUE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     *out = static_cast<u64>(process->GetStatus()); | ||||||
|  |     return RESULT_SUCCESS; | ||||||
|  | } | ||||||
|  |  | ||||||
| namespace { | namespace { | ||||||
| struct FunctionDef { | struct FunctionDef { | ||||||
|     using Func = void(); |     using Func = void(); | ||||||
| @@ -1233,7 +1256,7 @@ static const FunctionDef SVC_Table[] = { | |||||||
|     {0x79, nullptr, "CreateProcess"}, |     {0x79, nullptr, "CreateProcess"}, | ||||||
|     {0x7A, nullptr, "StartProcess"}, |     {0x7A, nullptr, "StartProcess"}, | ||||||
|     {0x7B, nullptr, "TerminateProcess"}, |     {0x7B, nullptr, "TerminateProcess"}, | ||||||
|     {0x7C, nullptr, "GetProcessInfo"}, |     {0x7C, SvcWrap<GetProcessInfo>, "GetProcessInfo"}, | ||||||
|     {0x7D, nullptr, "CreateResourceLimit"}, |     {0x7D, nullptr, "CreateResourceLimit"}, | ||||||
|     {0x7E, nullptr, "SetResourceLimitLimitValue"}, |     {0x7E, nullptr, "SetResourceLimitLimitValue"}, | ||||||
|     {0x7F, nullptr, "CallSecureMonitor"}, |     {0x7F, nullptr, "CallSecureMonitor"}, | ||||||
|   | |||||||
| @@ -77,6 +77,14 @@ void SvcWrap() { | |||||||
|     FuncReturn(retval); |     FuncReturn(retval); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | template <ResultCode func(u64*, u32, u32)> | ||||||
|  | void SvcWrap() { | ||||||
|  |     u64 param_1 = 0; | ||||||
|  |     u32 retval = func(¶m_1, static_cast<u32>(Param(1)), static_cast<u32>(Param(2))).raw; | ||||||
|  |     Core::CurrentArmInterface().SetReg(1, param_1); | ||||||
|  |     FuncReturn(retval); | ||||||
|  | } | ||||||
|  |  | ||||||
| template <ResultCode func(u32, u64)> | template <ResultCode func(u32, u64)> | ||||||
| void SvcWrap() { | void SvcWrap() { | ||||||
|     FuncReturn(func(static_cast<u32>(Param(0)), Param(1)).raw); |     FuncReturn(func(static_cast<u32>(Param(0)), Param(1)).raw); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user