mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-30 07:29:02 -05:00 
			
		
		
		
	Merge pull request #1492 from lioncash/proc
svc: Implement svcGetProcessInfo
This commit is contained in:
		| @@ -24,6 +24,7 @@ class ProgramMetadata; | ||||
| namespace Kernel { | ||||
|  | ||||
| class KernelCore; | ||||
| class ResourceLimit; | ||||
|  | ||||
| struct AddressMapping { | ||||
|     // 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). | ||||
| }; | ||||
|  | ||||
| enum class ProcessStatus { Created, Running, Exited }; | ||||
|  | ||||
| class ResourceLimit; | ||||
| /** | ||||
|  * Indicates the status of a Process instance. | ||||
|  * | ||||
|  * @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 Segment { | ||||
|   | ||||
| @@ -1098,6 +1098,29 @@ static ResultCode ClearEvent(Handle handle) { | ||||
|     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 { | ||||
| struct FunctionDef { | ||||
|     using Func = void(); | ||||
| @@ -1233,7 +1256,7 @@ static const FunctionDef SVC_Table[] = { | ||||
|     {0x79, nullptr, "CreateProcess"}, | ||||
|     {0x7A, nullptr, "StartProcess"}, | ||||
|     {0x7B, nullptr, "TerminateProcess"}, | ||||
|     {0x7C, nullptr, "GetProcessInfo"}, | ||||
|     {0x7C, SvcWrap<GetProcessInfo>, "GetProcessInfo"}, | ||||
|     {0x7D, nullptr, "CreateResourceLimit"}, | ||||
|     {0x7E, nullptr, "SetResourceLimitLimitValue"}, | ||||
|     {0x7F, nullptr, "CallSecureMonitor"}, | ||||
|   | ||||
| @@ -77,6 +77,14 @@ void SvcWrap() { | ||||
|     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)> | ||||
| void SvcWrap() { | ||||
|     FuncReturn(func(static_cast<u32>(Param(0)), Param(1)).raw); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei