PGL services: Difference between revisions

No edit summary
No edit summary
 
(15 intermediate revisions by 4 users not shown)
Line 1: Line 1:
PGL (Program Loader) is a sysmodule designed for encapsulating all program loading logic.
PGL (Program Launcher) is a sysmodule designed for encapsulating all program launching / management logic.
 
The core logic of this sysmodule was previously encapsulated by the ns:dev interface (and the nn.nssrv.ProcessLaunchControlTask thread in particular).


= pgl =
= pgl =
Line 26: Line 28:
| 10 || [[#EnableApplicationAllThreadDumpOnCrash]]
| 10 || [[#EnableApplicationAllThreadDumpOnCrash]]
|-
|-
| 12 || [[#TriggerSnapShotDumper]]
| 11 || [19.0.0+] GetProcessId
|-
| 12 || [10.0.0-11.0.1] [[#TriggerSnapShotDumper]]
|-
|-
| 20 || [[#GetShellEventObserver]]
| 20 || [[#GetShellEventObserver]]
|}
= LaunchFlags =
The LaunchFlags enum looks like this:
{| class=wikitable
! Bit || Mask || Name
|-
| 0 || 1 || LaunchFlags_EnableDetailedCrashReport
|-
| 1 || 2 || LaunchFlags_EnableCrashReportScreenShotForProduction
|-
| 2 || 4 || LaunchFlags_EnableCrashReportScreenShotForDevelop
|-
|}
== ContentMetaInfo ==
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x8
| [[NCM_services#ProgramId|ProgramId]]
|-
|-
| 0x8
| 21 || [11.0.0-11.0.1]
| 0x4
| Version
|-
| 0xC
| 0x1
| ContentType
|-
| 0xD
| 0x1
| ID Offset
|-
| 0xE
| 0x2
| Padding
|}
|}


== LaunchProgram ==
== LaunchProgram ==
Line 89: Line 51:
This just calls pm:shell->TerminateProcess with the input process id.
This just calls pm:shell->TerminateProcess with the input process id.


== GetEventObserver ==
== GetShellEventObserver ==
No input. Returns an [[#IEventObserver]].
No input. Returns an [[#IEventObserver]].


== LaunchProgramFromHost ==
== LaunchProgramFromHost ==
This takes an input u32 [[Process_Manager_services#LaunchFlags]] pm launch_flags and a MapAlias input buffer "content path".
This takes an input u32 [[Process_Manager_services#LaunchFlags]] pm launch_flags and a MapAlias input buffer "content path".


Line 107: Line 68:


== GetHostContentMetaInfo ==
== GetHostContentMetaInfo ==
This takes an input MapAlias buffer "content path", and does the same parsing as [[#LaunchProgramFromHost]].
This takes an input MapAlias buffer "content path", and does the same parsing as [[#LaunchProgramFromHost]].


Line 113: Line 73:


== GetApplicationProcessId ==
== GetApplicationProcessId ==
This calls pm:shell->GetApplicationProcessIdForShell, and returns the output process id.
This calls pm:shell->GetApplicationProcessIdForShell, and returns the output process id.


Line 119: Line 78:


== BoostSystemMemoryResourceLimit ==
== BoostSystemMemoryResourceLimit ==
This takes in a u64 mem_size, and uses it as input to pm:shell->BoostSystemMemoryResourceLimit
This takes in a u64 mem_size, and uses it as input to pm:shell->BoostSystemMemoryResourceLimit


=== EnableApplicationCrashReport ===
== EnableApplicationCrashReport ==
Takes an input boolean "enable".


This calls pm:shell->GetApplicationProcessId. If the returned process ID is tracked, this sets or clears bit 1 (value 0x2) in the tracked process's flags.
This calls pm:shell->GetApplicationProcessId. If the returned process ID is tracked, this sets or clears bit 1 (value 0x2) in the tracked process's flags.
Line 132: Line 91:
Thus this command is only useful for disabling/toggling detailed crash reports for applications launched with LaunchFlags_EnableDetailedCrashReport, as processes without the launch flag will always send "0" for the creport argument.
Thus this command is only useful for disabling/toggling detailed crash reports for applications launched with LaunchFlags_EnableDetailedCrashReport, as processes without the launch flag will always send "0" for the creport argument.


=== IsApplicationCrashReportEnabled ===
== IsApplicationCrashReportEnabled ==
This returns the value of the bit set or cleared by [[#EnableApplicationCrashReport]]
 
== EnableApplicationAllThreadDumpOnCrash ==
Takes an input boolean "enable".


This returns the value of the bit set or cleared by [[#EnableApplicationCrashReport]]
This calls pm:shell->GetApplicationProcessId. If the returned process ID is tracked, this sets or clears bit 3 (value 0x8) in the tracked process's flags.
 
Using this command unconditionally sets bit 2 (value 0x4) in the tracked process's flags.
 
When the SnapShotDumper is launched, argument "-log %d" is set to the value of bit 3 if bit 2 is 1. Otherwise, argument "-log %d" is set to the value of the system setting "snap_shot_dump!output_all_log".
 
Thus, this overrides the log option for the current application process from snap_shot_dump!output_all_log with the input value.
 
Previously this functionality was controlled by ns:am2->EnableApplicationAllThreadDumpOnCrash, which is now a wrapper for this function.
 
== TriggerSnapShotDumper ==
This takes an input 32 "SnapShotDumpType" and an input MapAliasBuffer "argument".
 
This manually invokes the same function to launch the SnapShotDumper program (0100000000002071) as is called automatically when a process crashes and jit_debug!enable_jit_debug is 1.


=== EnableApplicationAllThreadDumpOnCrash ===
If the argument is NULL, then the snap shot dumper is launched with argument Format("D %010llu -log %d -dump %d", process_id, log_option, snap_shot_dump_type - 1).
If the argument is not NULL, the snap shot dumper is launched with argument Format("D %010llu \"%s\" -log %d -dump %d", process_id, argument, log_option, snap_shot_dump_type - 1).


=== TriggerSnapShotDumper ===
When invoked automatically, the SnapShotDumpType is SnapShotDumpType_Full if both "snap_shot_dump!full_dump" and "snap_shot_dump!auto_dump" are true, SnapShotDumpType_Auto if only "snap_shot_dump!auto_dump" is 1, and SnapShotDumpType_None otherwise.


== IEventObserver ==
== IEventObserver ==
Line 150: Line 127:
|}
|}


=== GetProcessEventHandle ===
== GetProcessEventHandle ==
 
This takes no input and returns an output copy event handle.
This takes no input and returns an output copy event handle.


=== GetProcessEventInfo ===
== GetProcessEventInfo ==
 
This takes no input and attempts to receive a [[Process_Manager_services#ProcessEventInfo]] from the observer's message queue.
This takes no input and attempts to receive a [[#ProcessEventInfo]] from the observer's message queue.


Every time a process event occurs, pgl receives the event from PM (it does pm:shell->GetProcessEventHandle() during startup and has a thread looping pm:shell->GetProcessEventInfo() to track process events.
Every time a process event occurs, pgl receives the event from PM (it does pm:shell->GetProcessEventHandle() during startup and has a thread looping pm:shell->GetProcessEventInfo() to track process events.


PGL sends to all observers' message queues a [[#ProcessEventInfo]] for each event it receives, thus allowing for multiple subscribers to process events.
PGL sends to all observers' message queues a [[Process_Manager_services#ProcessEventInfo]] for each event it receives, thus allowing for multiple subscribers to process events.


= LaunchFlags =
{| class=wikitable
! Bit || Mask || Name
|-
| 0 || 1 || EnableDetailedCrashReport
|-
| 1 || 2 || EnableCrashReportScreenShotForProduction
|-
| 2 || 4 || EnableCrashReportScreenShotForDevelop
|-
|}


== ProcessEventInfo ==
= SnapShotDumpType =
{| class=wikitable
! Value || Name
|-
| 0 || None
|-
| 1 || Auto
|-
| 2 || Full
|-
|}
 
= ContentMetaInfo =
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 172: Line 170:
| 0x0  
| 0x0  
| 0x8  
| 0x8  
| ProcessId
| [[NCM_services#ProgramId|ProgramId]]
|-
|-
| 0x8  
| 0x8  
| 0x4  
| 0x4  
| ProcessEvent
| Version
|-
|-
| 0xC  
| 0xC  
| 0x4
| 0x1
| Padding/Reserved
| ContentType
|-
| 0xD
| 0x1
| ID Offset
|-
|-
| 0xE
| 0x2
| Padding
|}
|}
[[Category:Services]]