Process Manager services: Difference between revisions

No edit summary
No edit summary
Line 1: Line 1:
= Process Tracker thread =
PM has a separate thread that is waiting for synchronization on process handles.
PM has a separate thread that is waiting for synchronization on process handles.


== State changes ==
When the kernel signals a process handle, it uses svcResetSignal on the process handle and then it uses svcGetProcessInfo to read out the ProcessState.
When the kernel signals a process handle, it uses svcResetSignal on the process handle and then it uses svcGetProcessInfo to read out the ProcessState.


Line 14: Line 16:


If mask 1 is not set, it immediately does what is otherwise done by the [[#FinalizeDeadProcess]] command.
If mask 1 is not set, it immediately does what is otherwise done by the [[#FinalizeDeadProcess]] command.
== Process launch ==
This thread can also be triggered by the pm:shell [[#LaunchProcess]] cmd.
It uses [[Loader_services|ldr:pm]] GetProgramInfo with the supplied title-id.
If ((*(u8*) (info_output+2)) & 3) is == 1, it goes through the process list and errors if any has bit 0x40 set. Thus only one process can have bit 0x40 set at a time.
It calls [[Loader_services|ldr:pm]] RegisterTitle, then [[Loader_services|ldr:pm]] CreateProcess, then [[Filesystem_services|fsp-pr]] RegisterTitle, then [[Services_API|sm:m]] RegisterTitle.
The second input argument for [[Loader_services|ldr:pm]] CreateProcess is (launch_flags >> 2) & 3.
If launch_flags has mask 1 set, it sets mask 1 in process flags.
If launch_flags flags has mask 0x10 set, it sets mask 8 in process flags.
If ((*(u8*) (info_output+2)) & 3) is == 1, it sets 0x40 in the process flags, and signals the event returned by [[#EnableDebug]].
Finally it does svcStartProcess on the process handle that was returned by [[Loader_services|ldr:pm]] CreateProcess.
Thus at the point of launch, the pid is already registered in ldr, fs, sm, and pm.


= pm:bm =
= pm:bm =
Line 38: Line 61:
| 3 || GetProcessTitleIdByPid
| 3 || GetProcessTitleIdByPid
|-
|-
| 4 || .. Returns a handle.
| 4 || [[#EnableDebugForTitleId]]
|-
|-
| 5 || GetCrashingProcessPid
| 5 || GetCrashingProcessPid
|-
|-
| 6 || .. Returns a handle.
| 6 || [[#EnableDebug]]
|}
|}


Line 55: Line 78:


After that, it sets process state to 2.
After that, it sets process state to 2.
== EnableDebugForTitleId ==
Takes a title-id of the program to debug. Sets this to a global field. Next time it gets launched it will be handled differently.
Returns an event handle that is signaled when the requested title is launched.
== EnableDebug ==
Does *not* take a specific title-id as input.
Returns an event handle that is triggered for debug titles.


= pm:info =
= pm:info =
Line 69: Line 102:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || LaunchProcess
| 0 || [[#LaunchProcess]]
|-
|-
| 1 || TerminateProcessByPid
| 1 || TerminateProcessByPid
Line 87: Line 120:
| 8 || [[#GetCrashingProcessPid]]
| 8 || [[#GetCrashingProcessPid]]
|}
|}
== LaunchProcess ==
Takes a title-id and launch_flags. See [[#Process launch]].


== FinalizeDeadProcess ==
== FinalizeDeadProcess ==