<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://switchbrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Roblabla</id>
	<title>Nintendo Switch Brew - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://switchbrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Roblabla"/>
	<link rel="alternate" type="text/html" href="https://switchbrew.org/wiki/Special:Contributions/Roblabla"/>
	<updated>2026-05-17T04:56:42Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Fuses&amp;diff=8490</id>
		<title>Fuses</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Fuses&amp;diff=8490"/>
		<updated>2019-12-04T23:30:38Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: 9.1.0 burned a fuse on retail&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Nintendo Switch makes use of Tegra&#039;s fuse driver for a number of operations. This driver is mapped to physical address 0x7000F800 with a total size of 0x400 bytes and exposes several registers for fuse programming.&lt;br /&gt;
&lt;br /&gt;
Registers from 0x7000F800 to 0x7000F800 + 0xFF can be used to directly program the hardware fuse bitmap, while registers from 0x7000F800 + 0x100 (FUSE_CHIP_REG_START_OFFSET) to 0x7000F800 + 0x3FC (FUSE_CHIP_REG_END_OFFSET) represent cached values read from certain fuses.&lt;br /&gt;
&lt;br /&gt;
== Registers ==&lt;br /&gt;
Below is a list of fuse driver registers used by the Switch&#039;s bootloaders.&lt;br /&gt;
&lt;br /&gt;
=== Driver registers ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Name&lt;br /&gt;
!  Address&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_FUSECTRL|FUSE_FUSECTRL]]&lt;br /&gt;
| 0x7000F800&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_FUSEADDR|FUSE_FUSEADDR]]&lt;br /&gt;
| 0x7000F804&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_FUSERDATA|FUSE_FUSERDATA]]&lt;br /&gt;
| 0x7000F808&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_FUSEWDATA|FUSE_FUSEWDATA]]&lt;br /&gt;
| 0x7000F80C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_FUSETIME_RD1|FUSE_FUSETIME_RD1]]&lt;br /&gt;
| 0x7000F810&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_FUSETIME_RD2|FUSE_FUSETIME_RD2]]&lt;br /&gt;
| 0x7000F814&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_FUSETIME_PGM1|FUSE_FUSETIME_PGM1]]&lt;br /&gt;
| 0x7000F818&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_FUSETIME_PGM2|FUSE_FUSETIME_PGM2]]&lt;br /&gt;
| 0x7000F81C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIV2INTFC_START|FUSE_PRIV2INTFC_START]]&lt;br /&gt;
| 0x7000F820&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_FUSEBYPASS|FUSE_FUSEBYPASS]]&lt;br /&gt;
| 0x7000F824&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIVATEKEYDISABLE|FUSE_PRIVATEKEYDISABLE]]&lt;br /&gt;
| 0x7000F828&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_DISABLEREGPROGRAM|FUSE_DISABLEREGPROGRAM]]&lt;br /&gt;
| 0x7000F82C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_WRITE_ACCESS_SW|FUSE_WRITE_ACCESS_SW]]&lt;br /&gt;
| 0x7000F830&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PWR_GOOD_SW|FUSE_PWR_GOOD_SW]]&lt;br /&gt;
| 0x7000F834&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIV2RESHIFT|FUSE_PRIV2RESHIFT]]&lt;br /&gt;
| 0x7000F83C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_FUSETIME_RD3|FUSE_FUSETIME_RD3]]&lt;br /&gt;
| 0x7000F84C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIVATE_KEY0_NONZERO|FUSE_PRIVATE_KEY0_NONZERO]]&lt;br /&gt;
| 0x7000F880&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIVATE_KEY1_NONZERO|FUSE_PRIVATE_KEY1_NONZERO]]&lt;br /&gt;
| 0x7000F884&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIVATE_KEY2_NONZERO|FUSE_PRIVATE_KEY2_NONZERO]]&lt;br /&gt;
| 0x7000F888&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIVATE_KEY3_NONZERO|FUSE_PRIVATE_KEY3_NONZERO]]&lt;br /&gt;
| 0x7000F88C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIVATE_KEY4_NONZERO|FUSE_PRIVATE_KEY4_NONZERO]]&lt;br /&gt;
| 0x7000F890&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FUSE_FUSECTRL ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-1&lt;br /&gt;
| FUSE_FUSECTRL_CMD&lt;br /&gt;
 0x00: IDLE&lt;br /&gt;
 0x01: READ&lt;br /&gt;
 0x02: WRITE&lt;br /&gt;
 0x03: SENSE_CTRL&lt;br /&gt;
|-&lt;br /&gt;
| 16-20&lt;br /&gt;
| FUSE_FUSECTRL_STATE&lt;br /&gt;
 0x00: STATE_RESET&lt;br /&gt;
 0x01: STATE_POST_RESET&lt;br /&gt;
 0x02: STATE_LOAD_ROW0&lt;br /&gt;
 0x03: STATE_LOAD_ROW1&lt;br /&gt;
 0x04: STATE_IDLE&lt;br /&gt;
 0x05: STATE_READ_SETUP&lt;br /&gt;
 0x06: STATE_READ_STROBE&lt;br /&gt;
 0x07: STATE_SAMPLE_FUSES&lt;br /&gt;
 0x08: STATE_READ_HOLD&lt;br /&gt;
 0x09: STATE_FUSE_SRC_SETUP&lt;br /&gt;
 0x0A: STATE_WRITE_SETUP&lt;br /&gt;
 0x0B: STATE_WRITE_ADDR_SETUP&lt;br /&gt;
 0x0C: STATE_WRITE_PROGRAM&lt;br /&gt;
 0x0D: STATE_WRITE_ADDR_HOLD&lt;br /&gt;
 0x0E: STATE_FUSE_SRC_HOLD&lt;br /&gt;
 0x0F: STATE_LOAD_RIR&lt;br /&gt;
 0x10: STATE_READ_BEFORE_WRITE_SETUP&lt;br /&gt;
 0x11: STATE_READ_DEASSERT_PD&lt;br /&gt;
|-&lt;br /&gt;
| 21&lt;br /&gt;
| FUSE_FUSECTRL_MARGIN_READ&lt;br /&gt;
|-&lt;br /&gt;
| 22&lt;br /&gt;
| FUSE_FUSECTRL_RWL&lt;br /&gt;
|-&lt;br /&gt;
| 23&lt;br /&gt;
| FUSE_FUSECTRL_TRCS&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| FUSE_FUSECTRL_AT1&lt;br /&gt;
|-&lt;br /&gt;
| 25&lt;br /&gt;
| FUSE_FUSECTRL_AT0&lt;br /&gt;
|-&lt;br /&gt;
| 26&lt;br /&gt;
| FUSE_FUSECTRL_PD_CTRL&lt;br /&gt;
|-&lt;br /&gt;
| 30&lt;br /&gt;
| FUSE_FUSECTRL_FUSE_SENSE_DONE&lt;br /&gt;
|-&lt;br /&gt;
| 31&lt;br /&gt;
| FUSE_FUSECTRL_RECORD_SHIFT_DONE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
FUSE_FUSECTRL_CMD takes the fuse controller&#039;s operation mode. READ and WRITE interact directly with the hardware fuse bitmap while SENSE_CTRL flushes programmed values into the [[Fuses#Cache_registers|cache registers]].&lt;br /&gt;
&lt;br /&gt;
FUSE_FUSECTRL_STATE returns the current state of the fuse controller.&lt;br /&gt;
&lt;br /&gt;
FUSE_FUSECTRL_MARGIN_READ changes the fuse read trip point setting to margin read mode.&lt;br /&gt;
&lt;br /&gt;
FUSE_FUSECTRL_RWL selects the fuse redundancy information row.&lt;br /&gt;
&lt;br /&gt;
FUSE_FUSECTRL_PD_CTRL controls the fuse macro&#039;s power down mode.&lt;br /&gt;
&lt;br /&gt;
FUSE_FUSECTRL_FUSE_SENSE_DONE is set if fuse sensing is completed.&lt;br /&gt;
&lt;br /&gt;
FUSE_FUSECTRL_RECORD_SHIFT_DONE is set if ramrepair shift is completed.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_FUSEADDR ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-7&lt;br /&gt;
| FUSE_FUSEADDR_VLDFLD&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Takes the address of the fuse to be read/written/sensed.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_FUSERDATA ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-31&lt;br /&gt;
| FUSE_FUSERDATA_DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Returns the value read from the fuse.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_FUSEWDATA ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-31&lt;br /&gt;
| FUSE_FUSEWDATA_DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Takes the value to be written to the fuse.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_FUSETIME_RD1 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-7&lt;br /&gt;
| FUSE_FUSETIME_RD1_TSUR_MAX&lt;br /&gt;
|-&lt;br /&gt;
| 8-15&lt;br /&gt;
| FUSE_FUSETIME_RD1_TSUR_FUSEOUT&lt;br /&gt;
|-&lt;br /&gt;
| 16-23&lt;br /&gt;
| FUSE_FUSETIME_RD1_THR_MAX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
FUSE_FUSETIME_RD1_TSUR_MAX takes the maximum time for [[#FUSE_FUSECTRL|STATE_READ_SETUP]].&lt;br /&gt;
&lt;br /&gt;
FUSE_FUSETIME_RD1_TSUR_FUSEOUT takes the time to spend on [[#FUSE_FUSECTRL|STATE_SAMPLE_FUSES]].&lt;br /&gt;
&lt;br /&gt;
FUSE_FUSETIME_RD1_THR_MAX takes the maximum time for [[#FUSE_FUSECTRL|STATE_READ_HOLD]].&lt;br /&gt;
&lt;br /&gt;
==== FUSE_FUSETIME_RD2 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-15&lt;br /&gt;
| FUSE_FUSETIME_RD2_TWIDTH_RD&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Takes the read strobe pulse width used during [[#FUSE_FUSECTRL|STATE_READ_STROBE]].&lt;br /&gt;
&lt;br /&gt;
==== FUSE_FUSETIME_PGM1 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-7&lt;br /&gt;
| FUSE_FUSETIME_PGM1_TSUP_MAX&lt;br /&gt;
|-&lt;br /&gt;
| 8-15&lt;br /&gt;
| FUSE_FUSETIME_PGM1_TSUP_ADDR&lt;br /&gt;
|-&lt;br /&gt;
| 16-23&lt;br /&gt;
| FUSE_FUSETIME_PGM1_THP_ADDR&lt;br /&gt;
|-&lt;br /&gt;
| 24-31&lt;br /&gt;
| FUSE_FUSETIME_PGM1_THP_PS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
FUSE_FUSETIME_PGM1_TSUP_MAX takes the maximum time for [[#FUSE_FUSECTRL|STATE_WRITE_SETUP]].&lt;br /&gt;
&lt;br /&gt;
FUSE_FUSETIME_PGM1_TSUP_ADDR takes the time to spend on [[#FUSE_FUSECTRL|STATE_WRITE_ADDR_SETUP]].&lt;br /&gt;
&lt;br /&gt;
FUSE_FUSETIME_PGM1_THP_ADDR takes the time to spend on [[#FUSE_FUSECTRL|STATE_WRITE_ADDR_HOLD]].&lt;br /&gt;
&lt;br /&gt;
FUSE_FUSETIME_PGM1_THP_PS takes the time to spend on [[#FUSE_FUSECTRL|STATE_FUSE_SRC_HOLD]].&lt;br /&gt;
&lt;br /&gt;
==== FUSE_FUSETIME_PGM2 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-15&lt;br /&gt;
| FUSE_FUSETIME_PGM2_TWIDTH_PGM&lt;br /&gt;
|-&lt;br /&gt;
| 16-23&lt;br /&gt;
| FUSE_FUSETIME_PGM2_TSUP_PS&lt;br /&gt;
|-&lt;br /&gt;
| 24-31&lt;br /&gt;
| FUSE_FUSETIME_PGM2_THP_CSPS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
FUSE_FUSETIME_PGM2_TWIDTH_PGM takes the program strobe pulse width used during [[#FUSE_FUSECTRL|STATE_WRITE_PROGRAM]].&lt;br /&gt;
&lt;br /&gt;
FUSE_FUSETIME_PGM2_TSUP_PS takes the time to spend on [[#FUSE_FUSECTRL|STATE_FUSE_SRC_SETUP]].&lt;br /&gt;
&lt;br /&gt;
FUSE_FUSETIME_PGM2_THP_CSPS takes the time to spend on [[#FUSE_FUSECTRL|STATE_READ_BEFORE_WRITE_SETUP]].&lt;br /&gt;
&lt;br /&gt;
==== FUSE_PRIV2INTFC_START ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| FUSE_PRIV2INTFC_START_DATA&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| FUSE_PRIV2INTFC_SKIP_RECORDS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Controls the interface between the internal fuse chip (INTFC) and the fuse cache registers (PRIV).&lt;br /&gt;
&lt;br /&gt;
==== FUSE_FUSEBYPASS ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| FUSE_FUSEBYPASS_VAL&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If set, this register enables fuse bypass mode. This is only available in hardware where the [[#Bitmap|production_mode]] fuse remains unburnt.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_PRIVATEKEYDISABLE ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| FUSE_PRIVATEKEYDISABLE_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| FUSE_PRIVATEKEYDISABLE_TZ_STICKY_BIT_VAL&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If set, this register hides the [[#Bitmap|private_key]] fuses until the next reset.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_DISABLEREGPROGRAM ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| FUSE_DISABLEREGPROGRAM_VAL&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If set, this register disables fuse programming until the next reset.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_WRITE_ACCESS_SW ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| FUSE_WRITE_ACCESS_SW_CTRL&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| FUSE_WRITE_ACCESS_SW_STATUS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Controls and returns the status of software writes to the fuse cache registers.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_PWR_GOOD_SW ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| FUSE_PWR_GOOD_SW_VAL&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This register is deprecated and has no effect.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_PRIV2RESHIFT ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| FUSE_PRIV2RESHIFT_TRIGENABLE_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| FUSE_PRIV2RESHIFT_TRIG_1_FCPU0_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| FUSE_PRIV2RESHIFT_TRIG_1_FCPU1_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| FUSE_PRIV2RESHIFT_TRIG_1_FCPU2_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| FUSE_PRIV2RESHIFT_TRIG_1_FCPU3_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| FUSE_PRIV2RESHIFT_TRIG_1_FL2_TBANK0_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| FUSE_PRIV2RESHIFT_TRIG_1_FL2_TBANK1_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| FUSE_PRIV2RESHIFT_TRIG_1_FL2_TBANK2_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| FUSE_PRIV2RESHIFT_TRIG_1_FL2_TBANK3_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| FUSE_PRIV2RESHIFT_TRIG_1_SCPU_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| FUSE_PRIV2RESHIFT_TRIG_1_SL2_TBANK_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| FUSE_PRIV2RESHIFT_STATUS_1_FCPU0_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| FUSE_PRIV2RESHIFT_STATUS_1_FCPU1_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| FUSE_PRIV2RESHIFT_STATUS_1_FCPU2_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| FUSE_PRIV2RESHIFT_STATUS_1_FCPU3_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| FUSE_PRIV2RESHIFT_STATUS_1_FL2_TBANK0_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| FUSE_PRIV2RESHIFT_STATUS_1_FL2_TBANK1_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 17&lt;br /&gt;
| FUSE_PRIV2RESHIFT_STATUS_1_FL2_TBANK2_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| FUSE_PRIV2RESHIFT_STATUS_1_FL2_TBANK3_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 19&lt;br /&gt;
| FUSE_PRIV2RESHIFT_STATUS_1_SCPU_VAL&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| FUSE_PRIV2RESHIFT_STATUS_1_SL2_TBANK_VAL&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Controls and returns the status of the RESHIFT hardware block used in RAM repair.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_FUSETIME_RD3 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-15&lt;br /&gt;
| FUSE_FUSETIME_RD3_TSUR_PDCS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Takes the time to spend on [[#FUSE_FUSECTRL|STATE_READ_DEASSERT_PD]].&lt;br /&gt;
&lt;br /&gt;
==== FUSE_PRIVATE_KEY0_NONZERO ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| FUSE_PRIVATE_KEY0_NONZERO_DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Returns whether [[#Bitmap|private_key0]] is empty or not.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_PRIVATE_KEY1_NONZERO ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| FUSE_PRIVATE_KEY1_NONZERO_DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Returns whether [[#Bitmap|private_key1]] is empty or not.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_PRIVATE_KEY2_NONZERO ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| FUSE_PRIVATE_KEY2_NONZERO_DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Returns whether [[#Bitmap|private_key2]] is empty or not.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_PRIVATE_KEY3_NONZERO ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| FUSE_PRIVATE_KEY3_NONZERO_DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Returns whether [[#Bitmap|private_key3]] is empty or not.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_PRIVATE_KEY4_NONZERO ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| FUSE_PRIVATE_KEY4_NONZERO_DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Returns whether [[#Bitmap|private_key4]] is empty or not.&lt;br /&gt;
&lt;br /&gt;
=== Cache registers ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Name&lt;br /&gt;
!  Address&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PRODUCTION_MODE&lt;br /&gt;
| 0x7000F900&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_JTAG_SECUREID_VALID&lt;br /&gt;
| 0x7000F904&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_ODM_LOCK&lt;br /&gt;
| 0x7000F908&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_OPENGL_EN&lt;br /&gt;
| 0x7000F90C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_SKU_INFO|FUSE_SKU_INFO]]&lt;br /&gt;
| 0x7000F910&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_CPU_SPEEDO_0_CALIB&lt;br /&gt;
| 0x7000F914&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_CPU_IDDQ_CALIB&lt;br /&gt;
| 0x7000F918&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_DAC_CRT_CALIB&lt;br /&gt;
| 0x7000F91C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_DAC_HDTV_CALIB&lt;br /&gt;
| 0x7000F920&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_DAC_SDTV_CALIB&lt;br /&gt;
| 0x7000F924&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_OPT_FT_REV|FUSE_OPT_FT_REV]]&lt;br /&gt;
| 0x7000F928&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_CPU_SPEEDO_1_CALIB&lt;br /&gt;
| 0x7000F92C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_CPU_SPEEDO_2_CALIB&lt;br /&gt;
| 0x7000F930&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SOC_SPEEDO_0_CALIB&lt;br /&gt;
| 0x7000F934&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_SOC_SPEEDO_1_CALIB|FUSE_SOC_SPEEDO_1_CALIB]]&lt;br /&gt;
| 0x7000F938&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SOC_SPEEDO_2_CALIB&lt;br /&gt;
| 0x7000F93C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SOC_IDDQ_CALIB&lt;br /&gt;
| 0x7000F940&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_RESERVED_PRODUCTION_WP&lt;br /&gt;
| 0x7000F944&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_FA|FUSE_FA]]&lt;br /&gt;
| 0x7000F948&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_RESERVED_PRODUCTION&lt;br /&gt;
| 0x7000F94C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_HDMI_LANE0_CALIB&lt;br /&gt;
| 0x7000F950&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_HDMI_LANE1_CALIB&lt;br /&gt;
| 0x7000F954&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_HDMI_LANE2_CALIB&lt;br /&gt;
| 0x7000F958&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_HDMI_LANE3_CALIB&lt;br /&gt;
| 0x7000F95C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_ENCRYPTION_RATE&lt;br /&gt;
| 0x7000F960&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PUBLIC_KEY|FUSE_PUBLIC_KEY0]]&lt;br /&gt;
| 0x7000F964&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PUBLIC_KEY|FUSE_PUBLIC_KEY1]]&lt;br /&gt;
| 0x7000F968&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PUBLIC_KEY|FUSE_PUBLIC_KEY2]]&lt;br /&gt;
| 0x7000F96C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PUBLIC_KEY|FUSE_PUBLIC_KEY3]]&lt;br /&gt;
| 0x7000F970&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PUBLIC_KEY|FUSE_PUBLIC_KEY4]]&lt;br /&gt;
| 0x7000F974&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PUBLIC_KEY|FUSE_PUBLIC_KEY5]]&lt;br /&gt;
| 0x7000F978&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PUBLIC_KEY|FUSE_PUBLIC_KEY6]]&lt;br /&gt;
| 0x7000F97C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PUBLIC_KEY|FUSE_PUBLIC_KEY7]]&lt;br /&gt;
| 0x7000F980&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR1_CALIB&lt;br /&gt;
| 0x7000F984&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR2_CALIB&lt;br /&gt;
| 0x7000F988&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_VSENSOR_CALIB&lt;br /&gt;
| 0x7000F98C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_OPT_CP_REV|FUSE_OPT_CP_REV]]&lt;br /&gt;
| 0x7000F990&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_PFG&lt;br /&gt;
| 0x7000F994&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR0_CALIB&lt;br /&gt;
| 0x7000F998&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_FIRST_BOOTROM_PATCH_SIZE&lt;br /&gt;
| 0x7000F99C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SECURITY_MODE&lt;br /&gt;
| 0x7000F9A0&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIVATE_KEY|FUSE_PRIVATE_KEY0]]&lt;br /&gt;
| 0x7000F9A4&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIVATE_KEY|FUSE_PRIVATE_KEY1]]&lt;br /&gt;
| 0x7000F9A8&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIVATE_KEY|FUSE_PRIVATE_KEY2]]&lt;br /&gt;
| 0x7000F9AC&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIVATE_KEY|FUSE_PRIVATE_KEY3]]&lt;br /&gt;
| 0x7000F9B0&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIVATE_KEY|FUSE_PRIVATE_KEY4]]&lt;br /&gt;
| 0x7000F9B4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_ARM_JTAG_DIS&lt;br /&gt;
| 0x7000F9B8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_BOOT_DEVICE_INFO&lt;br /&gt;
| 0x7000F9BC&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_RESERVED_SW|FUSE_RESERVED_SW]]&lt;br /&gt;
| 0x7000F9C0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_VP9_DISABLE&lt;br /&gt;
| 0x7000F9C4&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_RESERVED_ODM0|FUSE_RESERVED_ODM0]]&lt;br /&gt;
| 0x7000F9C8&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_RESERVED_ODM1|FUSE_RESERVED_ODM1]]&lt;br /&gt;
| 0x7000F9CC&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_RESERVED_ODM2|FUSE_RESERVED_ODM2]]&lt;br /&gt;
| 0x7000F9D0&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_RESERVED_ODM3|FUSE_RESERVED_ODM3]]&lt;br /&gt;
| 0x7000F9D4&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_RESERVED_ODM4|FUSE_RESERVED_ODM4]]&lt;br /&gt;
| 0x7000F9D8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_RESERVED_ODM5&lt;br /&gt;
| 0x7000F9DC&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_RESERVED_ODM6|FUSE_RESERVED_ODM6]]&lt;br /&gt;
| 0x7000F9E0&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_RESERVED_ODM7|FUSE_RESERVED_ODM7]]&lt;br /&gt;
| 0x7000F9E4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OBS_DIS&lt;br /&gt;
| 0x7000F9E8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_NOR_INFO&lt;br /&gt;
| 0x7000F9EC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_USB_CALIB&lt;br /&gt;
| 0x7000F9F0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SKU_DIRECT_CONFIG&lt;br /&gt;
| 0x7000F9F4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_KFUSE_PRIVKEY_CTRL&lt;br /&gt;
| 0x7000F9F8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PACKAGE_INFO&lt;br /&gt;
| 0x7000F9FC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_VENDOR_CODE&lt;br /&gt;
| 0x7000FA00&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_FAB_CODE&lt;br /&gt;
| 0x7000FA04&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_LOT_CODE_0&lt;br /&gt;
| 0x7000FA08&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_LOT_CODE_1&lt;br /&gt;
| 0x7000FA0C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_WAFER_ID&lt;br /&gt;
| 0x7000FA10&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_X_COORDINATE&lt;br /&gt;
| 0x7000FA14&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_Y_COORDINATE&lt;br /&gt;
| 0x7000FA18&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_OPT_SEC_DEBUG_EN|FUSE_OPT_SEC_DEBUG_EN]]&lt;br /&gt;
| 0x7000FA1C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_OPS_RESERVED&lt;br /&gt;
| 0x7000FA20&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SATA_CALIB&lt;br /&gt;
| 0x7000FA24&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_GPU_IDDQ_CALIB&lt;br /&gt;
| 0x7000FA28&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR3_CALIB&lt;br /&gt;
| 0x7000FA2C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SKU_BOND_OUT_L&lt;br /&gt;
| 0x7000FA30&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SKU_BOND_OUT_H&lt;br /&gt;
| 0x7000FA34&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SKU_BOND_OUT_U&lt;br /&gt;
| 0x7000FA38&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SKU_BOND_OUT_V&lt;br /&gt;
| 0x7000FA3C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SKU_BOND_OUT_W&lt;br /&gt;
| 0x7000FA40&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_SAMPLE_TYPE&lt;br /&gt;
| 0x7000FA44&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_SUBREVISION&lt;br /&gt;
| 0x7000FA48&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_SW_RESERVED_0&lt;br /&gt;
| 0x7000FA4C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_SW_RESERVED_1&lt;br /&gt;
| 0x7000FA50&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR4_CALIB&lt;br /&gt;
| 0x7000FA54&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR5_CALIB&lt;br /&gt;
| 0x7000FA58&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR6_CALIB&lt;br /&gt;
| 0x7000FA5C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR7_CALIB&lt;br /&gt;
| 0x7000FA60&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_OPT_PRIV_SEC_EN|FUSE_OPT_PRIV_SEC_EN]]&lt;br /&gt;
| 0x7000FA64&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PKC_DISABLE|FUSE_PKC_DISABLE]]&lt;br /&gt;
| 0x7000FA68&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_FUSE2TSEC_DEBUG_DISABLE&lt;br /&gt;
| 0x7000FA7C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR_COMMON&lt;br /&gt;
| 0x7000FA80&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_CP_BIN&lt;br /&gt;
| 0x7000FA84&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_DISABLE&lt;br /&gt;
| 0x7000FA88&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_FT_BIN&lt;br /&gt;
| 0x7000FA8C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_DONE_MAP&lt;br /&gt;
| 0x7000FA90&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_APB2JTAG_DISABLE&lt;br /&gt;
| 0x7000FA98&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_ODM_INFO&lt;br /&gt;
| 0x7000FA9C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_ARM_CRYPT_DE_FEATURE&lt;br /&gt;
| 0x7000FAA8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_WOA_SKU_FLAG&lt;br /&gt;
| 0x7000FAC0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_ECO_RESERVE_1&lt;br /&gt;
| 0x7000FAC4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_GCPLEX_CONFIG_FUSE&lt;br /&gt;
| 0x7000FAC8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PRODUCTION_MONTH&lt;br /&gt;
| 0x7000FACC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_RAM_REPAIR_INDICATOR&lt;br /&gt;
| 0x7000FAD0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR9_CALIB&lt;br /&gt;
| 0x7000FAD4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_VMIN_CALIBRATION&lt;br /&gt;
| 0x7000FADC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_AGING_SENSOR_CALIBRATION&lt;br /&gt;
| 0x7000FAE0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_DEBUG_AUTHENTICATION&lt;br /&gt;
| 0x7000FAE4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SECURE_PROVISION_INDEX&lt;br /&gt;
| 0x7000FAE8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SECURE_PROVISION_INFO&lt;br /&gt;
| 0x7000FAEC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_DISABLE_CP1&lt;br /&gt;
| 0x7000FAF0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_ENDIS&lt;br /&gt;
| 0x7000FAF4&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_ECO_RESERVE_0|FUSE_ECO_RESERVE_0]]&lt;br /&gt;
| 0x7000FAF8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_RESERVED_CALIB0&lt;br /&gt;
| 0x7000FB04&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_RESERVED_CALIB1&lt;br /&gt;
| 0x7000FB08&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_TPC0_DISABLE&lt;br /&gt;
| 0x7000FB0C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_TPC0_DISABLE_CP1&lt;br /&gt;
| 0x7000FB10&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_CPU_DISABLE&lt;br /&gt;
| 0x7000FB14&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_CPU_DISABLE_CP1&lt;br /&gt;
| 0x7000FB18&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR10_CALIB&lt;br /&gt;
| 0x7000FB1C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR10_CALIB_AUX&lt;br /&gt;
| 0x7000FB20&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_RAM_SVOP_DP&lt;br /&gt;
| 0x7000FB24&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_RAM_SVOP_PDP&lt;br /&gt;
| 0x7000FB28&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_RAM_SVOP_REG&lt;br /&gt;
| 0x7000FB2C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_RAM_SVOP_SP&lt;br /&gt;
| 0x7000FB30&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_RAM_SVOP_SMPDP&lt;br /&gt;
| 0x7000FB34&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_TPC0_DISABLE_CP2&lt;br /&gt;
| 0x7000FB38&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_TPC1_DISABLE&lt;br /&gt;
| 0x7000FB3C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_TPC1_DISABLE_CP1&lt;br /&gt;
| 0x7000FB40&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_TPC1_DISABLE_CP2&lt;br /&gt;
| 0x7000FB44&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_CPU_DISABLE_CP2&lt;br /&gt;
| 0x7000FB48&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_DISABLE_CP2&lt;br /&gt;
| 0x7000FB4C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_USB_CALIB_EXT&lt;br /&gt;
| 0x7000FB50&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_RESERVED_FIELD&lt;br /&gt;
| 0x7000FB54&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_ECC_EN&lt;br /&gt;
| 0x7000FB58&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_REALIGNMENT_REG&lt;br /&gt;
| 0x7000FB7C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_0&lt;br /&gt;
| 0x7000FB80&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_1&lt;br /&gt;
| 0x7000FB84&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_SPARE_BIT_2|FUSE_SPARE_BIT_2]]&lt;br /&gt;
| 0x7000FB88&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_SPARE_BIT_3|FUSE_SPARE_BIT_3]]&lt;br /&gt;
| 0x7000FB8C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_SPARE_BIT_4|FUSE_SPARE_BIT_4]]&lt;br /&gt;
| 0x7000FB90&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_SPARE_BIT_5|FUSE_SPARE_BIT_5]]&lt;br /&gt;
| 0x7000FB94&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_6&lt;br /&gt;
| 0x7000FB98&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_7&lt;br /&gt;
| 0x7000FB9C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_8&lt;br /&gt;
| 0x7000FBA0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_9&lt;br /&gt;
| 0x7000FBA4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_10&lt;br /&gt;
| 0x7000FBA8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_11&lt;br /&gt;
| 0x7000FBAC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_12&lt;br /&gt;
| 0x7000FBB0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_13&lt;br /&gt;
| 0x7000FBB4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_14&lt;br /&gt;
| 0x7000FBB8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_15&lt;br /&gt;
| 0x7000FBBC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_16&lt;br /&gt;
| 0x7000FBC0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_17&lt;br /&gt;
| 0x7000FBC4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_18&lt;br /&gt;
| 0x7000FBC8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_19&lt;br /&gt;
| 0x7000FBCC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_20&lt;br /&gt;
| 0x7000FBD0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_21&lt;br /&gt;
| 0x7000FBD4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_22&lt;br /&gt;
| 0x7000FBD8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_23&lt;br /&gt;
| 0x7000FBDC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_24&lt;br /&gt;
| 0x7000FBE0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_25&lt;br /&gt;
| 0x7000FBE4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_26&lt;br /&gt;
| 0x7000FBE8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_27&lt;br /&gt;
| 0x7000FBEC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_28&lt;br /&gt;
| 0x7000FBF0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_29&lt;br /&gt;
| 0x7000FBF4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_30&lt;br /&gt;
| 0x7000FBF8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_31&lt;br /&gt;
| 0x7000FBFC&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FUSE_SKU_INFO ====&lt;br /&gt;
Stores the SKU ID (must be 0x83).&lt;br /&gt;
&lt;br /&gt;
==== FUSE_OPT_FT_REV ====&lt;br /&gt;
Stores the FT (Final Test) revision.&lt;br /&gt;
&lt;br /&gt;
Original launch units have this value set to 0xA0 (revision 5.0). The first batch of patched units have this value set to 0xC0 (revision 6.0). The second batch of patched units have this value set to 0xE0 (revision 7.0)&lt;br /&gt;
&lt;br /&gt;
==== FUSE_SOC_SPEEDO_1_CALIB ====&lt;br /&gt;
Stores the bootrom patch version.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_FA ====&lt;br /&gt;
Stores failure analysis mode.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_PUBLIC_KEY ====&lt;br /&gt;
Stores the SHA256 hash of the 2048-bit RSA key expected at BCT+0x210.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_OPT_CP_REV ====&lt;br /&gt;
Stores the CP (Chip Probing) revision.&lt;br /&gt;
&lt;br /&gt;
Original launch units have this value set to 0xA0 (revision 5.0). Patched units have this value set to 0x103 (revision 8.3).&lt;br /&gt;
&lt;br /&gt;
==== FUSE_PRIVATE_KEY ====&lt;br /&gt;
Stores the 160-bit private key (128 bit SBK + 32-bit device key).&lt;br /&gt;
&lt;br /&gt;
Reads to these registers after the SBK is locked out produce all-FF output.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_RESERVED_SW ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-2&lt;br /&gt;
| Boot device&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Skip device selection straps (0 = don&#039;t skip; 1 = skip)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ENABLE_CHARGER_DETECT&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| ENABLE_WATCHDOG&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Forced RCM two button mode (0 = Only VOLUME_UP; 1 = VOLUME_UP + HOME)&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| RCM USB controller mode (0 = USB 2.0; 1 = XUSB)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Stores software reserved configuration values.&lt;br /&gt;
&lt;br /&gt;
Original launch units have the RCM USB controller mode set to USB 2.0, while the first batch of patched units have the RCM USB controller mode set to XUSB.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_RESERVED_ODM0 ====&lt;br /&gt;
Stores an hardware ID.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_RESERVED_ODM1 ====&lt;br /&gt;
Stores an hardware ID.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_RESERVED_ODM2 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-4&lt;br /&gt;
| [5.0.0+] Used as key generation (patched units only)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Stores an hardware ID in original launch units, but in patched units it stores a single value (key generation).&lt;br /&gt;
&lt;br /&gt;
==== FUSE_RESERVED_ODM3 ====&lt;br /&gt;
Stores an hardware ID in original launch units, but is empty in patched units.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_RESERVED_ODM4 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-1&lt;br /&gt;
| Unit type (0x00 = Retail, 0x03 = Debug)&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Production flag (0x00 = Prototype, 0x01 = Production)&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0-3.0.2] 3-5&lt;br /&gt;
[4.0.0+] 3-7&lt;br /&gt;
| DRAM ID&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Development flag (0x00 = Retail, 0x01 = Development)&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Unit type flag (0x00 = Debug, 0x01 = Retail)&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| [3.0.0+] Kiosk flag (0x00 = Retail, 0x01 = Kiosk/Quest)&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| [5.0.0+] Patch flag (0x00 = Unpatched, 1 = Patched)&lt;br /&gt;
|-&lt;br /&gt;
| 16-19&lt;br /&gt;
| [4.0.0+] New hardware type (0x00 = Icosa, 0x01 = Iowa, 0x02 = Hoag)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Stores some device configuration parameters.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_RESERVED_ODM5 ====&lt;br /&gt;
Empty and unused.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_RESERVED_ODM6 ====&lt;br /&gt;
Returns the value of the [[#reserved_odm6|reserved_odm6]] anti-downgrade fuse.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_RESERVED_ODM7 ====&lt;br /&gt;
Returns the value of the [[#reserved_odm7|reserved_odm7]] anti-downgrade fuse.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_OPT_SEC_DEBUG_EN ====&lt;br /&gt;
Controls the [[TSEC#TSEC_SCP_CTL_STAT|Falcon SCP]] debug mode.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_OPT_PRIV_SEC_EN ====&lt;br /&gt;
Controls the [[TSEC#FALCON_SCTL|Falcon Light Secure]] feature.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_PKC_DISABLE ====&lt;br /&gt;
Returns if public key crypto is used or not.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_ECO_RESERVE_0 ====&lt;br /&gt;
Returns the chip unique AID.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_SPARE_BIT_2 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Speedo fusing revision&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FUSE_SPARE_BIT_3 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Speedo fusing revision&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FUSE_SPARE_BIT_4 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Speedo fusing revision&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FUSE_SPARE_BIT_5 ====&lt;br /&gt;
Must be non-zero on retail units, otherwise the first bootloader panics.&lt;br /&gt;
On prototype units it can be zero, which tells the bootloader to choose from two pre-production master key seeds. If set to non-zero on a prototype unit, it tells the bootloader to choose from two master key seeds (with the second one being the same as the retail master key seed).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] This value is no longer used during boot.&lt;br /&gt;
&lt;br /&gt;
== Bitmap ==&lt;br /&gt;
The actual hardware fuses are stored in a bitmap and may be programmed through the fuse driver after enabling fuse programming.&lt;br /&gt;
&lt;br /&gt;
Fuse numbers are relative to the start of the fuse bitmap where each element is a 4 byte word and has a redundant alias. A single fuse write operation must always write the same value to &#039;&#039;&#039;fuse_bitmap + ((fuse_number + 0) &amp;lt;&amp;lt; 2)&#039;&#039;&#039; (PRIMARY_ALIAS) and &#039;&#039;&#039;fuse_bitmap + ((fuse_number + 1) &amp;lt;&amp;lt; 2)&#039;&#039;&#039; (REDUNDANT_ALIAS). However, spare bits and all fuses afterwards in the fuse bitmap, no longer have a redundant alias.&lt;br /&gt;
&lt;br /&gt;
Below is a list of common fuses used by Tegra devices (and applicable to the Switch).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Name&lt;br /&gt;
!  Number&lt;br /&gt;
!  Redundant number&lt;br /&gt;
!  Bits&lt;br /&gt;
|-&lt;br /&gt;
| enable_fuse_program&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| disable_fuse_program&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| bypass_fuses&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| jtag_direct_access_disable&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| production_mode&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| jtag_secureid_valid&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| odm_lock&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 6-9&lt;br /&gt;
|-&lt;br /&gt;
| fa_mode&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| security_mode&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
| arm_debug_dis&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| obs_dis&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 13&lt;br /&gt;
|-&lt;br /&gt;
| public_key0&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 30-31&lt;br /&gt;
|-&lt;br /&gt;
| public_key0&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 0-29&lt;br /&gt;
|-&lt;br /&gt;
| public_key1&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 30-31&lt;br /&gt;
|-&lt;br /&gt;
| public_key1&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| 0-29&lt;br /&gt;
|-&lt;br /&gt;
| public_key2&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| 30-31&lt;br /&gt;
|-&lt;br /&gt;
| public_key2&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 0-29&lt;br /&gt;
|-&lt;br /&gt;
| public_key3&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 30-31&lt;br /&gt;
|-&lt;br /&gt;
| public_key3&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 0-29&lt;br /&gt;
|-&lt;br /&gt;
| public_key4&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 30-31&lt;br /&gt;
|-&lt;br /&gt;
| public_key4&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 0-29&lt;br /&gt;
|-&lt;br /&gt;
| public_key5&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 30-31&lt;br /&gt;
|-&lt;br /&gt;
| public_key5&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 0-29&lt;br /&gt;
|-&lt;br /&gt;
| public_key6&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 30-31&lt;br /&gt;
|-&lt;br /&gt;
| public_key6&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 0-29&lt;br /&gt;
|-&lt;br /&gt;
| public_key7&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 30-31&lt;br /&gt;
|-&lt;br /&gt;
| public_key7&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 0-29&lt;br /&gt;
|-&lt;br /&gt;
| private_key0&lt;br /&gt;
| 34&lt;br /&gt;
| 35&lt;br /&gt;
| 12-31&lt;br /&gt;
|-&lt;br /&gt;
| private_key0&lt;br /&gt;
| 36&lt;br /&gt;
| 37&lt;br /&gt;
| 0-11&lt;br /&gt;
|-&lt;br /&gt;
| private_key1&lt;br /&gt;
| 36&lt;br /&gt;
| 37&lt;br /&gt;
| 12-31&lt;br /&gt;
|-&lt;br /&gt;
| private_key1&lt;br /&gt;
| 38&lt;br /&gt;
| 39&lt;br /&gt;
| 0-11&lt;br /&gt;
|-&lt;br /&gt;
| private_key2&lt;br /&gt;
| 38&lt;br /&gt;
| 39&lt;br /&gt;
| 12-31&lt;br /&gt;
|-&lt;br /&gt;
| private_key2&lt;br /&gt;
| 40&lt;br /&gt;
| 41&lt;br /&gt;
| 0-11&lt;br /&gt;
|-&lt;br /&gt;
| private_key3&lt;br /&gt;
| 40&lt;br /&gt;
| 41&lt;br /&gt;
| 12-31&lt;br /&gt;
|-&lt;br /&gt;
| private_key3&lt;br /&gt;
| 42&lt;br /&gt;
| 43&lt;br /&gt;
| 0-11&lt;br /&gt;
|-&lt;br /&gt;
| private_key4&lt;br /&gt;
| 42&lt;br /&gt;
| 43&lt;br /&gt;
| 12-31&lt;br /&gt;
|-&lt;br /&gt;
| private_key4&lt;br /&gt;
| 44&lt;br /&gt;
| 45&lt;br /&gt;
| 0-11&lt;br /&gt;
|-&lt;br /&gt;
| boot_device_info&lt;br /&gt;
| 44&lt;br /&gt;
| 45&lt;br /&gt;
| 12-27&lt;br /&gt;
|-&lt;br /&gt;
| reserved_sw&lt;br /&gt;
| 44&lt;br /&gt;
| 45&lt;br /&gt;
| 28-31&lt;br /&gt;
|-&lt;br /&gt;
| reserved_sw&lt;br /&gt;
| 46&lt;br /&gt;
| 47&lt;br /&gt;
| 0-3&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm0&lt;br /&gt;
| 46&lt;br /&gt;
| 47&lt;br /&gt;
| 5-31&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm0&lt;br /&gt;
| 48&lt;br /&gt;
| 49&lt;br /&gt;
| 0-4&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm1&lt;br /&gt;
| 48&lt;br /&gt;
| 49&lt;br /&gt;
| 5-31&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm1&lt;br /&gt;
| 50&lt;br /&gt;
| 51&lt;br /&gt;
| 0-4&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm2&lt;br /&gt;
| 50&lt;br /&gt;
| 51&lt;br /&gt;
| 5-31&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm2&lt;br /&gt;
| 52&lt;br /&gt;
| 53&lt;br /&gt;
| 0-4&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm3&lt;br /&gt;
| 52&lt;br /&gt;
| 53&lt;br /&gt;
| 5-31&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm3&lt;br /&gt;
| 54&lt;br /&gt;
| 55&lt;br /&gt;
| 0-4&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm4&lt;br /&gt;
| 54&lt;br /&gt;
| 55&lt;br /&gt;
| 5-31&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm4&lt;br /&gt;
| 56&lt;br /&gt;
| 57&lt;br /&gt;
| 0-4&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm5&lt;br /&gt;
| 56&lt;br /&gt;
| 57&lt;br /&gt;
| 5-31&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm5&lt;br /&gt;
| 58&lt;br /&gt;
| 59&lt;br /&gt;
| 0-4&lt;br /&gt;
|-&lt;br /&gt;
| [[#reserved_odm6|reserved_odm6]]&lt;br /&gt;
| 58&lt;br /&gt;
| 59&lt;br /&gt;
| 5-31&lt;br /&gt;
|-&lt;br /&gt;
| [[#reserved_odm6|reserved_odm6]]&lt;br /&gt;
| 60&lt;br /&gt;
| 61&lt;br /&gt;
| 0-4&lt;br /&gt;
|-&lt;br /&gt;
| [[#reserved_odm7|reserved_odm7]]&lt;br /&gt;
| 60&lt;br /&gt;
| 61&lt;br /&gt;
| 5-31&lt;br /&gt;
|-&lt;br /&gt;
| [[#reserved_odm7|reserved_odm7]]&lt;br /&gt;
| 62&lt;br /&gt;
| 63&lt;br /&gt;
| 0-4&lt;br /&gt;
|-&lt;br /&gt;
| kfuse_privkey_ctrl&lt;br /&gt;
| 64&lt;br /&gt;
| 65&lt;br /&gt;
| 13-14&lt;br /&gt;
|-&lt;br /&gt;
| package_info&lt;br /&gt;
| 64&lt;br /&gt;
| 65&lt;br /&gt;
| 15-18&lt;br /&gt;
|-&lt;br /&gt;
| opt_vendor_code&lt;br /&gt;
| 64&lt;br /&gt;
| 65&lt;br /&gt;
| 19-22&lt;br /&gt;
|-&lt;br /&gt;
| opt_fab_code&lt;br /&gt;
| 64&lt;br /&gt;
| 65&lt;br /&gt;
| 23-28&lt;br /&gt;
|-&lt;br /&gt;
| opt_lot_code_0&lt;br /&gt;
| 64&lt;br /&gt;
| 65&lt;br /&gt;
| 29-31&lt;br /&gt;
|-&lt;br /&gt;
| opt_lot_code_0&lt;br /&gt;
| 66&lt;br /&gt;
| 67&lt;br /&gt;
| 0-28&lt;br /&gt;
|-&lt;br /&gt;
| opt_lot_code_1&lt;br /&gt;
| 66&lt;br /&gt;
| 67&lt;br /&gt;
| 29-31&lt;br /&gt;
|-&lt;br /&gt;
| opt_lot_code_1&lt;br /&gt;
| 68&lt;br /&gt;
| 69&lt;br /&gt;
| 0-24&lt;br /&gt;
|-&lt;br /&gt;
| opt_wafer_id&lt;br /&gt;
| 68&lt;br /&gt;
| 69&lt;br /&gt;
| 25-30&lt;br /&gt;
|-&lt;br /&gt;
| opt_x_coordinate&lt;br /&gt;
| 68&lt;br /&gt;
| 69&lt;br /&gt;
| 31&lt;br /&gt;
|-&lt;br /&gt;
| opt_x_coordinate&lt;br /&gt;
| 70&lt;br /&gt;
| 71&lt;br /&gt;
| 0-7&lt;br /&gt;
|-&lt;br /&gt;
| opt_y_coordinate&lt;br /&gt;
| 70&lt;br /&gt;
| 71&lt;br /&gt;
| 8-16&lt;br /&gt;
|-&lt;br /&gt;
| opt_sec_debug_en&lt;br /&gt;
| 70&lt;br /&gt;
| 71&lt;br /&gt;
| 17&lt;br /&gt;
|-&lt;br /&gt;
| opt_ops_reserved&lt;br /&gt;
| 70&lt;br /&gt;
| 71&lt;br /&gt;
| 18-23&lt;br /&gt;
|-&lt;br /&gt;
| sata_calib&lt;br /&gt;
| 70&lt;br /&gt;
| 71&lt;br /&gt;
| 24-25&lt;br /&gt;
|-&lt;br /&gt;
| opt_priv_sec_en&lt;br /&gt;
| 90&lt;br /&gt;
| 91&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| pkc_disable&lt;br /&gt;
| 90&lt;br /&gt;
| 91&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| fuse2tsec_debug_disable&lt;br /&gt;
| 90&lt;br /&gt;
| 91&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| secure_provision_index&lt;br /&gt;
| 90&lt;br /&gt;
| 91&lt;br /&gt;
| 24-27&lt;br /&gt;
|-&lt;br /&gt;
| secure_provision_info&lt;br /&gt;
| 90&lt;br /&gt;
| 91&lt;br /&gt;
| 28-29&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_0&lt;br /&gt;
| 100&lt;br /&gt;
| None&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_1&lt;br /&gt;
| 100&lt;br /&gt;
| None&lt;br /&gt;
| 17&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_2&lt;br /&gt;
| 100&lt;br /&gt;
| None&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_3&lt;br /&gt;
| 100&lt;br /&gt;
| None&lt;br /&gt;
| 19&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_4&lt;br /&gt;
| 100&lt;br /&gt;
| None&lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_5&lt;br /&gt;
| 100&lt;br /&gt;
| None&lt;br /&gt;
| 21&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_6&lt;br /&gt;
| 100&lt;br /&gt;
| None&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_7&lt;br /&gt;
| 100&lt;br /&gt;
| None&lt;br /&gt;
| 23&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_8&lt;br /&gt;
| 100&lt;br /&gt;
| None&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_9&lt;br /&gt;
| 100&lt;br /&gt;
| None&lt;br /&gt;
| 25&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_10&lt;br /&gt;
| 100&lt;br /&gt;
| None&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_11&lt;br /&gt;
| 100&lt;br /&gt;
| None&lt;br /&gt;
| 27&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_12&lt;br /&gt;
| 100&lt;br /&gt;
| None&lt;br /&gt;
| 28&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_13&lt;br /&gt;
| 100&lt;br /&gt;
| None&lt;br /&gt;
| 29&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_14&lt;br /&gt;
| 100&lt;br /&gt;
| None&lt;br /&gt;
| 30&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_15&lt;br /&gt;
| 100&lt;br /&gt;
| None&lt;br /&gt;
| 31&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_16&lt;br /&gt;
| 101&lt;br /&gt;
| None&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_17&lt;br /&gt;
| 101&lt;br /&gt;
| None&lt;br /&gt;
| 17&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_18&lt;br /&gt;
| 101&lt;br /&gt;
| None&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_19&lt;br /&gt;
| 101&lt;br /&gt;
| None&lt;br /&gt;
| 19&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_20&lt;br /&gt;
| 101&lt;br /&gt;
| None&lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_21&lt;br /&gt;
| 101&lt;br /&gt;
| None&lt;br /&gt;
| 21&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_22&lt;br /&gt;
| 101&lt;br /&gt;
| None&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_23&lt;br /&gt;
| 101&lt;br /&gt;
| None&lt;br /&gt;
| 23&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_24&lt;br /&gt;
| 101&lt;br /&gt;
| None&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_25&lt;br /&gt;
| 101&lt;br /&gt;
| None&lt;br /&gt;
| 25&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_26&lt;br /&gt;
| 101&lt;br /&gt;
| None&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_27&lt;br /&gt;
| 101&lt;br /&gt;
| None&lt;br /&gt;
| 27&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_28&lt;br /&gt;
| 101&lt;br /&gt;
| None&lt;br /&gt;
| 28&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_29&lt;br /&gt;
| 101&lt;br /&gt;
| None&lt;br /&gt;
| 29&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_30&lt;br /&gt;
| 101&lt;br /&gt;
| None&lt;br /&gt;
| 30&lt;br /&gt;
|-&lt;br /&gt;
| spare_bit_31&lt;br /&gt;
| 101&lt;br /&gt;
| None&lt;br /&gt;
| 31&lt;br /&gt;
|-&lt;br /&gt;
| aid&lt;br /&gt;
| 103&lt;br /&gt;
| None&lt;br /&gt;
| 2-31&lt;br /&gt;
|-&lt;br /&gt;
| aid&lt;br /&gt;
| 104&lt;br /&gt;
| None&lt;br /&gt;
| 0-1&lt;br /&gt;
|-&lt;br /&gt;
| ramrepair_record0&lt;br /&gt;
| 106&lt;br /&gt;
| None&lt;br /&gt;
| 0-31&lt;br /&gt;
|-&lt;br /&gt;
| ramrepair_record1&lt;br /&gt;
| 107&lt;br /&gt;
| None&lt;br /&gt;
| 0-31&lt;br /&gt;
|-&lt;br /&gt;
| ramrepair_record2&lt;br /&gt;
| 108&lt;br /&gt;
| None&lt;br /&gt;
| 0-31&lt;br /&gt;
|-&lt;br /&gt;
| ramrepair_record3&lt;br /&gt;
| 109&lt;br /&gt;
| None&lt;br /&gt;
| 0-31&lt;br /&gt;
|-&lt;br /&gt;
| ramrepair_record4&lt;br /&gt;
| 110&lt;br /&gt;
| None&lt;br /&gt;
| 0-31&lt;br /&gt;
|-&lt;br /&gt;
| ramrepair_record5&lt;br /&gt;
| 111&lt;br /&gt;
| None&lt;br /&gt;
| 0-31&lt;br /&gt;
|-&lt;br /&gt;
| ramrepair_record6&lt;br /&gt;
| 112&lt;br /&gt;
| None&lt;br /&gt;
| 0-31&lt;br /&gt;
|-&lt;br /&gt;
| ramrepair_record7&lt;br /&gt;
| 113&lt;br /&gt;
| None&lt;br /&gt;
| 0-31&lt;br /&gt;
|-&lt;br /&gt;
| [[#irom_patch|irom_patch]]&lt;br /&gt;
| 114&lt;br /&gt;
| None&lt;br /&gt;
| Variable&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== reserved_odm6 ===&lt;br /&gt;
Used for [[#Anti-downgrade|anti-downgrade]] control.&lt;br /&gt;
&lt;br /&gt;
=== reserved_odm7 ===&lt;br /&gt;
Used for [[#Anti-downgrade|anti-downgrade]] control.&lt;br /&gt;
&lt;br /&gt;
=== irom_patch ===&lt;br /&gt;
Tegra210 based hardware such as the Switch provides support for bootrom patches. The patch data is burned to the hardware fuse bitmap using a specific format (see [https://gist.github.com/shuffle2/f8728159da100e9df2606d43925de0af shuffle2&#039;s ipatch decoder]). The bootrom reads these fuses in order to initialize the IPATCH hardware, which allows overriding data returned for code and data fetches done by BPMP.&lt;br /&gt;
&lt;br /&gt;
The following represents the patch data dumped from a Switch console:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
RAM:00000000 ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:00000000&lt;br /&gt;
RAM:00000000&lt;br /&gt;
RAM:00000000 irom_svc_dispatch&lt;br /&gt;
RAM:00000000   STMFD   SP!, {R0-R2}                  ; ipatches (new):&lt;br /&gt;
RAM:00000000                                         ;  0  b57df00     16ae     df00 : svc #0x00 (offset 0x48)&lt;br /&gt;
RAM:00000000                                         ;  1 1820df22     3040     df22 : svc #0x22 (offset 0x8c)&lt;br /&gt;
RAM:00000000                                         ;  2 3797df26     6f2e     df26 : svc #0x26 (offset 0x94)&lt;br /&gt;
RAM:00000000                                         ;  3 3b4d2100     769a     2100 : movs r1, #0x00&lt;br /&gt;
RAM:00000000                                         ;  4  42bdf2c      856     df2c : svc #0x2c (offset 0xa0)&lt;br /&gt;
RAM:00000000                                         ;  5 37aadf42     6f54     df42 : svc #0x42 (offset 0xcc)&lt;br /&gt;
RAM:00000000                                         ;  6  972df4b     12e4     df4b : svc #0x4b (offset 0xde)&lt;br /&gt;
RAM:00000000                                         ;  7 2293df54     4526     df54 : svc #0x54 (offset 0xf0)&lt;br /&gt;
RAM:00000000                                         ;  8 21fadf5d     43f4     df5d : svc #0x5d (offset 0x102)&lt;br /&gt;
RAM:00000000                                         ;  9 bba2ac57    17744     ac57 : data&lt;br /&gt;
RAM:00000000                                         ; 10 bbac3d19    17758     3d19 : data&lt;br /&gt;
RAM:00000000                                         ; 11 1e952001     3d2a     2001 : movs r0, #0x01&lt;br /&gt;
RAM:00000000                                         ; &lt;br /&gt;
RAM:00000000                                         ; ipatches (old):&lt;br /&gt;
RAM:00000000                                         ;  0  b57df00     16ae     df00 : svc #0x00 (offset 0x48)&lt;br /&gt;
RAM:00000000                                         ;  1 1820df22     3040     df22 : svc #0x22 (offset 0x8c)&lt;br /&gt;
RAM:00000000                                         ;  2 3797df26     6f2e     df26 : svc #0x26 (offset 0x94)&lt;br /&gt;
RAM:00000000                                         ;  3 7d9e2000     fb3c     2000 : movs r0, #0x00&lt;br /&gt;
RAM:00000000                                         ;  4  42bdf2c      856     df2c : svc #0x2c (offset 0xa0)&lt;br /&gt;
RAM:00000000                                         ;  5 37aadf42     6f54     df42 : svc #0x42 (offset 0xcc)&lt;br /&gt;
RAM:00000000                                         ;  6  972df4b     12e4     df4b : svc #0x4b (offset 0xde)&lt;br /&gt;
RAM:00000000                                         ;  7 2293df54     4526     df54 : svc #0x54 (offset 0xf0)&lt;br /&gt;
RAM:00000000                                         ;  8 21fadf5d     43f4     df5d : svc #0x5d (offset 0x102)&lt;br /&gt;
RAM:00000000                                         ;  9 bba2ac57    17744     ac57 : data&lt;br /&gt;
RAM:00000000                                         ; 10 bbac3d19    17758     3d19 : data&lt;br /&gt;
RAM:00000000                                         ; 11 1e952001     3d2a     2001 : movs r0, #0x01&lt;br /&gt;
RAM:00000004   MOV     R2, LR&lt;br /&gt;
RAM:00000008   SUB     R2, R2, #2&lt;br /&gt;
RAM:0000000C   LDR     R2, [R2]&lt;br /&gt;
RAM:00000010   AND     R2, R2, #0xFF&lt;br /&gt;
RAM:00000014   MOV     R2, R2,LSL#1&lt;br /&gt;
RAM:00000018   LDR     R0, =0x1007B0&lt;br /&gt;
RAM:0000001C   LDR     R1, =0x1007F8&lt;br /&gt;
RAM:00000020   SUB     R1, R1, R0&lt;br /&gt;
RAM:00000024   LDR     R0, =0x40004C30&lt;br /&gt;
RAM:00000028   ADD     R0, R0, R1&lt;br /&gt;
RAM:0000002C   ADD     R2, R2, R0&lt;br /&gt;
RAM:00000030   ORR     R2, R2, #1&lt;br /&gt;
RAM:00000034   LDMFD   SP!, {R0,R1}&lt;br /&gt;
RAM:00000038   BX      R2&lt;br /&gt;
RAM:00000038 ; End of function irom_svc_dispatch&lt;br /&gt;
RAM:00000038&lt;br /&gt;
RAM:00000038 ; ---------------------------------------------------------------------------&lt;br /&gt;
RAM:0000003C dword_3C DCD 0x1007B0                   ; DATA XREF: irom_svc_dispatch+18↑r&lt;br /&gt;
RAM:00000040 dword_40 DCD 0x1007F8                   ; DATA XREF: irom_svc_dispatch+1C↑r&lt;br /&gt;
RAM:00000044 dword_44 DCD 0x40004C30                 ; DATA XREF: irom_svc_dispatch+24↑r&lt;br /&gt;
RAM:00000048   CODE16&lt;br /&gt;
RAM:00000048&lt;br /&gt;
RAM:00000048 ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:00000048&lt;br /&gt;
RAM:00000048&lt;br /&gt;
RAM:00000048 sub_48&lt;br /&gt;
RAM:00000048   MOVS    R2, #0                        ; 0  b57df00     16ae     df00 : svc #0x00 (offset 0x48)&lt;br /&gt;
RAM:0000004A   MVNS    R2, R2&lt;br /&gt;
RAM:0000004C   LDR     R1, =0x60006410&lt;br /&gt;
RAM:0000004E   STR     R2, [R1,#0x30]&lt;br /&gt;
RAM:00000050   STR     R2, [R1,#0x38]&lt;br /&gt;
RAM:00000052   LDR     R1, =0x600060F8&lt;br /&gt;
RAM:00000054   STR     R2, [R1]&lt;br /&gt;
RAM:00000056   STR     R2, [R1,#4]&lt;br /&gt;
RAM:00000058   LDR     R1, =0x60006284&lt;br /&gt;
RAM:0000005A   STR     R2, [R1]&lt;br /&gt;
RAM:0000005C   STR     R2, [R1,#0x18]&lt;br /&gt;
RAM:0000005E   ADDS    R1, #0x80&lt;br /&gt;
RAM:00000060   ADDS    R1, #0x1C&lt;br /&gt;
RAM:00000062   STR     R2, [R1]&lt;br /&gt;
RAM:00000064   STR     R2, [R1,#8]&lt;br /&gt;
RAM:00000066   STR     R2, [R1,#0x10]&lt;br /&gt;
RAM:00000068   ADDS    R1, #0x80&lt;br /&gt;
RAM:0000006A   STR     R2, [R1]&lt;br /&gt;
RAM:0000006C   STR     R2, [R1,#4]&lt;br /&gt;
RAM:0000006E   LDR     R1, =0x60006554&lt;br /&gt;
RAM:00000070   STR     R2, [R1]&lt;br /&gt;
RAM:00000072   MOVS    R2, #0xA0000000&lt;br /&gt;
RAM:00000076   LDR     R1, =0x60006148&lt;br /&gt;
RAM:00000078   STR     R2, [R1]&lt;br /&gt;
RAM:0000007A   ADDS    R1, #0x38 ; &#039;8&#039;&lt;br /&gt;
RAM:0000007C   STR     R2, [R1]&lt;br /&gt;
RAM:0000007E   MOVS    R2, #0xE0000000&lt;br /&gt;
RAM:00000082   LDR     R1, =0x600066A0&lt;br /&gt;
RAM:00000084   STR     R2, [R1]&lt;br /&gt;
RAM:00000086   MOVS    R1, #0&lt;br /&gt;
RAM:00000088   MOVS    R0, #0xE&lt;br /&gt;
RAM:0000008A   B       pop_r2_mov_pc_lr&lt;br /&gt;
RAM:0000008A ; End of function sub_48&lt;br /&gt;
RAM:0000008A&lt;br /&gt;
RAM:0000008C&lt;br /&gt;
RAM:0000008C ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:0000008C&lt;br /&gt;
RAM:0000008C&lt;br /&gt;
RAM:0000008C sub_8C&lt;br /&gt;
RAM:0000008C   LDR     R0, [R1,#0x18]                ; 1 1820df22     3040     df22 : svc #0x22 (offset 0x8c)&lt;br /&gt;
RAM:0000008E   MOVS    R2, #1&lt;br /&gt;
RAM:00000090   ORRS    R0, R2&lt;br /&gt;
RAM:00000092   B       pop_r2_mov_pc_lr&lt;br /&gt;
RAM:00000092 ; End of function sub_8C&lt;br /&gt;
RAM:00000092&lt;br /&gt;
RAM:00000094&lt;br /&gt;
RAM:00000094 ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:00000094&lt;br /&gt;
RAM:00000094&lt;br /&gt;
RAM:00000094 sub_94&lt;br /&gt;
RAM:00000094   LDR     R2, [R4,#0x50]                ; 2 3797df26     6f2e     df26 : svc #0x26 (offset 0x94)&lt;br /&gt;
RAM:00000096   ADDS    R2, R2, #2&lt;br /&gt;
RAM:00000098   STR     R2, [R4,#0x50]&lt;br /&gt;
RAM:0000009A   SUBS    R1, #0x80&lt;br /&gt;
RAM:0000009C   STR     R1, [R4,#0x34]&lt;br /&gt;
RAM:0000009E   B       pop_r2_mov_pc_lr&lt;br /&gt;
RAM:0000009E ; End of function sub_94&lt;br /&gt;
RAM:0000009E&lt;br /&gt;
RAM:000000A0&lt;br /&gt;
RAM:000000A0 ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:000000A0&lt;br /&gt;
RAM:000000A0&lt;br /&gt;
RAM:000000A0 sub_A0&lt;br /&gt;
RAM:000000A0&lt;br /&gt;
RAM:000000A0 ; FUNCTION CHUNK AT RAM:00000148 SIZE 00000004 BYTES&lt;br /&gt;
RAM:000000A0&lt;br /&gt;
RAM:000000A0   MOVS    R0, #0x70000000               ; 4  42bdf2c      856     df2c : svc #0x2c (offset 0xa0)&lt;br /&gt;
RAM:000000A4   LDR     R6, =dword_7000EF14&lt;br /&gt;
RAM:000000A6   LDR     R2, =dword_7000E5B4&lt;br /&gt;
RAM:000000A8   LDR     R2, [R2]&lt;br /&gt;
RAM:000000AA   CMP     R2, #0&lt;br /&gt;
RAM:000000AC   BEQ     loc_B4&lt;br /&gt;
RAM:000000AE   LDR     R2, [R6]&lt;br /&gt;
RAM:000000B0   STR     R2, [R0,#8]&lt;br /&gt;
RAM:000000B2   B       loc_BC&lt;br /&gt;
RAM:000000B4 ; ---------------------------------------------------------------------------&lt;br /&gt;
RAM:000000B4&lt;br /&gt;
RAM:000000B4 loc_B4                                  ; CODE XREF: sub_A0+C↑j&lt;br /&gt;
RAM:000000B4   LDR     R2, [R0,#8]&lt;br /&gt;
RAM:000000B6   LSRS    R0, R0, #0x12&lt;br /&gt;
RAM:000000B8   ORRS    R2, R0&lt;br /&gt;
RAM:000000BA   STR     R2, [R6]&lt;br /&gt;
RAM:000000BC&lt;br /&gt;
RAM:000000BC loc_BC                                  ; CODE XREF: sub_A0+12↑j&lt;br /&gt;
RAM:000000BC   LDR     R6, =dword_7000E9C0&lt;br /&gt;
RAM:000000BE   LDR     R0, [R6]&lt;br /&gt;
RAM:000000C0   MOVS    R2, #0x4000&lt;br /&gt;
RAM:000000C4   ORRS    R2, R0&lt;br /&gt;
RAM:000000C6   STR     R2, [R6]&lt;br /&gt;
RAM:000000C8   LDR     R0, [R5,#0x10]&lt;br /&gt;
RAM:000000CA   B       pop_r2_mov_pc_lr&lt;br /&gt;
RAM:000000CA ; End of function sub_A0&lt;br /&gt;
RAM:000000CA&lt;br /&gt;
RAM:000000CC&lt;br /&gt;
RAM:000000CC ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:000000CC&lt;br /&gt;
RAM:000000CC&lt;br /&gt;
RAM:000000CC sub_CC&lt;br /&gt;
RAM:000000CC   MOVS    R2, #0xF000000                ; 5 37aadf42     6f54     df42 : svc #0x42 (offset 0xcc)&lt;br /&gt;
RAM:000000D0   BICS    R1, R2&lt;br /&gt;
RAM:000000D2   STR     R1, [R4,#0x10]&lt;br /&gt;
RAM:000000D4   LDR     R1, [R4,#0x50]&lt;br /&gt;
RAM:000000D6   MOVS    R2, #7&lt;br /&gt;
RAM:000000D8   BICS    R1, R2&lt;br /&gt;
RAM:000000DA   STR     R1, [R4,#0x50]&lt;br /&gt;
RAM:000000DC   B       pop_r2_mov_pc_lr&lt;br /&gt;
RAM:000000DC ; End of function sub_CC&lt;br /&gt;
RAM:000000DC&lt;br /&gt;
RAM:000000DE&lt;br /&gt;
RAM:000000DE ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:000000DE&lt;br /&gt;
RAM:000000DE&lt;br /&gt;
RAM:000000DE sub_DE&lt;br /&gt;
RAM:000000DE   LDR     R2, =dword_7000FA9C           ; 6  972df4b     12e4     df4b : svc #0x4b (offset 0xde)&lt;br /&gt;
RAM:000000E0   LDR     R2, [R2]&lt;br /&gt;
RAM:000000E2   LSRS    R2, R2, #8&lt;br /&gt;
RAM:000000E4   LSLS    R2, R2, #1&lt;br /&gt;
RAM:000000E6   LDR     R1, [R4]&lt;br /&gt;
RAM:000000E8   BICS    R1, R2&lt;br /&gt;
RAM:000000EA   STR     R1, [R4]&lt;br /&gt;
RAM:000000EC   CMP     R0, #0&lt;br /&gt;
RAM:000000EE   B       pop_r2_mov_pc_lr&lt;br /&gt;
RAM:000000EE ; End of function sub_DE&lt;br /&gt;
RAM:000000EE&lt;br /&gt;
RAM:000000F0&lt;br /&gt;
RAM:000000F0 ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:000000F0&lt;br /&gt;
RAM:000000F0&lt;br /&gt;
RAM:000000F0 sub_F0&lt;br /&gt;
RAM:000000F0&lt;br /&gt;
RAM:000000F0 arg_0=  0&lt;br /&gt;
RAM:000000F0&lt;br /&gt;
RAM:000000F0   LDR     R0, =0x400049F0               ; 7 2293df54     4526     df54 : svc #0x54 (offset 0xf0)&lt;br /&gt;
RAM:000000F2   LDR     R2, [R0]&lt;br /&gt;
RAM:000000F4   STR     R2, [SP,#arg_0]&lt;br /&gt;
RAM:000000F6   LDR     R0, =0x40010000&lt;br /&gt;
RAM:000000F8   LSRS    R2, R2, #17&lt;br /&gt;
RAM:000000FA   BEQ     pop_r2_mov_pc_lr              ; if ([0x400049F0] &amp;gt;&amp;gt; 17) == 0) {&lt;br /&gt;
RAM:000000FA                                         ;   r2 = [0x400049F0];&lt;br /&gt;
RAM:000000FA                                         ; } else {&lt;br /&gt;
RAM:000000FC   LDR     R0, =APBDEV_PMC_CNTRL_0&lt;br /&gt;
RAM:000000FE   STR     R4, [R0]                      ;  write APBDEV_PMC_CNTRL&lt;br /&gt;
RAM:00000100&lt;br /&gt;
RAM:00000100 loc_100                                 ; CODE XREF: sub_F0:loc_100↓j&lt;br /&gt;
RAM:00000100   B       loc_100                       ;  hang&lt;br /&gt;
RAM:00000100 ; End of function sub_F0                ; }&lt;br /&gt;
RAM:00000100&lt;br /&gt;
RAM:00000102&lt;br /&gt;
RAM:00000102 ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:00000102&lt;br /&gt;
RAM:00000102&lt;br /&gt;
RAM:00000102 sub_102&lt;br /&gt;
RAM:00000102&lt;br /&gt;
RAM:00000102 arg_0=  0&lt;br /&gt;
RAM:00000102&lt;br /&gt;
RAM:00000102   LDR     R2, =0x40010220               ; 8 21fadf5d     43f4     df5d : svc #0x5d (offset 0x102)&lt;br /&gt;
RAM:00000104   STR     R2, [SP,#arg_0]               ; set r2 retval = [0x40010220]&lt;br /&gt;
RAM:00000106   LDR     R2, [R2,#0x18]&lt;br /&gt;
RAM:00000108   ADDS    R0, #0xFC&lt;br /&gt;
RAM:0000010A   STR     R2, [R0,#0x1C]                ; [r0+0x118] = [0x40010220 + 0x18]&lt;br /&gt;
RAM:0000010C   B       pop_r2_mov_pc_lr&lt;br /&gt;
RAM:0000010C ; End of function sub_102&lt;br /&gt;
RAM:0000010C&lt;br /&gt;
RAM:0000010C ; ---------------------------------------------------------------------------&lt;br /&gt;
RAM:0000010E   DCB    0&lt;br /&gt;
RAM:0000010F   DCB    0&lt;br /&gt;
RAM:00000110 off_110 DCD 0x60006410                  ; DATA XREF: sub_48+4↑r&lt;br /&gt;
RAM:00000114 off_114 DCD 0x600060F8                  ; DATA XREF: sub_48+A↑r&lt;br /&gt;
RAM:00000118 off_118 DCD 0x60006284                  ; DATA XREF: sub_48+10↑r&lt;br /&gt;
RAM:0000011C off_11C DCD 0x60006554                  ; DATA XREF: sub_48+26↑r&lt;br /&gt;
RAM:00000120 off_120 DCD 0x60006148                  ; DATA XREF: sub_48+2E↑r&lt;br /&gt;
RAM:00000124 off_124 DCD 0x600066A0                  ; DATA XREF: sub_48+3A↑r&lt;br /&gt;
RAM:00000128 off_128 DCD dword_7000EF14              ; DATA XREF: sub_A0+4↑r&lt;br /&gt;
RAM:0000012C off_12C DCD dword_7000E5B4              ; DATA XREF: sub_A0+6↑r&lt;br /&gt;
RAM:00000130 off_130 DCD dword_7000E9C0              ; DATA XREF: sub_A0:loc_BC↑r&lt;br /&gt;
RAM:00000134 off_134 DCD dword_7000FA9C              ; DATA XREF: sub_DE↑r&lt;br /&gt;
RAM:00000138 off_138 DCD 0x400049F0                  ; DATA XREF: sub_F0↑r&lt;br /&gt;
RAM:0000013C dword_13C DCD 0x40010000                ; DATA XREF: sub_F0+6↑r&lt;br /&gt;
RAM:00000140 off_140 DCD APBDEV_PMC_CNTRL_0          ; DATA XREF: sub_F0+C↑r&lt;br /&gt;
RAM:00000144 off_144 DCD 0x40010220                  ; DATA XREF: sub_102↑r&lt;br /&gt;
RAM:00000148 ; ---------------------------------------------------------------------------&lt;br /&gt;
RAM:00000148 ; START OF FUNCTION CHUNK FOR sub_A0&lt;br /&gt;
RAM:00000148&lt;br /&gt;
RAM:00000148 pop_r2_mov_pc_lr                        ; CODE XREF: sub_48+42↑j&lt;br /&gt;
RAM:00000148                                         ; sub_8C+6↑j ...&lt;br /&gt;
RAM:00000148   POP     {R2}&lt;br /&gt;
RAM:0000014A   MOV     PC, LR&lt;br /&gt;
RAM:0000014A ; END OF FUNCTION CHUNK FOR sub_A0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The last 4 patches are exclusive to the Switch, while the remaining ones are often included in most Tegra210 based devices.&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 0 ====&lt;br /&gt;
This patch configures clock enables and clock gate overrides for new hardware.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 u32 CLK_ENB_H_SET = 0x60006328;&lt;br /&gt;
 u32 CLK_ENB_L_SET = 0x60006320;&lt;br /&gt;
 u32 CLK_ENB_U_SET = 0x60006330; &lt;br /&gt;
 u32 CLK_ENB_V_SET = 0x60006440;&lt;br /&gt;
 u32 CLK_ENB_W_SET = 0x60006448;&lt;br /&gt;
 u32 CLK_ENB_X_SET = 0x60006284;&lt;br /&gt;
 u32 CLK_ENB_Y_SET = 0x6000629C;&lt;br /&gt;
 u32 LVL2_CLK_GATE_OVRA = 0x600060F8;&lt;br /&gt;
 u32 LVL2_CLK_GATE_OVRB = 0x600060FC;&lt;br /&gt;
 u32 LVL2_CLK_GATE_OVRC = 0x600063A0;&lt;br /&gt;
 u32 LVL2_CLK_GATE_OVRD = 0x600063A4;&lt;br /&gt;
 u32 LVL2_CLK_GATE_OVRE = 0x60006554;&lt;br /&gt;
 u32 CLK_SOURCE_VI = 0x60006148;&lt;br /&gt;
 u32 CLK_SOURCE_HOST1X = 0x60006180;&lt;br /&gt;
 u32 CLK_SOURCE_NVENC = 0x600066A0; &lt;br /&gt;
&lt;br /&gt;
 // Set all clock enables and overrides&lt;br /&gt;
 *(u32 *)CLK_ENB_V_SET = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)CLK_ENB_W_SET = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)LVL2_CLK_GATE_OVRA = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)LVL2_CLK_GATE_OVRB = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)CLK_ENB_X_SET = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)CLK_ENB_Y_SET = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)CLK_ENB_L_SET = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)CLK_ENB_H_SET = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)CLK_ENB_U_SET = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)LVL2_CLK_GATE_OVRC = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)LVL2_CLK_GATE_OVRD = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)LVL2_CLK_GATE_OVRE = 0xFFFFFFFF;&lt;br /&gt;
&lt;br /&gt;
 // Set VI, HOST1X and NVENC clock sources to CLK_M&lt;br /&gt;
 *(u32 *)CLK_SOURCE_VI = 0xA0000000;&lt;br /&gt;
 *(u32 *)CLK_SOURCE_HOST1X = 0xA0000000;&lt;br /&gt;
 *(u32 *)CLK_SOURCE_NVENC = 0xE0000000;&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
     Untranslated instructions:&lt;br /&gt;
&lt;br /&gt;
     MOVS    R1, #0&lt;br /&gt;
     MOVS    R0, #0xE&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 return;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 1 ====&lt;br /&gt;
This patch is a bugfix.&lt;br /&gt;
&lt;br /&gt;
LP0 resume code expects APBDEV_PMC_SCRATCH190_0 to be set to 0x01, but the bootrom didn&#039;t set it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 u32 APBDEV_PMC_SCRATCH190_0 = 0x7000EC18;&lt;br /&gt;
 u32 pmc_scratch190_val = *(u32 *)APBDEV_PMC_SCRATCH190_0;&lt;br /&gt;
 &lt;br /&gt;
 return (pmc_scratch190_val | 0x01);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 2 ====&lt;br /&gt;
This patch adjusts USB configurations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 u32 USB1_UTMIP_SPARE_CFG0_0 = 0x7D000834;&lt;br /&gt;
 u32 USB1_UTMIP_BIAS_CFG2_0 = 0x7D000850;&lt;br /&gt;
 &lt;br /&gt;
 // Increase UTMIP_HSSQUELCH_LEVEL_NEW by 0x02&lt;br /&gt;
 *(u32 *)USB1_UTMIP_BIAS_CFG2_0 += 0x02;&lt;br /&gt;
&lt;br /&gt;
 // Clear FUSE_HS_IREF_CAP_CFG&lt;br /&gt;
 *(u32 *)USB1_UTMIP_SPARE_CFG0_0 = ((*(u32 *)USB1_UTMIP_SPARE_CFG0_0 &amp;amp; ~(0x118)) - 0x80);&lt;br /&gt;
 &lt;br /&gt;
 return;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 3 ====&lt;br /&gt;
This patch ensures that waiting on PRC_PENDING from the XUSB_DEV register T_XUSB_DEV_XHCI_PORTSC never fails.&lt;br /&gt;
&lt;br /&gt;
In the second batch of patched units ([[#FUSE_OPT_FT_REV|FUSE_OPT_FT_REV]] set to revision 7.0) this patch has been replaced with a fix for [[Switch_System_Flaws#Hardware|CVE-2018-6242]] (arbitrary copy when handling USB control requests in RCM). By setting R1 to 0 at address 0x0010769A in the bootrom, the upper 16 bits of the USB control request&#039;s wLength field are cleared out, effectively limiting the request&#039;s size to a maximum of 255 bytes.&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 4 ====&lt;br /&gt;
This patch allows backing up and restoring strapping options for warmboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 u32 APBDEV_PMC_SCRATCH0_0 = 0x7000E450;&lt;br /&gt;
 u32 APBDEV_PMC_RST_STATUS_0 = 0x7000E5B4;&lt;br /&gt;
 u32 APBDEV_PMC_SEC_DISABLE8_0 = 0x7000E9C0;&lt;br /&gt;
 u32 APBDEV_PMC_SECURE_SCRATCH111_0 = 0x7000EF14;&lt;br /&gt;
 u32 APB_MISC_PP_STRAPPING_OPT_A_0 = 0x70000008; &lt;br /&gt;
&lt;br /&gt;
 u32 reset_status = *(u32 *)APBDEV_PMC_RST_STATUS_0;&lt;br /&gt;
&lt;br /&gt;
 // Check for regular power on&lt;br /&gt;
 if (reset_status == 0)&lt;br /&gt;
 {    &lt;br /&gt;
     // Set all buttons in RCM_STRAPS and backup to PMC scratch&lt;br /&gt;
     *(u32 *)APBDEV_PMC_SECURE_SCRATCH111_0 = (*(u32 *)APB_MISC_PP_STRAPPING_OPT_A_0 | 0x1C00);&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
     // Restore strapping options from PMC scratch&lt;br /&gt;
     *(u32 *)APB_MISC_PP_STRAPPING_OPT_A_0 = *(u32 *)APBDEV_PMC_SECURE_SCRATCH111_0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Disable write access to APBDEV_PMC_SECURE_SCRATCH111_0&lt;br /&gt;
 *(u32 *)APBDEV_PMC_SEC_DISABLE8_0 |= 0x4000;&lt;br /&gt;
 &lt;br /&gt;
 return *(u32 *)APBDEV_PMC_SCRATCH0_0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 5 ====&lt;br /&gt;
This patch adjusts USB configurations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 u32 USB1_UTMIP_HSRX_CFG0_0 = 0x7D000810;&lt;br /&gt;
 u32 USB1_UTMIP_BIAS_CFG2_0 = 0x7D000850;&lt;br /&gt;
&lt;br /&gt;
 // Clear UTMIP_IDLE_WAIT, UTMIP_ELASTIC_LIMIT and UTMIP_PCOUNT_UPDN_DIV,&lt;br /&gt;
 // and set UTMIP_IDLE_WAIT to 0x11 and UTMIP_ELASTIC_LIMIT to 0x10 &lt;br /&gt;
 *(u32 *)USB1_UTMIP_HSRX_CFG0_0 = ((*(u32 *)USB1_UTMIP_HSRX_CFG0_0 &amp;amp; ~(0xF8000) + 0x88000 &amp;amp; ~(0x7C00) + 0x4000) &amp;amp; ~(0xF000000));&lt;br /&gt;
 &lt;br /&gt;
 // Clear UTMIP_HSSQUELCH_LEVEL_NEW&lt;br /&gt;
 *(u32 *)USB1_UTMIP_BIAS_CFG2_0 &amp;amp;= ~(0x07);&lt;br /&gt;
 &lt;br /&gt;
 return;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 6 ====&lt;br /&gt;
This patch is a factory backdoor.&lt;br /&gt;
&lt;br /&gt;
It allows controlling the debug authentication configuration using a fuse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 u32 FUSE_ODM_INFO = 0x7000FA9C;&lt;br /&gt;
&lt;br /&gt;
 u32 odm_info = *(u32 *)FUSE_ODM_INFO;&lt;br /&gt;
 debug_auth_override_val = ((odm_info &amp;gt;&amp;gt; 0x08) &amp;lt;&amp;lt; 0x01);&lt;br /&gt;
&lt;br /&gt;
 // Override debug authentication value stored in IRAM&lt;br /&gt;
 *(u32 *)0x400028E4 &amp;amp;= ~(debug_auth_override_val);&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
     Untranslated instructions:&lt;br /&gt;
 &lt;br /&gt;
     CMP     R0, #0&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 return;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 7 ====&lt;br /&gt;
This patch is a bugfix.&lt;br /&gt;
&lt;br /&gt;
It prevents overflowing IRAM (0x40010000) when copying the warmboot binary from DRAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 u32 APBDEV_PMC_CNTRL_0 = 0x7000E400;&lt;br /&gt;
 &lt;br /&gt;
 u32 warmboot_header_addr = 0x400049F0;&lt;br /&gt;
 u32 warmboot_bin_size = *(u32 *)warmboot_bin_header_addr;&lt;br /&gt;
 &lt;br /&gt;
 // Invalid warmboot binary size&lt;br /&gt;
 if (warmboot_size &amp;gt;&amp;gt; 0x11)&lt;br /&gt;
 {&lt;br /&gt;
     // Assert MAIN_RST&lt;br /&gt;
     // 0x40004BF0 comes from R4 and the bootrom doesn&#039;t bother to change it&lt;br /&gt;
     *(u32 *)APBDEV_PMC_CNTRL_0 = 0x40004BF0;&lt;br /&gt;
&lt;br /&gt;
     // Deadlock&lt;br /&gt;
     while(1);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /*&lt;br /&gt;
     Untranslated instructions:&lt;br /&gt;
 &lt;br /&gt;
     LDR     R0, =0x40010000&lt;br /&gt;
     LDR     R2, [warmboot_bin_header_addr]&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 8 ====&lt;br /&gt;
This patch is a bugfix.&lt;br /&gt;
&lt;br /&gt;
It sets the correct warmboot binary entrypoint address for RSA signature verification, which would be done in DRAM instead of IRAM without this patch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 u32 warmboot_addr_ptr = 0x40010238;&lt;br /&gt;
 u32 warmboot_entry_addr_ptr = 0x40004C28;&lt;br /&gt;
&lt;br /&gt;
 *(u32 *)warmboot_entry_addr_ptr = *(u32 *)warmboot_addr_ptr;&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
     Untranslated instructions:&lt;br /&gt;
 &lt;br /&gt;
     LDR     R2, [warmboot_addr_ptr]&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 return;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IROM patches 9 and 10 ====&lt;br /&gt;
These patches modify the 256-bit Secure Provisioning AES key with index 0x3A.&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 11 ====&lt;br /&gt;
This patch forces the value of [[Security_Engine|SE_TZRAM_SECURITY]] to be 0x01 instead of restoring it from the saved SE context.&lt;br /&gt;
&lt;br /&gt;
== Anti-downgrade ==&lt;br /&gt;
The first bootloader verifies [[#FUSE_RESERVED_ODM7|FUSE_RESERVED_ODM7]] to prevent downgrading.&lt;br /&gt;
How many fuses are expected to be burnt depends the device&#039;s unit type as below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! System version&lt;br /&gt;
! Expected number of burnt fuses (retail)&lt;br /&gt;
! Expected number of burnt fuses (non-retail)&lt;br /&gt;
|-&lt;br /&gt;
| 1.0.0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 2.0.0-2.3.0&lt;br /&gt;
| 2&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 3.0.0&lt;br /&gt;
| 3&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 3.0.1-3.0.2&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 4.0.0-4.1.0&lt;br /&gt;
| 5&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 5.0.0-5.1.0&lt;br /&gt;
| 6&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 6.0.0-6.1.0&lt;br /&gt;
| 7&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 6.2.0&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 7.0.0-8.0.1&lt;br /&gt;
| 9&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 8.1.0&lt;br /&gt;
| 10&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 9.0.0-9.0.1&lt;br /&gt;
| 11&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 9.1.0&lt;br /&gt;
| 12&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If too many fuses are burnt the bootloader will panic immediately.&lt;br /&gt;
&lt;br /&gt;
If too few are burnt, the bootloader will enable fuse programming and write the expected value to fuses [[#reserved_odm6|reserved_odm6]] and [[#reserved_odm7|reserved_odm7]]. Afterwards, fuse programming is disabled and the panic value 0x21 is written to PMC_SCRATCH200 register (0x7000EC40). Finally, the watchdog timer is initialized and programmed to force a reset.&lt;br /&gt;
&lt;br /&gt;
On a subsequent boot, after the anti-downgrade fuses are checked again, the PMC_RST_STATUS register (0x7000E5B4) is checked and if set to 0x01 (watchdog reset) the PMC_SCRATCH200 register (0x7000EC40) will be checked for the panic value 0x21.&lt;br /&gt;
PMC_RST_STATUS will only be set back to 0 (power on reset) if the fuse count matches the new expected value, otherwise the system will panic.&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Kernel&amp;diff=8362</id>
		<title>Kernel</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Kernel&amp;diff=8362"/>
		<updated>2019-11-18T15:02:22Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: It&amp;#039;s a kautoobjectptr oops&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= KAutoObject =&lt;br /&gt;
Size: 0x10&lt;br /&gt;
&lt;br /&gt;
[5.0.0] Size: 0x20&lt;br /&gt;
&lt;br /&gt;
[6.0.0] Size: 0x30&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || * || Vtable&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u32 || ReferenceCount&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[5.0.0]:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || * || Vtable&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u32 || ReferenceCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || KLinkedListNode || Intrusive list, links to other instances of the same class (managed by a KObjectAllocator).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[6.0.0]:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || * || Vtable&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u32 || ReferenceCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KRedBlackTreeNode]] || Intrusive red-black tree node, replaces the Intrusive list node from previous versions.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KSynchronizationObject =&lt;br /&gt;
Size: 0x28&lt;br /&gt;
&lt;br /&gt;
[5.0.0] Size: 0x38&lt;br /&gt;
&lt;br /&gt;
[6.0.0] Size: 0x48&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KLinkedList]] || ThreadSyncList&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KMutex =&lt;br /&gt;
Size: 0x8&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u64 || OwnerTag&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KRecursiveLock =&lt;br /&gt;
Size: 0x18&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KThread]] * || Owner&lt;br /&gt;
|-&lt;br /&gt;
| 8 || s32 || Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= KLockedList =&lt;br /&gt;
Size: 0x28&lt;br /&gt;
&lt;br /&gt;
[5.0.0]? Size: 0x20&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u64 || Count&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#KLinkedListNode]] || List&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#KMutex]] || Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || MaxCount&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[5.0.0]?:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KLinkedListNode]] || List&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KMutex]] || Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || MaxCount&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KLinkedListNode =&lt;br /&gt;
Size: 0x10&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KLinkedListNode]]* || Prev&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#KLinkedListNode]]* || Next&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KLinkedListEntry =&lt;br /&gt;
Size: 0x10 + &amp;lt;code&amp;gt;sizeof(T)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KLinkedListNode]] || NodeFor__List&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || T || Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KLinkedList =&lt;br /&gt;
Size: 0x18&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u64 || Count &lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#KLinkedListNode]] || Bounds (first, last)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KRedBlackTreeNode =&lt;br /&gt;
Size: 0x20&lt;br /&gt;
&lt;br /&gt;
Note: This is BSD sys/tree.h&#039;s RB_ENTRY(...).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || KRedBlackTreeNode* || Left Child &lt;br /&gt;
|-&lt;br /&gt;
| 8 || KRedBlackTreeNode* || Right Child &lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || KRedBlackTreeNode* || Parent &lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || int || Color&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KRedBlackTree =&lt;br /&gt;
Size: 0x8&lt;br /&gt;
&lt;br /&gt;
Note: This is BSD sys/tree.h&#039;s RB_HEAD(..., KRedBlackTreeNode);&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || KRedBlackTreeNode* || Root &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KThread =&lt;br /&gt;
[1.0.0] Size: 0x620&lt;br /&gt;
[5.0.0]? Size: 0x6C0&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KSynchronizationObject]], [[#KSchedulerObject0]], [[#KSchedulerObject1]], [[#KSchedulerObject2]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KSynchronizationObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || KSchedulerObject0 || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || KSchedulerObject1 || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || KSchedulerObject2 || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || KThreadContext || Context&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F0 || u64 || CoreMask&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F8 || u64 || CoreMaskOverride&lt;br /&gt;
|-&lt;br /&gt;
| 0x300 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x308 || u64 || TotalTimeRunning&lt;br /&gt;
|-&lt;br /&gt;
| 0x310 || [[#KSynchronizationObject]]* || SignalledObjectPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x318 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x320 || u64 || CondVar_CondVarUserAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x328 || u64 || Entrypoint&lt;br /&gt;
|-&lt;br /&gt;
| 0x330 || u64 || CondVar_MutexUserAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x338 || [[#KProcess]]* || ProcessPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x340 || void* || KernelThreadStack&lt;br /&gt;
|-&lt;br /&gt;
| 0x348 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x350 || void* || TlsKernelPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x358 || void* || TlsPhysicalPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x360 || [[#KSynchronizationObject]]*[0x40] || SyncObjects&lt;br /&gt;
|-&lt;br /&gt;
| 0x560 || [[#KThread]]* || CondVar_NextThreadPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x568 || [[#KThread]]* || CondVar_PrevThreadPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x570 || [[#KSynchronizationObject]]* || SignalledObjectPtr?&lt;br /&gt;
|-&lt;br /&gt;
| 0x578 || KLinkedListNode ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x588 || KLinkedListNode ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x598 || KLinkedListNode || NodeFor__ThreadList&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A8 || KLinkedListNode || NodeFor__ThreadsOnSameCore&lt;br /&gt;
|-&lt;br /&gt;
| 0x5B8 || [[#KThread]]* ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C0 || [[#KThread]]* || CondVar_SelfPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C8 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D0 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D8 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E0 || u32 || CondVar_WaitThreadHandle&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E4 || u32 || SchedulingFlags_Default&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E8 || u32 || WaitSync_RetVal&lt;br /&gt;
|-&lt;br /&gt;
| 0x5EC || u32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F0 || u32 || ActualPriority&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F4 || u32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F8 || u32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x5FC || u32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x600 || u32 || WantedPriority&lt;br /&gt;
|-&lt;br /&gt;
| 0x604 || u32 || CpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 0x608 || u8 || State&lt;br /&gt;
|-&lt;br /&gt;
| 0x609 || u8 || ShallBeTerminated&lt;br /&gt;
|-&lt;br /&gt;
| 0x60A || u8 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x60B || u8 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x60C || u8 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x60D || u8 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x60E || u8 || HasExited&lt;br /&gt;
|-&lt;br /&gt;
| 0x60F || u8 || HasCpuCoreOverride&lt;br /&gt;
|-&lt;br /&gt;
| ... || ... || ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KProcess =&lt;br /&gt;
[1.0.0] Size: 0x5B0&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0x2480&lt;br /&gt;
&lt;br /&gt;
[3.0.0] Size: 0x2580&lt;br /&gt;
&lt;br /&gt;
[5.0.0] Size: 0x4600&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KSynchronizationObject]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KSynchronizationObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || KProcessTerminationMessage || Sent to mailbox 0 when self-terminating.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || [[#KMemoryManager]] || MemoryManager&lt;br /&gt;
|-&lt;br /&gt;
| 0xF0 || u64 || TotalMemUsage&lt;br /&gt;
|-&lt;br /&gt;
| 0xF8 || [[#KLinkedList]]&amp;lt;[[#KTlsPageManager]]*&amp;gt;&amp;gt; || TlsPagesList&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || s32 || DefaultCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || [[#KDebug]]* || Debug&lt;br /&gt;
|-&lt;br /&gt;
| 0x120 || [[#KResourceLimit]]* || ResourceLimit&lt;br /&gt;
|-&lt;br /&gt;
| 0x128 || u32 || State&lt;br /&gt;
|-&lt;br /&gt;
| 0x130 || [[#KMutex]] || ProcessMutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x138 || [[#KMutex]] || ThreadingMutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x140 || [[#KLinkedListNode]]&amp;lt;[[#KThread]] *&amp;gt; || ThreadArbiterList&lt;br /&gt;
|-&lt;br /&gt;
| 0x150 || KLinkedListNode ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x160 || u64[4] || RandomEntropy&lt;br /&gt;
|-&lt;br /&gt;
| 0x180 || u8 || HasStateChanged&lt;br /&gt;
|-&lt;br /&gt;
| 0x181 || u8 || HasInitialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x182 || u8 || IsSystem&lt;br /&gt;
|-&lt;br /&gt;
| 0x183 || u8[12+1] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x190 || u16 || NumberOfCreatedThreads&lt;br /&gt;
|-&lt;br /&gt;
| 0x192 || u16 || ThreadingRelatedInitiallyZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x194 || u32 || ProcessFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x198 || [[#KProcessCapabilities]] || Capabilities&lt;br /&gt;
|-&lt;br /&gt;
| 0x248 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x250 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x258 || u64 || CreatedTickstamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x260 || u64 || Entrypoint&lt;br /&gt;
|-&lt;br /&gt;
| 0x268 || u64 || CodeMemUsage&lt;br /&gt;
|-&lt;br /&gt;
| 0x270 || u64 || DynamicMemUsage&lt;br /&gt;
|-&lt;br /&gt;
| 0x278 || u64 || MaxTotalMemUsage&lt;br /&gt;
|-&lt;br /&gt;
| 0x280 || u32 || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x288 || [[#KProcessHandleTable]] || HandleTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x528 || void* || UsermodeExceptionTlsArea&lt;br /&gt;
|-&lt;br /&gt;
| 0x530 || [[#KLinkedListNode]]&amp;lt;[[#KThread]] *&amp;gt; || ExceptionThreadList&lt;br /&gt;
|-&lt;br /&gt;
| 0x540 || [[#KThread]]* || ExceptionThread&lt;br /&gt;
|-&lt;br /&gt;
| 0x548 || [[#KLinkedListNode]]&amp;lt;[[#KThread]] *&amp;gt; || ThreadList&lt;br /&gt;
|-&lt;br /&gt;
| 0x558 || bool || HasStarted&lt;br /&gt;
|-&lt;br /&gt;
| 0x55C || u32 || UnusedZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x560 || u64[2] || UnusedZeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x570 || u64 || TotalTimeRunning&lt;br /&gt;
|-&lt;br /&gt;
| 0x578 || u64[5] || UnusedZeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A0 || u64 || UnusedZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A8 || u64 || UnusedZero&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KSynchronizationObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || KProcessTerminationMessage || Sent to mailbox 0 when self-terminating.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || [[#KMemoryManager]] || MemoryManager&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || u64 || TotalMemUsage&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || [[#KLinkedList]]&amp;lt;[[#KTlsPageManager]]*&amp;gt; || TlsPagesList&lt;br /&gt;
|-&lt;br /&gt;
| 0x120 || s32 || DefaultCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 0x128 || [[#KDebug]]* || Debug&lt;br /&gt;
|-&lt;br /&gt;
| 0x130 || [[#KResourceLimit]]* || ResourceLimit&lt;br /&gt;
|-&lt;br /&gt;
| 0x138 || u32 || State&lt;br /&gt;
|-&lt;br /&gt;
| 0x140 || [[#KMutex]] || ProcessMutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || [[#KMutex]] || ThreadingMutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x150 || [[#KLinkedListNode]]&amp;lt;[[#KThread]] *&amp;gt; || ThreadArbiterList&lt;br /&gt;
|-&lt;br /&gt;
| 0x160 || KLinkedListNode ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x170 || u64[4] || RandomEntropy&lt;br /&gt;
|-&lt;br /&gt;
| 0x190 || u8 || HasStateChanged&lt;br /&gt;
|-&lt;br /&gt;
| 0x191 || u8 || HasInitialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x192 || u8 || IsSystem&lt;br /&gt;
|-&lt;br /&gt;
| 0x193 || u8[12+1] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A0 || u16 || NumberOfCreatedThreads&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A2 || u16 || ThreadingRelatedInitiallyZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A4 || u32 || ProcessFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A8 || [[#KProcessCapabilities]] || Capabilities&lt;br /&gt;
|-&lt;br /&gt;
| 0x258 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x260 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x268 || u64 || CreatedTickstamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x270 || u64 || Entrypoint&lt;br /&gt;
|-&lt;br /&gt;
| 0x278 || u64 || CodeMemUsage&lt;br /&gt;
|-&lt;br /&gt;
| 0x280 || u64 || DynamicMemUsage&lt;br /&gt;
|-&lt;br /&gt;
| 0x288 || u64 || MaxTotalMemUsage&lt;br /&gt;
|-&lt;br /&gt;
| 0x290 || u32 || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x298 || u64[5] || Unused [?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C0 || [[#KProcessHandleTable]] || HandleTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x2380 || void* || UsermodeExceptionTlsArea&lt;br /&gt;
|-&lt;br /&gt;
| 0x2388 || [[#KLinkedListNode]]&amp;lt;[[#KThread]] *&amp;gt; || ExceptionThreadList&lt;br /&gt;
|-&lt;br /&gt;
| 0x2398 || [[#KThread]]* || ExceptionThread&lt;br /&gt;
|-&lt;br /&gt;
| 0x23A0 || [[#KLinkedListNode]]&amp;lt;[[#KThread]] *&amp;gt; || ThreadList&lt;br /&gt;
|-&lt;br /&gt;
| 0x23B0 || [[#KLinkedListNode]]&amp;lt;[[#KSharedMemoryRef]] *&amp;gt; || MappedSharedMemoriesList&lt;br /&gt;
|-&lt;br /&gt;
| 0x23C0 || bool || HasStarted&lt;br /&gt;
|-&lt;br /&gt;
| 0x23C1 || bool || HasException&lt;br /&gt;
|-&lt;br /&gt;
| 0x23C4 || u32 || ExceptionEnum0&lt;br /&gt;
|-&lt;br /&gt;
| 0x23C8 || u64 || ExceptionEnum1&lt;br /&gt;
|-&lt;br /&gt;
| 0x23D0 || u64 || ExceptionThreadUnkInfo0&lt;br /&gt;
|-&lt;br /&gt;
| 0x23D8 || u64 || BreakArg0&lt;br /&gt;
|-&lt;br /&gt;
| 0x23E0 || u64 || BreakArg1&lt;br /&gt;
|-&lt;br /&gt;
| 0x23E8 || u64 || BreakArg2&lt;br /&gt;
|-&lt;br /&gt;
| 0x23F0 || u64 || ExceptionThreadUnkInfo1&lt;br /&gt;
|-&lt;br /&gt;
| 0x23F8 || u32 || UnusedZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2400 || u64[8] || UnusedZeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2440 || u64 || UnusedZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2448 || u64 || UnusedZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2450 || u64[6] || Unused [?]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== KTlsPageManager ==&lt;br /&gt;
Size: 0x20&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || void* || TlsPagePtr&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#KProcess*]] || ProcessPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || UsageCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || u8[8] || IsSlotFree&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KProcessCapabilities ==&lt;br /&gt;
Size: 0xB0&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u8[16] || SvcAccessMask&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u8[128] || IrqAccessMask&lt;br /&gt;
|-&lt;br /&gt;
| 0x90 || u64 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| 0x98 || u64 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0 || u32 || DebuggingFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4 || u32 || HandleTableSize&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8 || u32 || KernelReleaseVersion&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC || u32 || ApplicationType&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KProcessHandleTable ==&lt;br /&gt;
[1.0.0] Size: 0x2A0&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0x20C0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KHandleEntry]]* || TablePtr&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#KHandleEntry]]* || NextFreeEntry&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KHandleEntry]][40] || InternalTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x290 || u16 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x292 || u16 || MaxUsageAtOnce&lt;br /&gt;
|-&lt;br /&gt;
| 0x294 || u16 || IdCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x296 || u16 || NumActiveSlots&lt;br /&gt;
|-&lt;br /&gt;
| 0x298 || [[#KSpinLock]] || Lock&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KHandleEntry]]* || TablePtr&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#KHandleEntry]]* || NextFreeEntry&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KHandleEntry]][1024] || InternalTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x2010 || u16 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x2012 || u16 || MaxUsageAtOnce&lt;br /&gt;
|-&lt;br /&gt;
| 0x2014 || u16 || IdCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x2016 || u16 || NumActiveSlots&lt;br /&gt;
|-&lt;br /&gt;
| 0x2040 || [[#KSpinLock]] || Lock&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KHandleEntry ===&lt;br /&gt;
[1.0.0] Size: 0x10&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 8&lt;br /&gt;
&lt;br /&gt;
[5.0.0] Size: 0x10&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u16 || HandleId&lt;br /&gt;
|-&lt;br /&gt;
| 2 || u8 || ObjectType&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#KAutoObject]]* || Object&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u16 || HandleId&lt;br /&gt;
|-&lt;br /&gt;
| 2 || u8 || ObjectType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || ObjectCompressedPtr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 5.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u16 || HandleId&lt;br /&gt;
|-&lt;br /&gt;
| 2 || u16 || ObjectType&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#KAutoObject]]* || object&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KSpinLock ===&lt;br /&gt;
[1.0.0] Size: 0x1&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0x40&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u8 || IsBusy&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u16 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u16 ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== KSharedMemoryRef ==&lt;br /&gt;
[2.0.0] Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KLinkedListNode]]&amp;lt;[[#KSharedMemoryRef]] *&amp;gt; || NodeFor__MappedSharedMemoriesList&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KSharedMemory*]] || SharedMem&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || InitiallyZero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KMemoryManager =&lt;br /&gt;
[1.0.0] Size: 0xB8&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0xC8&lt;br /&gt;
&lt;br /&gt;
[5.0.0] Size: 0xF8?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || * || Vtable&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || AddrSpaceMinAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || AddrSpaceMaxAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || HeapRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || HeapCurAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || MapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || u64 || MapRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || u64 || HeapMaxAllocation&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || [[#KMutex]] || Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#KPageTable]] || PageTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || [[#KMemoryBlockManager]] || MemoryBlockManager&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || bool || IsKernel&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || bool || IsSystem&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || bool || IsAddrSpace36Bit&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || bool || HasAslr&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || u32 || Is_0x59_If_Cfg12_Bit0_ElseZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x80 || u32 || Is_0x5A_If_Cfg12_Bit0_ElseZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x84 || u32 || Is_0x58_If_Cfg12_Bit0_ElseZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x88 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x90 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x98 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0 || u64 || TranslationTableBaseRegister0&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8 || u64 || TranslationControlRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0xB0 || u8 || AsidTagValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || * || Vtable&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || AddrSpaceMinAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || AddrSpaceMaxAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || HeapRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || HeapCurAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || MapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || u64 || MapRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || u64 || NewMapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || u64 || NewMapRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || u64 || TlsIoRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || u64 || TlsIoRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || u64 || HeapMaxAllocation&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || [[#KMutex]] || Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || [[#KPageTable]] || PageTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x80 || [[#KMemoryBlockManager]] || MemoryBlockManager&lt;br /&gt;
|-&lt;br /&gt;
| 0x98 || u32 || AddressSpaceWidth (32/36/39)&lt;br /&gt;
|-&lt;br /&gt;
| 0x9C || bool || IsKernel&lt;br /&gt;
|-&lt;br /&gt;
| 0x9D || bool || IsSystem&lt;br /&gt;
|-&lt;br /&gt;
| 0x9E || bool || HasAslr&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0 || u32 || PoolPartition&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4 || u32 || Is_0x5A_If_Cfg12_Bit0_ElseZero&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8 || u32 || Is_0x59_If_Cfg12_Bit0_ElseZero&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC || u32 || Is_0x58_If_Cfg12_Bit0_ElseZero&lt;br /&gt;
|-&lt;br /&gt;
| 0xB0 || u64 || TranslationTableBaseRegister0&lt;br /&gt;
|-&lt;br /&gt;
| 0xB8 || u64 || TranslationControlRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0 || u32 || AsidTagValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 5.0.0 Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || * || Vtable&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || AddrSpaceMinAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || AddrSpaceMaxAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || HeapRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || HeapCurAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || MapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || u64 || MapRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || u64 || NewMapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || u64 || NewMapRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || u64 || TlsIoRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || u64 || TlsIoRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || u64 || HeapMaxAllocation&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 0x70 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#KMutex]] || Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x80 || [[#KPageTable]] || PageTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x90 || [[#KMemoryBlockManager]] || MemoryBlockManager&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8 || u32 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC || u32 || AddressSpaceWidth (32/36/39)&lt;br /&gt;
|-&lt;br /&gt;
| 0xB0 || [[#KLinkedList]]? || &lt;br /&gt;
|-&lt;br /&gt;
| 0xC8 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 0xD0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 0xD8 || ptr || &lt;br /&gt;
|-&lt;br /&gt;
| 0xE0 || u64 || TranslationTableBaseRegister0 val&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8 || u64 || TranslationControlRegister val&lt;br /&gt;
|-&lt;br /&gt;
| 0xF0 || u32 || AsidTagValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== KPageTable ==&lt;br /&gt;
Size: 0x10&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || void* || RawPageTablePtr&lt;br /&gt;
|-&lt;br /&gt;
| 8 || bool ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC || u32 || AddrSpaceSizeInGb&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KMemoryBlockManager ==&lt;br /&gt;
Size: 0x18&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KMemoryBlock]]* || MemoryBlockList&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || MaxAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || MinAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KMemoryBlock ==&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KLinkedListNode]]&amp;lt;[[#KMemoryBlock]] *&amp;gt; || NodeFor__MemoryBlockList&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || NumOfPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u32 || State&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || u16 || IpcRefCount [?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || u16 || DeviceMapRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || u8 || Permission&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || u8 || UnkAttribute&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || u8 || Attribute&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KMemoryBlockInfo ==&lt;br /&gt;
Size: 0x20&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u64 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || State&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || u8 || Permission&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || u8 || Attribute&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || u8 || UnkAttribute&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u16 || IpcRefCount [?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || u16 || DeviceMapRefCount&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KTransferMemory =&lt;br /&gt;
Size: 0x48&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || KMemoryBlockList || Blocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || [[#KProcess]]* || OwnerProcess&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || KMutex || Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || int || Permission&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || bool || HasInited&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || bool || IsMapped&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KSharedMemory =&lt;br /&gt;
[1.0.0] Size: 0x40&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0x48&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || KMemoryBlockList || Blocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || [[#KProcess]]* || OwnerProcess&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || int || LocalPermission&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || int || RemotePermission&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || bool || HasInited&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || KMemoryBlockList || Blocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || [[#KResourceLimit]]* || OwnerResourceLimit&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || OwnerProcessPid&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || int || LocalPermission&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || int || RemotePermission&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || bool || HasInited&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KJitMemory =&lt;br /&gt;
[4.0.0+] Size: 0x58&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || KMemoryBlockList || Blocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || [[#KProcess]]* || SrcProcessPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || [[#KMutex]] || Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || u8 || HasInit&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || u8 || HasMappedSlave&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || u8 || HasMappedMaster&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KPort =&lt;br /&gt;
[1.0.0] Size: 0xA8&lt;br /&gt;
&lt;br /&gt;
[7.0.0] Size: 0x110&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KServerPort]] || ServerSide&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || [[#KClientPort]] || ClientSide&lt;br /&gt;
|-&lt;br /&gt;
| 0x98 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0 || bool || HasInited&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1 || bool || IsLight&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 7.0.0 Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || [[#KServerPort]] || ServerSide&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0 || [[#KClientPort]] || ClientSide&lt;br /&gt;
|-&lt;br /&gt;
| 0xF8 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || char* || NamePtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || bool || HasInited&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || bool || IsLight&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== KServerPort ==&lt;br /&gt;
Size: 0x50&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KSynchronizationObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KSynchronizationObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || [[#KLinkedListNode]] || IncomingConnections&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || [[#KLinkedListNode]] || IncomingLightConnections&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || [[#KPort]]* || Parent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KClientPort ==&lt;br /&gt;
Size: 0x38&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KSynchronizationObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KSynchronizationObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u32 || NumSessions&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MaxSessions&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || [[#KPort]]* || Parent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KSession =&lt;br /&gt;
Size: 0xB0&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KServerSession]] || ServerSide&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || [[#KClientSession]] || ClientSide&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8 || bool || HasInited&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KServerSession ==&lt;br /&gt;
Size: 0x60&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KSynchronizationObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KSynchronizationObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || KLinkedListNode ||  NodeFor__IncomingConnections&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || [[#KSession*]] || Parent&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || KLinkedListNode&amp;lt;[[#KSessionRequest]]*&amp;gt; || RequestList&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#KSessionRequest]]* || ActiveRequest&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#KMutex]] || lock&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== KSessionRequest ===&lt;br /&gt;
Size: 0x158&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || KLinkedListNode ||  NodeFor__RequestList&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || [[#KBufferDescriptor]][8] || BufferTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x120 || [[#KBufferDescriptor]]* || ExternalBufferTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x128 || u8 || NumSendBuffers&lt;br /&gt;
|-&lt;br /&gt;
| 0x129 || u8 || NumRecvBuffers&lt;br /&gt;
|-&lt;br /&gt;
| 0x12A || u8 || NumExchBuffers&lt;br /&gt;
|-&lt;br /&gt;
| 0x130 || [[#KThread]]* || SenderThread&lt;br /&gt;
|-&lt;br /&gt;
| 0x138 || u64 || InitiallyZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x140 || [[#KWritableEvent]]* || ForAsyncEvent&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || u64 || CustomCmdbufAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x150 || u64 || CustomCmdbufSize&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== KBufferDescriptor ===&lt;br /&gt;
Size: 0x20&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u64 || UserVirtAddr&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || BufferMemoryState&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KClientSession ==&lt;br /&gt;
Size: 0x38&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KSession]]* || Parent&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || bool || HasInited&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || [[#KClientPort]]* || ParentPort&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || [[#KProcess]]* || CreatorProcess&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KLightSession =&lt;br /&gt;
Size: 0xA8&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KLightSessionServer]] || ServerSide&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || [[#KLightSessionClient]] || ClientSide&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0 || bool || HasInited&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KLightServerSession ==&lt;br /&gt;
Size: 0x58&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || KLinkedListNode || NodeFor__IncomingLightConnections&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || [[#KLightSession]] || Parent&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64[6] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KLightClientSession ==&lt;br /&gt;
Size: 0x38&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KLightSession]]* || Parent&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || bool || HasInited&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || [[#KClientPort]]* || Port&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || [[#KProcess]]* || CreatorProcess&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KEvent =&lt;br /&gt;
Size: 0x70&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KReadableEvent]] || ReadableEvent&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || [[#KWritableEvent]] || WritableEvent&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || [[#KProcess]]* || Creator&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || bool || HasInited&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KReadableEvent ==&lt;br /&gt;
Size: 0x38&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KSynchronizationEvent]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KSynchronizationObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || bool ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || [[#KEvent]]* || Parent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KWritableEvent ==&lt;br /&gt;
Size: 0x18&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KEvent]]* || Parent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KInterruptEvent ==&lt;br /&gt;
[1.0.0] Size: 0x50&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0x48&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KReadableEvent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KReadableEvent]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || [[#KInterruptReceiver]] || Receiver&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || u32 || IrqId (or -1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KReadableEvent]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || [[#KInterruptReceiver]]* || Receiver&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || u32 || IrqId (or -1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || bool || IsIrqRegistered&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KInterruptReceiver ===&lt;br /&gt;
[1.0.0] Size: 0x10&lt;br /&gt;
[2.0.0] Size: 0x20&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || * || Vtable&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || * || Vtable&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || InitiallyZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KInterruptEvent]]* || IrqEventPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || s32 || IrqId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KDeviceAddressSpace =&lt;br /&gt;
Size: 0x70&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KMutex]] || Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#KSmmuManager]] || Manager&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || u64 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || bool || HasInited&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[1.0.0] It was called KAddressSpace.&lt;br /&gt;
&lt;br /&gt;
== KSmmuManager ==&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u8[4] || PageTableAsids&lt;br /&gt;
|-&lt;br /&gt;
| 8 || void*[4] || PageDirectories&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || AttachedDevicesMask&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u32 || RegVal32Bit&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || u32 || RegVal32BitEmpty&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || u32 || RegVal36Bit&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || u32 || RegVal36BitEmpty&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KResourceLimit =&lt;br /&gt;
Size: 0x68&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64[5] || CurrentValue&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || u64[5] || LimitValue&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || [[#KMutex]] || Mutex&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KPoolManager =&lt;br /&gt;
[1.0.0] Size: 0x380&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0x450&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KPoolAllocator]][3] || Allocator&lt;br /&gt;
|-&lt;br /&gt;
| 0x348 || [[#KPoolRefManager]] || RefManager&lt;br /&gt;
|-&lt;br /&gt;
| 0x368 || u64 || AllocationCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x370 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x378 || [[#KMutex]] || Mutex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KPoolAllocator]] || Allocator0&lt;br /&gt;
|-&lt;br /&gt;
| 0x220 || [[#KPartitionInfo]]* || PartitionInfo0&lt;br /&gt;
|-&lt;br /&gt;
| 0x228 || [[#KPoolAllocator]] || Allocator1&lt;br /&gt;
|-&lt;br /&gt;
| 0x448 || [[#KPartitionInfo]]* || PartitionInfo1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== KPoolAllocator ==&lt;br /&gt;
[1.0.0] Size: 0x118&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0x220&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || void* || MemoryBase&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || MemorySize&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || s32 || NumPools&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#KPool]][8] || Pools&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || void* || MemoryBase&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || MemorySize&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KPool]][8] || Pools&lt;br /&gt;
|-&lt;br /&gt;
| 0x210 || s32 || NumPools&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KPool ===&lt;br /&gt;
[1.0.0] Size: 0x20&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0x40&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || KPoolHeader* || FirstFreeChunk&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || void* || SingletonTableEntryPtr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || KPoolHeader* || FirstFreeChunk&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || void* || SingletonTableEntryPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || [[#KPool]]* || Parent&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64[2] || DmaProtectionKey&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== KPoolRefManager ==&lt;br /&gt;
[1.0.0] Size: 0x20&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KPoolManager]]* || Parent&lt;br /&gt;
|-&lt;br /&gt;
| 8 || void* || PoolBase&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || MaxPage&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u16* || RefCountTable&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KObjectAllocator =&lt;br /&gt;
Size: 0x50&lt;br /&gt;
[5.0.0]? Size: 0x48&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KLockedList]] || LockedList &lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || [[#KSlabHeap]] || SlabHeap &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= KSlabHeap =&lt;br /&gt;
Size: 0x28&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || void* || FreeListHead &lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || u64 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || void* || HeapPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TotalHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || SingleObjectSize&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
5.0.0 (?):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || void* || FreeListHead &lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || u64 || SingleObjectSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || void* || HeapPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || void* || Start (equal to HeapPtr on init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || void* || End&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KPageTableAllocator =&lt;br /&gt;
Size: 0x30&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u16* || RefCountTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || void* || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KIrqManager =&lt;br /&gt;
[1.0.0] Size: 0x1608&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KIrqEntry]][32] || Core0Irq&lt;br /&gt;
|-&lt;br /&gt;
| 0x200 || [[#KIrqEntry]][32] || Core1Irq&lt;br /&gt;
|-&lt;br /&gt;
| 0x400 || [[#KIrqEntry]][32] || Core2Irq&lt;br /&gt;
|-&lt;br /&gt;
| 0x600 || [[#KIrqEntry]][32] || Core3Irq&lt;br /&gt;
|-&lt;br /&gt;
| 0x800 || [[#KIrqEntry]][224] || SharedIrqs&lt;br /&gt;
|-&lt;br /&gt;
| 0x1600 || [[#KMutex]] || Mutex&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KIrqEntry ==&lt;br /&gt;
[1.0.0] Size: 0x10&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KInterruptReceiver]]* || Receiver&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u8 || State0&lt;br /&gt;
|-&lt;br /&gt;
| 9 || u8 || State1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KDebug =&lt;br /&gt;
Size: 0x50&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KSynchronizationObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || [[#KLinkedListNode]]&amp;lt;[[#KDebugEvent]]&amp;gt; || EventList&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || u32 || Flags&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || [[#KProcess]]* || ProcessPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || [[#KMutex]] || Mutex&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KDebugEvent ==&lt;br /&gt;
Size: 0x60&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KLinkedListNode]]&amp;lt;[[#KDebugEvent]] *&amp;gt; || NodeFor__EventList&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || u32 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u32 || Flags&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || u16 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || bool ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || ... || ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KManagedPort =&lt;br /&gt;
Size: 0x28&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KLinkedListNode]]&amp;lt;[[#KManagedPort]] *&amp;gt; || NodeFor__ManagedPortList&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || char[12] || PortName&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || [[#KClientPort]]* || ClientPort&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Slab Information =&lt;br /&gt;
&lt;br /&gt;
The Horizon/NX kernel keeps all objects in slab allocators, that can allocate a fixed amount of each. Attempting to allocate an object when the slab heap is full will result in an error 0xCE01 (Resource Exhaustion).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Object || Slab Count&lt;br /&gt;
|-&lt;br /&gt;
| KEvent || 600&lt;br /&gt;
|-&lt;br /&gt;
| KInterruptEvent || 100&lt;br /&gt;
|-&lt;br /&gt;
| KProcess || 80&lt;br /&gt;
|-&lt;br /&gt;
| KThread || 700&lt;br /&gt;
|-&lt;br /&gt;
| KPort || 200&lt;br /&gt;
|-&lt;br /&gt;
| KSharedMemory || 80&lt;br /&gt;
|-&lt;br /&gt;
| KTransferMemory || 200&lt;br /&gt;
|-&lt;br /&gt;
| KDeviceAddressSpace || 300&lt;br /&gt;
|-&lt;br /&gt;
| KDebug || 4&lt;br /&gt;
|-&lt;br /&gt;
| KSession || 800&lt;br /&gt;
|-&lt;br /&gt;
| KLightSession || 100&lt;br /&gt;
|-&lt;br /&gt;
| KLinkedListEntry&amp;lt;void*&amp;gt; || 17 231&lt;br /&gt;
|-&lt;br /&gt;
| KLinkedListNode || 4 000&lt;br /&gt;
|-&lt;br /&gt;
| KMemoryBlock (System) || 20 000&lt;br /&gt;
|-&lt;br /&gt;
| KMemoryBlock (Other) || 10 000&lt;br /&gt;
|-&lt;br /&gt;
| KTlsPageManager || 167&lt;br /&gt;
|-&lt;br /&gt;
| KManagedPort || 7&lt;br /&gt;
|-&lt;br /&gt;
| KDebugEvent || 704&lt;br /&gt;
|-&lt;br /&gt;
| KSessionRequest || 1 600&lt;br /&gt;
|-&lt;br /&gt;
| KResourceLimit || 5&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Kernel&amp;diff=8361</id>
		<title>Kernel</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Kernel&amp;diff=8361"/>
		<updated>2019-11-18T15:01:34Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: KHandleEntry changed to 0x10 bytes in 5.0.0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= KAutoObject =&lt;br /&gt;
Size: 0x10&lt;br /&gt;
&lt;br /&gt;
[5.0.0] Size: 0x20&lt;br /&gt;
&lt;br /&gt;
[6.0.0] Size: 0x30&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || * || Vtable&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u32 || ReferenceCount&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[5.0.0]:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || * || Vtable&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u32 || ReferenceCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || KLinkedListNode || Intrusive list, links to other instances of the same class (managed by a KObjectAllocator).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[6.0.0]:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || * || Vtable&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u32 || ReferenceCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KRedBlackTreeNode]] || Intrusive red-black tree node, replaces the Intrusive list node from previous versions.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KSynchronizationObject =&lt;br /&gt;
Size: 0x28&lt;br /&gt;
&lt;br /&gt;
[5.0.0] Size: 0x38&lt;br /&gt;
&lt;br /&gt;
[6.0.0] Size: 0x48&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KLinkedList]] || ThreadSyncList&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KMutex =&lt;br /&gt;
Size: 0x8&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u64 || OwnerTag&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KRecursiveLock =&lt;br /&gt;
Size: 0x18&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KThread]] * || Owner&lt;br /&gt;
|-&lt;br /&gt;
| 8 || s32 || Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= KLockedList =&lt;br /&gt;
Size: 0x28&lt;br /&gt;
&lt;br /&gt;
[5.0.0]? Size: 0x20&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u64 || Count&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#KLinkedListNode]] || List&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#KMutex]] || Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || MaxCount&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[5.0.0]?:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KLinkedListNode]] || List&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KMutex]] || Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || MaxCount&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KLinkedListNode =&lt;br /&gt;
Size: 0x10&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KLinkedListNode]]* || Prev&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#KLinkedListNode]]* || Next&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KLinkedListEntry =&lt;br /&gt;
Size: 0x10 + &amp;lt;code&amp;gt;sizeof(T)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KLinkedListNode]] || NodeFor__List&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || T || Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KLinkedList =&lt;br /&gt;
Size: 0x18&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u64 || Count &lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#KLinkedListNode]] || Bounds (first, last)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KRedBlackTreeNode =&lt;br /&gt;
Size: 0x20&lt;br /&gt;
&lt;br /&gt;
Note: This is BSD sys/tree.h&#039;s RB_ENTRY(...).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || KRedBlackTreeNode* || Left Child &lt;br /&gt;
|-&lt;br /&gt;
| 8 || KRedBlackTreeNode* || Right Child &lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || KRedBlackTreeNode* || Parent &lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || int || Color&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KRedBlackTree =&lt;br /&gt;
Size: 0x8&lt;br /&gt;
&lt;br /&gt;
Note: This is BSD sys/tree.h&#039;s RB_HEAD(..., KRedBlackTreeNode);&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || KRedBlackTreeNode* || Root &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KThread =&lt;br /&gt;
[1.0.0] Size: 0x620&lt;br /&gt;
[5.0.0]? Size: 0x6C0&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KSynchronizationObject]], [[#KSchedulerObject0]], [[#KSchedulerObject1]], [[#KSchedulerObject2]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KSynchronizationObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || KSchedulerObject0 || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || KSchedulerObject1 || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || KSchedulerObject2 || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || KThreadContext || Context&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F0 || u64 || CoreMask&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F8 || u64 || CoreMaskOverride&lt;br /&gt;
|-&lt;br /&gt;
| 0x300 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x308 || u64 || TotalTimeRunning&lt;br /&gt;
|-&lt;br /&gt;
| 0x310 || [[#KSynchronizationObject]]* || SignalledObjectPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x318 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x320 || u64 || CondVar_CondVarUserAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x328 || u64 || Entrypoint&lt;br /&gt;
|-&lt;br /&gt;
| 0x330 || u64 || CondVar_MutexUserAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x338 || [[#KProcess]]* || ProcessPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x340 || void* || KernelThreadStack&lt;br /&gt;
|-&lt;br /&gt;
| 0x348 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x350 || void* || TlsKernelPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x358 || void* || TlsPhysicalPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x360 || [[#KSynchronizationObject]]*[0x40] || SyncObjects&lt;br /&gt;
|-&lt;br /&gt;
| 0x560 || [[#KThread]]* || CondVar_NextThreadPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x568 || [[#KThread]]* || CondVar_PrevThreadPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x570 || [[#KSynchronizationObject]]* || SignalledObjectPtr?&lt;br /&gt;
|-&lt;br /&gt;
| 0x578 || KLinkedListNode ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x588 || KLinkedListNode ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x598 || KLinkedListNode || NodeFor__ThreadList&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A8 || KLinkedListNode || NodeFor__ThreadsOnSameCore&lt;br /&gt;
|-&lt;br /&gt;
| 0x5B8 || [[#KThread]]* ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C0 || [[#KThread]]* || CondVar_SelfPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C8 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D0 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D8 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E0 || u32 || CondVar_WaitThreadHandle&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E4 || u32 || SchedulingFlags_Default&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E8 || u32 || WaitSync_RetVal&lt;br /&gt;
|-&lt;br /&gt;
| 0x5EC || u32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F0 || u32 || ActualPriority&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F4 || u32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F8 || u32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x5FC || u32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x600 || u32 || WantedPriority&lt;br /&gt;
|-&lt;br /&gt;
| 0x604 || u32 || CpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 0x608 || u8 || State&lt;br /&gt;
|-&lt;br /&gt;
| 0x609 || u8 || ShallBeTerminated&lt;br /&gt;
|-&lt;br /&gt;
| 0x60A || u8 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x60B || u8 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x60C || u8 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x60D || u8 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x60E || u8 || HasExited&lt;br /&gt;
|-&lt;br /&gt;
| 0x60F || u8 || HasCpuCoreOverride&lt;br /&gt;
|-&lt;br /&gt;
| ... || ... || ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KProcess =&lt;br /&gt;
[1.0.0] Size: 0x5B0&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0x2480&lt;br /&gt;
&lt;br /&gt;
[3.0.0] Size: 0x2580&lt;br /&gt;
&lt;br /&gt;
[5.0.0] Size: 0x4600&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KSynchronizationObject]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KSynchronizationObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || KProcessTerminationMessage || Sent to mailbox 0 when self-terminating.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || [[#KMemoryManager]] || MemoryManager&lt;br /&gt;
|-&lt;br /&gt;
| 0xF0 || u64 || TotalMemUsage&lt;br /&gt;
|-&lt;br /&gt;
| 0xF8 || [[#KLinkedList]]&amp;lt;[[#KTlsPageManager]]*&amp;gt;&amp;gt; || TlsPagesList&lt;br /&gt;
|-&lt;br /&gt;
| 0x110 || s32 || DefaultCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 0x118 || [[#KDebug]]* || Debug&lt;br /&gt;
|-&lt;br /&gt;
| 0x120 || [[#KResourceLimit]]* || ResourceLimit&lt;br /&gt;
|-&lt;br /&gt;
| 0x128 || u32 || State&lt;br /&gt;
|-&lt;br /&gt;
| 0x130 || [[#KMutex]] || ProcessMutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x138 || [[#KMutex]] || ThreadingMutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x140 || [[#KLinkedListNode]]&amp;lt;[[#KThread]] *&amp;gt; || ThreadArbiterList&lt;br /&gt;
|-&lt;br /&gt;
| 0x150 || KLinkedListNode ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x160 || u64[4] || RandomEntropy&lt;br /&gt;
|-&lt;br /&gt;
| 0x180 || u8 || HasStateChanged&lt;br /&gt;
|-&lt;br /&gt;
| 0x181 || u8 || HasInitialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x182 || u8 || IsSystem&lt;br /&gt;
|-&lt;br /&gt;
| 0x183 || u8[12+1] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x190 || u16 || NumberOfCreatedThreads&lt;br /&gt;
|-&lt;br /&gt;
| 0x192 || u16 || ThreadingRelatedInitiallyZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x194 || u32 || ProcessFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x198 || [[#KProcessCapabilities]] || Capabilities&lt;br /&gt;
|-&lt;br /&gt;
| 0x248 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x250 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x258 || u64 || CreatedTickstamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x260 || u64 || Entrypoint&lt;br /&gt;
|-&lt;br /&gt;
| 0x268 || u64 || CodeMemUsage&lt;br /&gt;
|-&lt;br /&gt;
| 0x270 || u64 || DynamicMemUsage&lt;br /&gt;
|-&lt;br /&gt;
| 0x278 || u64 || MaxTotalMemUsage&lt;br /&gt;
|-&lt;br /&gt;
| 0x280 || u32 || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x288 || [[#KProcessHandleTable]] || HandleTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x528 || void* || UsermodeExceptionTlsArea&lt;br /&gt;
|-&lt;br /&gt;
| 0x530 || [[#KLinkedListNode]]&amp;lt;[[#KThread]] *&amp;gt; || ExceptionThreadList&lt;br /&gt;
|-&lt;br /&gt;
| 0x540 || [[#KThread]]* || ExceptionThread&lt;br /&gt;
|-&lt;br /&gt;
| 0x548 || [[#KLinkedListNode]]&amp;lt;[[#KThread]] *&amp;gt; || ThreadList&lt;br /&gt;
|-&lt;br /&gt;
| 0x558 || bool || HasStarted&lt;br /&gt;
|-&lt;br /&gt;
| 0x55C || u32 || UnusedZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x560 || u64[2] || UnusedZeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x570 || u64 || TotalTimeRunning&lt;br /&gt;
|-&lt;br /&gt;
| 0x578 || u64[5] || UnusedZeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A0 || u64 || UnusedZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A8 || u64 || UnusedZero&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KSynchronizationObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || KProcessTerminationMessage || Sent to mailbox 0 when self-terminating.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || [[#KMemoryManager]] || MemoryManager&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || u64 || TotalMemUsage&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || [[#KLinkedList]]&amp;lt;[[#KTlsPageManager]]*&amp;gt; || TlsPagesList&lt;br /&gt;
|-&lt;br /&gt;
| 0x120 || s32 || DefaultCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 0x128 || [[#KDebug]]* || Debug&lt;br /&gt;
|-&lt;br /&gt;
| 0x130 || [[#KResourceLimit]]* || ResourceLimit&lt;br /&gt;
|-&lt;br /&gt;
| 0x138 || u32 || State&lt;br /&gt;
|-&lt;br /&gt;
| 0x140 || [[#KMutex]] || ProcessMutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || [[#KMutex]] || ThreadingMutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x150 || [[#KLinkedListNode]]&amp;lt;[[#KThread]] *&amp;gt; || ThreadArbiterList&lt;br /&gt;
|-&lt;br /&gt;
| 0x160 || KLinkedListNode ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x170 || u64[4] || RandomEntropy&lt;br /&gt;
|-&lt;br /&gt;
| 0x190 || u8 || HasStateChanged&lt;br /&gt;
|-&lt;br /&gt;
| 0x191 || u8 || HasInitialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x192 || u8 || IsSystem&lt;br /&gt;
|-&lt;br /&gt;
| 0x193 || u8[12+1] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A0 || u16 || NumberOfCreatedThreads&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A2 || u16 || ThreadingRelatedInitiallyZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A4 || u32 || ProcessFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A8 || [[#KProcessCapabilities]] || Capabilities&lt;br /&gt;
|-&lt;br /&gt;
| 0x258 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x260 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x268 || u64 || CreatedTickstamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x270 || u64 || Entrypoint&lt;br /&gt;
|-&lt;br /&gt;
| 0x278 || u64 || CodeMemUsage&lt;br /&gt;
|-&lt;br /&gt;
| 0x280 || u64 || DynamicMemUsage&lt;br /&gt;
|-&lt;br /&gt;
| 0x288 || u64 || MaxTotalMemUsage&lt;br /&gt;
|-&lt;br /&gt;
| 0x290 || u32 || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x298 || u64[5] || Unused [?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C0 || [[#KProcessHandleTable]] || HandleTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x2380 || void* || UsermodeExceptionTlsArea&lt;br /&gt;
|-&lt;br /&gt;
| 0x2388 || [[#KLinkedListNode]]&amp;lt;[[#KThread]] *&amp;gt; || ExceptionThreadList&lt;br /&gt;
|-&lt;br /&gt;
| 0x2398 || [[#KThread]]* || ExceptionThread&lt;br /&gt;
|-&lt;br /&gt;
| 0x23A0 || [[#KLinkedListNode]]&amp;lt;[[#KThread]] *&amp;gt; || ThreadList&lt;br /&gt;
|-&lt;br /&gt;
| 0x23B0 || [[#KLinkedListNode]]&amp;lt;[[#KSharedMemoryRef]] *&amp;gt; || MappedSharedMemoriesList&lt;br /&gt;
|-&lt;br /&gt;
| 0x23C0 || bool || HasStarted&lt;br /&gt;
|-&lt;br /&gt;
| 0x23C1 || bool || HasException&lt;br /&gt;
|-&lt;br /&gt;
| 0x23C4 || u32 || ExceptionEnum0&lt;br /&gt;
|-&lt;br /&gt;
| 0x23C8 || u64 || ExceptionEnum1&lt;br /&gt;
|-&lt;br /&gt;
| 0x23D0 || u64 || ExceptionThreadUnkInfo0&lt;br /&gt;
|-&lt;br /&gt;
| 0x23D8 || u64 || BreakArg0&lt;br /&gt;
|-&lt;br /&gt;
| 0x23E0 || u64 || BreakArg1&lt;br /&gt;
|-&lt;br /&gt;
| 0x23E8 || u64 || BreakArg2&lt;br /&gt;
|-&lt;br /&gt;
| 0x23F0 || u64 || ExceptionThreadUnkInfo1&lt;br /&gt;
|-&lt;br /&gt;
| 0x23F8 || u32 || UnusedZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2400 || u64[8] || UnusedZeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2440 || u64 || UnusedZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2448 || u64 || UnusedZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2450 || u64[6] || Unused [?]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== KTlsPageManager ==&lt;br /&gt;
Size: 0x20&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || void* || TlsPagePtr&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#KProcess*]] || ProcessPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || UsageCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || u8[8] || IsSlotFree&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KProcessCapabilities ==&lt;br /&gt;
Size: 0xB0&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u8[16] || SvcAccessMask&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u8[128] || IrqAccessMask&lt;br /&gt;
|-&lt;br /&gt;
| 0x90 || u64 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| 0x98 || u64 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0 || u32 || DebuggingFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4 || u32 || HandleTableSize&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8 || u32 || KernelReleaseVersion&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC || u32 || ApplicationType&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KProcessHandleTable ==&lt;br /&gt;
[1.0.0] Size: 0x2A0&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0x20C0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KHandleEntry]]* || TablePtr&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#KHandleEntry]]* || NextFreeEntry&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KHandleEntry]][40] || InternalTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x290 || u16 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x292 || u16 || MaxUsageAtOnce&lt;br /&gt;
|-&lt;br /&gt;
| 0x294 || u16 || IdCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x296 || u16 || NumActiveSlots&lt;br /&gt;
|-&lt;br /&gt;
| 0x298 || [[#KSpinLock]] || Lock&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KHandleEntry]]* || TablePtr&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#KHandleEntry]]* || NextFreeEntry&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KHandleEntry]][1024] || InternalTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x2010 || u16 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x2012 || u16 || MaxUsageAtOnce&lt;br /&gt;
|-&lt;br /&gt;
| 0x2014 || u16 || IdCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x2016 || u16 || NumActiveSlots&lt;br /&gt;
|-&lt;br /&gt;
| 0x2040 || [[#KSpinLock]] || Lock&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KHandleEntry ===&lt;br /&gt;
[1.0.0] Size: 0x10&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 8&lt;br /&gt;
&lt;br /&gt;
[5.0.0] Size: 0x10&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u16 || HandleId&lt;br /&gt;
|-&lt;br /&gt;
| 2 || u8 || ObjectType&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#KAutoObject]]* || Object&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u16 || HandleId&lt;br /&gt;
|-&lt;br /&gt;
| 2 || u8 || ObjectType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || ObjectCompressedPtr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 5.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u16 || HandleId&lt;br /&gt;
|-&lt;br /&gt;
| 2 || u16 || ObjectType&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#KAutoObject]] || object&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KSpinLock ===&lt;br /&gt;
[1.0.0] Size: 0x1&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0x40&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u8 || IsBusy&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u16 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u16 ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== KSharedMemoryRef ==&lt;br /&gt;
[2.0.0] Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KLinkedListNode]]&amp;lt;[[#KSharedMemoryRef]] *&amp;gt; || NodeFor__MappedSharedMemoriesList&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KSharedMemory*]] || SharedMem&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || InitiallyZero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KMemoryManager =&lt;br /&gt;
[1.0.0] Size: 0xB8&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0xC8&lt;br /&gt;
&lt;br /&gt;
[5.0.0] Size: 0xF8?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || * || Vtable&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || AddrSpaceMinAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || AddrSpaceMaxAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || HeapRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || HeapCurAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || MapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || u64 || MapRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || u64 || HeapMaxAllocation&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || [[#KMutex]] || Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#KPageTable]] || PageTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || [[#KMemoryBlockManager]] || MemoryBlockManager&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || bool || IsKernel&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || bool || IsSystem&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || bool || IsAddrSpace36Bit&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || bool || HasAslr&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || u32 || Is_0x59_If_Cfg12_Bit0_ElseZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x80 || u32 || Is_0x5A_If_Cfg12_Bit0_ElseZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x84 || u32 || Is_0x58_If_Cfg12_Bit0_ElseZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x88 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x90 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x98 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0 || u64 || TranslationTableBaseRegister0&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8 || u64 || TranslationControlRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0xB0 || u8 || AsidTagValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || * || Vtable&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || AddrSpaceMinAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || AddrSpaceMaxAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || HeapRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || HeapCurAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || MapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || u64 || MapRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || u64 || NewMapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || u64 || NewMapRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || u64 || TlsIoRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || u64 || TlsIoRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || u64 || HeapMaxAllocation&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || [[#KMutex]] || Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || [[#KPageTable]] || PageTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x80 || [[#KMemoryBlockManager]] || MemoryBlockManager&lt;br /&gt;
|-&lt;br /&gt;
| 0x98 || u32 || AddressSpaceWidth (32/36/39)&lt;br /&gt;
|-&lt;br /&gt;
| 0x9C || bool || IsKernel&lt;br /&gt;
|-&lt;br /&gt;
| 0x9D || bool || IsSystem&lt;br /&gt;
|-&lt;br /&gt;
| 0x9E || bool || HasAslr&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0 || u32 || PoolPartition&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4 || u32 || Is_0x5A_If_Cfg12_Bit0_ElseZero&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8 || u32 || Is_0x59_If_Cfg12_Bit0_ElseZero&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC || u32 || Is_0x58_If_Cfg12_Bit0_ElseZero&lt;br /&gt;
|-&lt;br /&gt;
| 0xB0 || u64 || TranslationTableBaseRegister0&lt;br /&gt;
|-&lt;br /&gt;
| 0xB8 || u64 || TranslationControlRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0 || u32 || AsidTagValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 5.0.0 Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || * || Vtable&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || AddrSpaceMinAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || AddrSpaceMaxAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || HeapRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || HeapCurAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || MapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || u64 || MapRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || u64 || NewMapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || u64 || NewMapRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || u64 || TlsIoRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || u64 || TlsIoRegionEndAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || u64 || HeapMaxAllocation&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 0x70 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#KMutex]] || Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x80 || [[#KPageTable]] || PageTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x90 || [[#KMemoryBlockManager]] || MemoryBlockManager&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8 || u32 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC || u32 || AddressSpaceWidth (32/36/39)&lt;br /&gt;
|-&lt;br /&gt;
| 0xB0 || [[#KLinkedList]]? || &lt;br /&gt;
|-&lt;br /&gt;
| 0xC8 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 0xD0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 0xD8 || ptr || &lt;br /&gt;
|-&lt;br /&gt;
| 0xE0 || u64 || TranslationTableBaseRegister0 val&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8 || u64 || TranslationControlRegister val&lt;br /&gt;
|-&lt;br /&gt;
| 0xF0 || u32 || AsidTagValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== KPageTable ==&lt;br /&gt;
Size: 0x10&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || void* || RawPageTablePtr&lt;br /&gt;
|-&lt;br /&gt;
| 8 || bool ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC || u32 || AddrSpaceSizeInGb&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KMemoryBlockManager ==&lt;br /&gt;
Size: 0x18&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KMemoryBlock]]* || MemoryBlockList&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || MaxAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || MinAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KMemoryBlock ==&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KLinkedListNode]]&amp;lt;[[#KMemoryBlock]] *&amp;gt; || NodeFor__MemoryBlockList&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || NumOfPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u32 || State&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || u16 || IpcRefCount [?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || u16 || DeviceMapRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || u8 || Permission&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 || u8 || UnkAttribute&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A || u8 || Attribute&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KMemoryBlockInfo ==&lt;br /&gt;
Size: 0x20&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u64 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || State&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || u8 || Permission&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || u8 || Attribute&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || u8 || UnkAttribute&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u16 || IpcRefCount [?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || u16 || DeviceMapRefCount&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KTransferMemory =&lt;br /&gt;
Size: 0x48&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || KMemoryBlockList || Blocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || [[#KProcess]]* || OwnerProcess&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || KMutex || Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || int || Permission&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || bool || HasInited&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || bool || IsMapped&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KSharedMemory =&lt;br /&gt;
[1.0.0] Size: 0x40&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0x48&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || KMemoryBlockList || Blocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || [[#KProcess]]* || OwnerProcess&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || int || LocalPermission&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || int || RemotePermission&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || bool || HasInited&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || KMemoryBlockList || Blocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || [[#KResourceLimit]]* || OwnerResourceLimit&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || OwnerProcessPid&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || int || LocalPermission&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || int || RemotePermission&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || bool || HasInited&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KJitMemory =&lt;br /&gt;
[4.0.0+] Size: 0x58&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || KMemoryBlockList || Blocks&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || [[#KProcess]]* || SrcProcessPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || [[#KMutex]] || Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || u8 || HasInit&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || u8 || HasMappedSlave&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || u8 || HasMappedMaster&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KPort =&lt;br /&gt;
[1.0.0] Size: 0xA8&lt;br /&gt;
&lt;br /&gt;
[7.0.0] Size: 0x110&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KServerPort]] || ServerSide&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || [[#KClientPort]] || ClientSide&lt;br /&gt;
|-&lt;br /&gt;
| 0x98 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0 || bool || HasInited&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1 || bool || IsLight&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 7.0.0 Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || [[#KServerPort]] || ServerSide&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0 || [[#KClientPort]] || ClientSide&lt;br /&gt;
|-&lt;br /&gt;
| 0xF8 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || char* || NamePtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x108 || bool || HasInited&lt;br /&gt;
|-&lt;br /&gt;
| 0x109 || bool || IsLight&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== KServerPort ==&lt;br /&gt;
Size: 0x50&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KSynchronizationObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KSynchronizationObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || [[#KLinkedListNode]] || IncomingConnections&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || [[#KLinkedListNode]] || IncomingLightConnections&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || [[#KPort]]* || Parent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KClientPort ==&lt;br /&gt;
Size: 0x38&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KSynchronizationObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KSynchronizationObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u32 || NumSessions&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MaxSessions&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || [[#KPort]]* || Parent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KSession =&lt;br /&gt;
Size: 0xB0&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KServerSession]] || ServerSide&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || [[#KClientSession]] || ClientSide&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8 || bool || HasInited&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KServerSession ==&lt;br /&gt;
Size: 0x60&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KSynchronizationObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KSynchronizationObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || KLinkedListNode ||  NodeFor__IncomingConnections&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || [[#KSession*]] || Parent&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || KLinkedListNode&amp;lt;[[#KSessionRequest]]*&amp;gt; || RequestList&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#KSessionRequest]]* || ActiveRequest&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#KMutex]] || lock&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== KSessionRequest ===&lt;br /&gt;
Size: 0x158&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || KLinkedListNode ||  NodeFor__RequestList&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || [[#KBufferDescriptor]][8] || BufferTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x120 || [[#KBufferDescriptor]]* || ExternalBufferTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x128 || u8 || NumSendBuffers&lt;br /&gt;
|-&lt;br /&gt;
| 0x129 || u8 || NumRecvBuffers&lt;br /&gt;
|-&lt;br /&gt;
| 0x12A || u8 || NumExchBuffers&lt;br /&gt;
|-&lt;br /&gt;
| 0x130 || [[#KThread]]* || SenderThread&lt;br /&gt;
|-&lt;br /&gt;
| 0x138 || u64 || InitiallyZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x140 || [[#KWritableEvent]]* || ForAsyncEvent&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || u64 || CustomCmdbufAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x150 || u64 || CustomCmdbufSize&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== KBufferDescriptor ===&lt;br /&gt;
Size: 0x20&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u64 || UserVirtAddr&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || BufferMemoryState&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KClientSession ==&lt;br /&gt;
Size: 0x38&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KSession]]* || Parent&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || bool || HasInited&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || [[#KClientPort]]* || ParentPort&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || [[#KProcess]]* || CreatorProcess&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KLightSession =&lt;br /&gt;
Size: 0xA8&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KLightSessionServer]] || ServerSide&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || [[#KLightSessionClient]] || ClientSide&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0 || bool || HasInited&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KLightServerSession ==&lt;br /&gt;
Size: 0x58&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || KLinkedListNode || NodeFor__IncomingLightConnections&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || [[#KLightSession]] || Parent&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64[6] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KLightClientSession ==&lt;br /&gt;
Size: 0x38&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KLightSession]]* || Parent&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || bool || HasInited&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || [[#KClientPort]]* || Port&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || [[#KProcess]]* || CreatorProcess&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KEvent =&lt;br /&gt;
Size: 0x70&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KReadableEvent]] || ReadableEvent&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || [[#KWritableEvent]] || WritableEvent&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || [[#KProcess]]* || Creator&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || bool || HasInited&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KReadableEvent ==&lt;br /&gt;
Size: 0x38&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KSynchronizationEvent]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KSynchronizationObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || bool ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || [[#KEvent]]* || Parent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KWritableEvent ==&lt;br /&gt;
Size: 0x18&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KEvent]]* || Parent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KInterruptEvent ==&lt;br /&gt;
[1.0.0] Size: 0x50&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0x48&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KReadableEvent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KReadableEvent]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || [[#KInterruptReceiver]] || Receiver&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || u32 || IrqId (or -1)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KReadableEvent]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || [[#KInterruptReceiver]]* || Receiver&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || u32 || IrqId (or -1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || bool || IsIrqRegistered&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KInterruptReceiver ===&lt;br /&gt;
[1.0.0] Size: 0x10&lt;br /&gt;
[2.0.0] Size: 0x20&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || * || Vtable&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || * || Vtable&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || InitiallyZero&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KInterruptEvent]]* || IrqEventPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || s32 || IrqId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KDeviceAddressSpace =&lt;br /&gt;
Size: 0x70&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KMutex]] || Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#KSmmuManager]] || Manager&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || u64 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || bool || HasInited&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[1.0.0] It was called KAddressSpace.&lt;br /&gt;
&lt;br /&gt;
== KSmmuManager ==&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u8[4] || PageTableAsids&lt;br /&gt;
|-&lt;br /&gt;
| 8 || void*[4] || PageDirectories&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || AttachedDevicesMask&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u32 || RegVal32Bit&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || u32 || RegVal32BitEmpty&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || u32 || RegVal36Bit&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || u32 || RegVal36BitEmpty&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KResourceLimit =&lt;br /&gt;
Size: 0x68&lt;br /&gt;
&lt;br /&gt;
Inherits from: [[#KAutoObject]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KAutoObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64[5] || CurrentValue&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || u64[5] || LimitValue&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || [[#KMutex]] || Mutex&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KPoolManager =&lt;br /&gt;
[1.0.0] Size: 0x380&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0x450&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KPoolAllocator]][3] || Allocator&lt;br /&gt;
|-&lt;br /&gt;
| 0x348 || [[#KPoolRefManager]] || RefManager&lt;br /&gt;
|-&lt;br /&gt;
| 0x368 || u64 || AllocationCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x370 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x378 || [[#KMutex]] || Mutex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KPoolAllocator]] || Allocator0&lt;br /&gt;
|-&lt;br /&gt;
| 0x220 || [[#KPartitionInfo]]* || PartitionInfo0&lt;br /&gt;
|-&lt;br /&gt;
| 0x228 || [[#KPoolAllocator]] || Allocator1&lt;br /&gt;
|-&lt;br /&gt;
| 0x448 || [[#KPartitionInfo]]* || PartitionInfo1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== KPoolAllocator ==&lt;br /&gt;
[1.0.0] Size: 0x118&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0x220&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || void* || MemoryBase&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || MemorySize&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || s32 || NumPools&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#KPool]][8] || Pools&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || void* || MemoryBase&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || MemorySize&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#KPool]][8] || Pools&lt;br /&gt;
|-&lt;br /&gt;
| 0x210 || s32 || NumPools&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== KPool ===&lt;br /&gt;
[1.0.0] Size: 0x20&lt;br /&gt;
&lt;br /&gt;
[2.0.0] Size: 0x40&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || KPoolHeader* || FirstFreeChunk&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || void* || SingletonTableEntryPtr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 2.0.0 Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || KPoolHeader* || FirstFreeChunk&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || void* || SingletonTableEntryPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || [[#KPool]]* || Parent&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64[2] || DmaProtectionKey&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== KPoolRefManager ==&lt;br /&gt;
[1.0.0] Size: 0x20&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KPoolManager]]* || Parent&lt;br /&gt;
|-&lt;br /&gt;
| 8 || void* || PoolBase&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || MaxPage&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u16* || RefCountTable&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KObjectAllocator =&lt;br /&gt;
Size: 0x50&lt;br /&gt;
[5.0.0]? Size: 0x48&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KLockedList]] || LockedList &lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || [[#KSlabHeap]] || SlabHeap &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= KSlabHeap =&lt;br /&gt;
Size: 0x28&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || void* || FreeListHead &lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || u64 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || void* || HeapPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TotalHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || SingleObjectSize&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
5.0.0 (?):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || void* || FreeListHead &lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || u64 || SingleObjectSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || void* || HeapPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || void* || Start (equal to HeapPtr on init)&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || void* || End&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KPageTableAllocator =&lt;br /&gt;
Size: 0x30&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u16* || RefCountTable&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || void* || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KIrqManager =&lt;br /&gt;
[1.0.0] Size: 0x1608&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KIrqEntry]][32] || Core0Irq&lt;br /&gt;
|-&lt;br /&gt;
| 0x200 || [[#KIrqEntry]][32] || Core1Irq&lt;br /&gt;
|-&lt;br /&gt;
| 0x400 || [[#KIrqEntry]][32] || Core2Irq&lt;br /&gt;
|-&lt;br /&gt;
| 0x600 || [[#KIrqEntry]][32] || Core3Irq&lt;br /&gt;
|-&lt;br /&gt;
| 0x800 || [[#KIrqEntry]][224] || SharedIrqs&lt;br /&gt;
|-&lt;br /&gt;
| 0x1600 || [[#KMutex]] || Mutex&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KIrqEntry ==&lt;br /&gt;
[1.0.0] Size: 0x10&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KInterruptReceiver]]* || Receiver&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u8 || State0&lt;br /&gt;
|-&lt;br /&gt;
| 9 || u8 || State1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KDebug =&lt;br /&gt;
Size: 0x50&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KSynchronizationObject]] || Inheritance&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || [[#KLinkedListNode]]&amp;lt;[[#KDebugEvent]]&amp;gt; || EventList&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || u32 || Flags&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || [[#KProcess]]* || ProcessPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || [[#KMutex]] || Mutex&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KDebugEvent ==&lt;br /&gt;
Size: 0x60&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KLinkedListNode]]&amp;lt;[[#KDebugEvent]] *&amp;gt; || NodeFor__EventList&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || u32 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u32 || Flags&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || u16 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || bool ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || ... || ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= KManagedPort =&lt;br /&gt;
Size: 0x28&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Type || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#KLinkedListNode]]&amp;lt;[[#KManagedPort]] *&amp;gt; || NodeFor__ManagedPortList&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || char[12] || PortName&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || [[#KClientPort]]* || ClientPort&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Slab Information =&lt;br /&gt;
&lt;br /&gt;
The Horizon/NX kernel keeps all objects in slab allocators, that can allocate a fixed amount of each. Attempting to allocate an object when the slab heap is full will result in an error 0xCE01 (Resource Exhaustion).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Object || Slab Count&lt;br /&gt;
|-&lt;br /&gt;
| KEvent || 600&lt;br /&gt;
|-&lt;br /&gt;
| KInterruptEvent || 100&lt;br /&gt;
|-&lt;br /&gt;
| KProcess || 80&lt;br /&gt;
|-&lt;br /&gt;
| KThread || 700&lt;br /&gt;
|-&lt;br /&gt;
| KPort || 200&lt;br /&gt;
|-&lt;br /&gt;
| KSharedMemory || 80&lt;br /&gt;
|-&lt;br /&gt;
| KTransferMemory || 200&lt;br /&gt;
|-&lt;br /&gt;
| KDeviceAddressSpace || 300&lt;br /&gt;
|-&lt;br /&gt;
| KDebug || 4&lt;br /&gt;
|-&lt;br /&gt;
| KSession || 800&lt;br /&gt;
|-&lt;br /&gt;
| KLightSession || 100&lt;br /&gt;
|-&lt;br /&gt;
| KLinkedListEntry&amp;lt;void*&amp;gt; || 17 231&lt;br /&gt;
|-&lt;br /&gt;
| KLinkedListNode || 4 000&lt;br /&gt;
|-&lt;br /&gt;
| KMemoryBlock (System) || 20 000&lt;br /&gt;
|-&lt;br /&gt;
| KMemoryBlock (Other) || 10 000&lt;br /&gt;
|-&lt;br /&gt;
| KTlsPageManager || 167&lt;br /&gt;
|-&lt;br /&gt;
| KManagedPort || 7&lt;br /&gt;
|-&lt;br /&gt;
| KDebugEvent || 704&lt;br /&gt;
|-&lt;br /&gt;
| KSessionRequest || 1 600&lt;br /&gt;
|-&lt;br /&gt;
| KResourceLimit || 5&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=8183</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=8183"/>
		<updated>2019-10-30T15:33:46Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: svcContinueDebugEvent: 1.0.0-2.3.0 32-bit register info.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || [[#svcSignalEvent]] || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || [[#svcClearEvent]] || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || [[#svcResetSignal]] || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=baseaddr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id&lt;br /&gt;
R0=debug_handle, R1=[[#ContinueDebugFlagsOld]], R2=thread_id_lower32, R3=thread_id_upper32&lt;br /&gt;
&lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || [[#svcGetProcessList]] || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R1=info_sub_id_lower32, R2=info_id, R3=handle, R4=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr&lt;br /&gt;
R0=name_ptr, R2=max_sessions, R3=is_light&lt;br /&gt;
|| W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32, R5=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr&lt;br /&gt;
R0=meminfo_ptr, R1=addr_lower32, R2=process_handle, R3=addr_upper32&lt;br /&gt;
|| W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz&lt;br /&gt;
R0=process_handle, R1=main_thread_prio, R2=default_cpuid, R3=main_thread_stacksz_lower32, R4=main_thread_stacksz_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]]&lt;br /&gt;
R1=process_handle, R2=[[#ProcessInfoType]]&lt;br /&gt;
|| W0=result, X1=[[#ProcessState]]&lt;br /&gt;
R0=result, R1=[[#ProcessState]]_lower32, R2=[[#ProcessState]]_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value&lt;br /&gt;
R0=reslimit_handle, R1=[[#LimitableResource]], R2=value_lower32, R3=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args&lt;br /&gt;
R0=smc_sub_id, R1, R2, R3=smc_args&lt;br /&gt;
|| X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
R0,R1,R2,R3=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d, and always in the Heap memory region) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition. The memory allocated counts towards the caller&#039;s process Memory ResourceLimit.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Invalid size passed. It&#039;s either bigger than 4GB, or misaligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD001:&#039;&#039;&#039; Size is bigger than the Heap Region size.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; KMemoryBlockAllocator slab allocator exhausted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The memory region is in an invalid state. Likely because a mapping was made in the heap region.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x10801:&#039;&#039;&#039; Memory resource limit reached.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The memory region was reprotected.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Unaligned address specified.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Unaligned or zero size specified.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The provided memory region does not fall within the userland address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD801:&#039;&#039;&#039; Invalid permission specified. Valid permissions are ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The provided memory region was in an invalid state. The region must have the PermissionChangeAllowed bit set in its [[#MemoryState]], and must not have the IsBorrowed or IsUncached [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; Kernel resource exhausted.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcSignalEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Puts the given event in the signaled state.&lt;br /&gt;
&lt;br /&gt;
Will wake up any thread currently waiting on this event. Can potentially trigger a reschedule.&lt;br /&gt;
&lt;br /&gt;
Any calls to [[#svcWaitSynchronization]] on this handle will return immediately, until the event&#039;s signaled state is reset.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Event is now in signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
== svcClearEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent or ReadableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Takes the given event out of the signaled state.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success, the event is now in the not-signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a ReadableEvent nor a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xFA01:&#039;&#039;&#039; The handle was not in a signaled state.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcResetSignal ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;ReadableEvent&amp;gt; or Handle&amp;lt;Process&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resets the signal on the given handle, ensuring future calls to [[#svcWaitSynchronization]] on this handle will sleep until the handle is signaled again. If the handle is a ReadableEvent, this is equivalent to calling svcClearEvent() on the handle.&lt;br /&gt;
&lt;br /&gt;
If the handle is a Process, it will clear the signaled state (which is set when the process changes [[#ProcessState]]. Once the process enters the Exited state, calling svcResetSignal on the process will no longer have an effect (the process is permanently signaled), and the syscall will return 0xFA01.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The signal was reset.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The handle is invalid or of the wrong type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xFA01:&#039;&#039;&#039; The handle was not signaled, or the process is in exited state, causing it to be permanently signaled.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 23 || 0 || [9.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || BaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query the physical address of a virtual address. Will always fetch the lowest page-aligned mapping that contains the provided physical address.&lt;br /&gt;
&lt;br /&gt;
The returned BaseAddr is the virtual address of that page-aligned mapping, while PhysAddr is the physical address of that page. Size is the amount of continuous physical memory in that mapping.&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! [1.0.0-2.3.0] Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Debug&amp;gt; || DebugHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || [[#ContinueDebugFlagsOld]] || DebugFlags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! [3.0.0+] Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Debug&amp;gt; || DebugHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || [[#ContinueDebugFlags]] || DebugFlags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || u64* || ThreadIdList&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || size_t || NumTids (max 64 - 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessList ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || u64* || PidBuffer&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || size_t || PidBufferSize&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || size_t || NumProcesses&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Fills the provided array with the pids of currently living processes. A process &amp;quot;lives&amp;quot; so long as it is currently running or a handle to it still exists.&lt;br /&gt;
&lt;br /&gt;
It returns the total number of processes currently alive. If this number is bigger than the size of PidBuffer, the user won&#039;t have all the pids.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xd401:&#039;&#039;&#039; The provided buffer is outside the process address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; copyToUser failed. The provided buffer is not user-accessible.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; The provided buffer size is too big. Max value is 0xFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R5 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R1, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R2 || [[#ProcessInfoType]] || InfoType&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1, R2 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || R1-R3 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || R1-R3 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type || &lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls || Allows using [[#svcWriteDebugProcessMemory]] on segments mapped read-only.&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]]) ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted || The physical memory blocks backing this region are refcounted.&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] [[#svcCreateCodeMemory|CodeMemoryAllowed]] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=8182</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=8182"/>
		<updated>2019-10-30T15:22:06Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add detailed information about svcGetProcessList.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || [[#svcSignalEvent]] || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || [[#svcClearEvent]] || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || [[#svcResetSignal]] || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=baseaddr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || [[#svcGetProcessList]] || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R1=info_sub_id_lower32, R2=info_id, R3=handle, R4=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr&lt;br /&gt;
R0=name_ptr, R2=max_sessions, R3=is_light&lt;br /&gt;
|| W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32, R5=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr&lt;br /&gt;
R0=meminfo_ptr, R1=addr_lower32, R2=process_handle, R3=addr_upper32&lt;br /&gt;
|| W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz&lt;br /&gt;
R0=process_handle, R1=main_thread_prio, R2=default_cpuid, R3=main_thread_stacksz_lower32, R4=main_thread_stacksz_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]]&lt;br /&gt;
R1=process_handle, R2=[[#ProcessInfoType]]&lt;br /&gt;
|| W0=result, X1=[[#ProcessState]]&lt;br /&gt;
R0=result, R1=[[#ProcessState]]_lower32, R2=[[#ProcessState]]_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value&lt;br /&gt;
R0=reslimit_handle, R1=[[#LimitableResource]], R2=value_lower32, R3=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args&lt;br /&gt;
R0=smc_sub_id, R1, R2, R3=smc_args&lt;br /&gt;
|| X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
R0,R1,R2,R3=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d, and always in the Heap memory region) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition. The memory allocated counts towards the caller&#039;s process Memory ResourceLimit.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Invalid size passed. It&#039;s either bigger than 4GB, or misaligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD001:&#039;&#039;&#039; Size is bigger than the Heap Region size.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; KMemoryBlockAllocator slab allocator exhausted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The memory region is in an invalid state. Likely because a mapping was made in the heap region.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x10801:&#039;&#039;&#039; Memory resource limit reached.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The memory region was reprotected.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Unaligned address specified.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Unaligned or zero size specified.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The provided memory region does not fall within the userland address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD801:&#039;&#039;&#039; Invalid permission specified. Valid permissions are ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The provided memory region was in an invalid state. The region must have the PermissionChangeAllowed bit set in its [[#MemoryState]], and must not have the IsBorrowed or IsUncached [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; Kernel resource exhausted.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcSignalEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Puts the given event in the signaled state.&lt;br /&gt;
&lt;br /&gt;
Will wake up any thread currently waiting on this event. Can potentially trigger a reschedule.&lt;br /&gt;
&lt;br /&gt;
Any calls to [[#svcWaitSynchronization]] on this handle will return immediately, until the event&#039;s signaled state is reset.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Event is now in signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
== svcClearEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent or ReadableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Takes the given event out of the signaled state.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success, the event is now in the not-signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a ReadableEvent nor a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xFA01:&#039;&#039;&#039; The handle was not in a signaled state.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcResetSignal ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;ReadableEvent&amp;gt; or Handle&amp;lt;Process&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resets the signal on the given handle, ensuring future calls to [[#svcWaitSynchronization]] on this handle will sleep until the handle is signaled again. If the handle is a ReadableEvent, this is equivalent to calling svcClearEvent() on the handle.&lt;br /&gt;
&lt;br /&gt;
If the handle is a Process, it will clear the signaled state (which is set when the process changes [[#ProcessState]]. Once the process enters the Exited state, calling svcResetSignal on the process will no longer have an effect (the process is permanently signaled), and the syscall will return 0xFA01.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The signal was reset.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The handle is invalid or of the wrong type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xFA01:&#039;&#039;&#039; The handle was not signaled, or the process is in exited state, causing it to be permanently signaled.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 23 || 0 || [9.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || BaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query the physical address of a virtual address. Will always fetch the lowest page-aligned mapping that contains the provided physical address.&lt;br /&gt;
&lt;br /&gt;
The returned BaseAddr is the virtual address of that page-aligned mapping, while PhysAddr is the physical address of that page. Size is the amount of continuous physical memory in that mapping.&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessList ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || u64* || PidBuffer&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || size_t || PidBufferSize&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || size_t || NumProcesses&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Fills the provided array with the pids of currently living processes. A process &amp;quot;lives&amp;quot; so long as it is currently running or a handle to it still exists.&lt;br /&gt;
&lt;br /&gt;
It returns the total number of processes currently alive. If this number is bigger than the size of PidBuffer, the user won&#039;t have all the pids.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xd401:&#039;&#039;&#039; The provided buffer is outside the process address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; copyToUser failed. The provided buffer is not user-accessible.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; The provided buffer size is too big. Max value is 0xFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R5 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R1, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R2 || [[#ProcessInfoType]] || InfoType&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1, R2 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || R1-R3 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || R1-R3 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type || &lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls || Allows using [[#svcWriteDebugProcessMemory]] on segments mapped read-only.&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]]) ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted || The physical memory blocks backing this region are refcounted.&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] [[#svcCreateCodeMemory|CodeMemoryAllowed]] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Main_Page/Navigation&amp;diff=8083</id>
		<title>Main Page/Navigation</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Main_Page/Navigation&amp;diff=8083"/>
		<updated>2019-10-12T08:55:46Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add link to test pads&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Main page box|Navigation|:Navigation}}&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: -.3em -1em -1em -1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; bgcolor=&amp;quot;#fff&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2px&amp;quot; cellspacing=&amp;quot;2px&amp;quot; style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#e7eef6&amp;quot;&lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;General&#039;&#039;&#039;&lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;Homebrew&#039;&#039;&#039;&lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;Switch Hardware&#039;&#039;&#039;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; style=&amp;quot;background: #F5FAFF;&amp;quot;&lt;br /&gt;
| &lt;br /&gt;
*[[Product Information]]&lt;br /&gt;
|&lt;br /&gt;
*[[Setting up Development Environment]]&lt;br /&gt;
*[[Homebrew Exploits]]&lt;br /&gt;
*[[Homebrew Applications]]&lt;br /&gt;
*[[Switch System Flaws]]&lt;br /&gt;
*[[Switch Userland Flaws]]&lt;br /&gt;
|&lt;br /&gt;
*[[Hardware|Overview]]&lt;br /&gt;
*[[Joy-Con]]&lt;br /&gt;
*[[Cartridge]]&lt;br /&gt;
*[[Dock]]&lt;br /&gt;
*[[Testpads|Mainboard Testpads]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: -.3em -1em -1em -1em; margin-top: +1em&amp;quot;&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; bgcolor=&amp;quot;#fff&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2px&amp;quot; cellspacing=&amp;quot;2px&amp;quot; style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#e7eef6&amp;quot;&lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;Switch Operating System&#039;&#039;&#039; &lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;Switch Software Stack&#039;&#039;&#039;&lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;Switch Content&#039;&#039;&#039;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; style=&amp;quot;background: #F5FAFF;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
*[[SVC|System calls]]&lt;br /&gt;
*[[Services API]]&lt;br /&gt;
*[[IPC Marshalling]]&lt;br /&gt;
*[[Memory layout]]&lt;br /&gt;
*[[Error codes]]&lt;br /&gt;
|&lt;br /&gt;
*[[Title list]]&lt;br /&gt;
*[[Nintendo Software]]&lt;br /&gt;
*[[Recovery Mode]]&lt;br /&gt;
*[[System Versions]]&lt;br /&gt;
| &lt;br /&gt;
*[[Online Multiplayer]]&lt;br /&gt;
*[[SD Filesystem]]&lt;br /&gt;
*[[Flash Filesystem]]&lt;br /&gt;
*[[Domains]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{box-footer-empty}}&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Fuses&amp;diff=8071</id>
		<title>Fuses</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Fuses&amp;diff=8071"/>
		<updated>2019-10-07T17:44:44Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Nintendo Switch makes use of Tegra&#039;s fuse driver for a number of operations. This driver is mapped to physical address 0x7000F800 with a total size of 0x400 bytes and exposes several registers for fuse programming.&lt;br /&gt;
&lt;br /&gt;
Registers from 0x7000F800 to 0x7000F800 + 0xFF can be used to directly program the hardware fuse bitmap, while registers from 0x7000F800 + 0x100 (FUSE_CHIP_REG_START_OFFSET) to 0x7000F800 + 0x3FC (FUSE_CHIP_REG_END_OFFSET) represent cached values read from certain fuses.&lt;br /&gt;
&lt;br /&gt;
== Registers ==&lt;br /&gt;
Below is a list of fuse driver registers used by the Switch&#039;s bootloaders.&lt;br /&gt;
&lt;br /&gt;
=== Driver registers ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Name&lt;br /&gt;
!  Address&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_FUSECTRL|FUSE_FUSECTRL]]&lt;br /&gt;
| 0x7000F800&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_FUSEADDR|FUSE_FUSEADDR]]&lt;br /&gt;
| 0x7000F804&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_FUSERDATA|FUSE_FUSERDATA]]&lt;br /&gt;
| 0x7000F808&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_FUSEWDATA|FUSE_FUSEWDATA]]&lt;br /&gt;
| 0x7000F80C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_FUSETIME_RD1&lt;br /&gt;
| 0x7000F810&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_FUSETIME_RD2&lt;br /&gt;
| 0x7000F814&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_FUSETIME_PGM1&lt;br /&gt;
| 0x7000F818&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_FUSETIME_PGM2|FUSE_FUSETIME_PGM2]]&lt;br /&gt;
| 0x7000F81C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIV2INTFC_START|FUSE_PRIV2INTFC_START]]&lt;br /&gt;
| 0x7000F820&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_FUSEBYPASS&lt;br /&gt;
| 0x7000F824&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PRIVATEKEYDISABLE&lt;br /&gt;
| 0x7000F828&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_DISABLEREGPROGRAM|FUSE_DISABLEREGPROGRAM]]&lt;br /&gt;
| 0x7000F82C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_WRITE_ACCESS_SW|FUSE_WRITE_ACCESS_SW]]&lt;br /&gt;
| 0x7000F830&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PWR_GOOD_SW&lt;br /&gt;
| 0x7000F834&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PRIV2RESHIFT&lt;br /&gt;
| 0x7000F83C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_FUSETIME_RD3&lt;br /&gt;
| 0x7000F84C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PRIVATE_KEY0_NONZERO&lt;br /&gt;
| 0x7000F880&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PRIVATE_KEY1_NONZERO&lt;br /&gt;
| 0x7000F884&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PRIVATE_KEY2_NONZERO&lt;br /&gt;
| 0x7000F888&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PRIVATE_KEY3_NONZERO&lt;br /&gt;
| 0x7000F88C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PRIVATE_KEY4_NONZERO&lt;br /&gt;
| 0x7000F890&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FUSE_FUSECTRL ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-1&lt;br /&gt;
| FUSE_FUSECTRL_CMD&lt;br /&gt;
 0x00: IDLE&lt;br /&gt;
 0x01: READ&lt;br /&gt;
 0x02: WRITE&lt;br /&gt;
 0x03: SENSE_CTRL&lt;br /&gt;
|-&lt;br /&gt;
| 16-20&lt;br /&gt;
| FUSE_FUSECTRL_STATE&lt;br /&gt;
 0x00: STATE_RESET&lt;br /&gt;
 0x01: STATE_POST_RESET&lt;br /&gt;
 0x02: STATE_LOAD_ROW0&lt;br /&gt;
 0x03: STATE_LOAD_ROW1&lt;br /&gt;
 0x04: STATE_IDLE&lt;br /&gt;
 0x05: STATE_READ_SETUP&lt;br /&gt;
 0x06: STATE_READ_STROBE&lt;br /&gt;
 0x07: STATE_SAMPLE_FUSES&lt;br /&gt;
 0x08: STATE_READ_HOLD&lt;br /&gt;
 0x09: STATE_FUSE_SRC_SETUP&lt;br /&gt;
 0x0A: STATE_WRITE_SETUP&lt;br /&gt;
 0x0B: STATE_WRITE_ADDR_SETUP&lt;br /&gt;
 0x0C: STATE_WRITE_PROGRAM&lt;br /&gt;
 0x0D: STATE_WRITE_ADDR_HOLD&lt;br /&gt;
 0x0E: STATE_FUSE_SRC_HOLD&lt;br /&gt;
 0x0F: STATE_READ_BEFORE_WRITE_SETUP&lt;br /&gt;
|-&lt;br /&gt;
| 21&lt;br /&gt;
| FUSE_FUSECTRL_MARGIN_READ&lt;br /&gt;
|-&lt;br /&gt;
| 22&lt;br /&gt;
| FUSE_FUSECTRL_RWL&lt;br /&gt;
|-&lt;br /&gt;
| 23&lt;br /&gt;
| FUSE_FUSECTRL_TRCS&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| FUSE_FUSECTRL_AT1&lt;br /&gt;
|-&lt;br /&gt;
| 25&lt;br /&gt;
| FUSE_FUSECTRL_AT0&lt;br /&gt;
|-&lt;br /&gt;
| 26&lt;br /&gt;
| FUSE_FUSECTRL_PD_CTRL&lt;br /&gt;
|-&lt;br /&gt;
| 30&lt;br /&gt;
| FUSE_FUSECTRL_FUSE_SENSE_DONE&lt;br /&gt;
|-&lt;br /&gt;
| 31&lt;br /&gt;
| FUSE_FUSECTRL_RECORD_SHIFT_DONE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Before fuse reading/writing the power down mode must be disabled.&lt;br /&gt;
SENSE_CTRL mode flushes programmed values into the [[Fuses#Cache_registers|cache registers]].&lt;br /&gt;
&lt;br /&gt;
==== FUSE_FUSEADDR ====&lt;br /&gt;
This register takes the address of the fuse to be read/written/sensed.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_FUSERDATA ====&lt;br /&gt;
This register receives the value read from the fuse.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_FUSEWDATA ====&lt;br /&gt;
This register takes the value to be written to the fuse.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_FUSETIME_PGM2 ====&lt;br /&gt;
This register takes the fuse programming pulse (0xC0 == 19200 kHz).&lt;br /&gt;
&lt;br /&gt;
==== FUSE_PRIV2INTFC_START ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| FUSE_PRIV2INTFC_START_DATA&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| FUSE_PRIV2INTFC_START_SKIP_RECORDS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FUSE_DISABLEREGPROGRAM ====&lt;br /&gt;
If set to 0x01, this register disables fuse programming.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_WRITE_ACCESS_SW ====&lt;br /&gt;
If set to 0x01, this register disables software writes to the fuse driver registers.&lt;br /&gt;
&lt;br /&gt;
=== Cache registers ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Name&lt;br /&gt;
!  Address&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PRODUCTION_MODE&lt;br /&gt;
| 0x7000F900&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_JTAG_SECUREID_VALID&lt;br /&gt;
| 0x7000F904&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_ODM_LOCK&lt;br /&gt;
| 0x7000F908&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_OPENGL_EN&lt;br /&gt;
| 0x7000F90C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_SKU_INFO|FUSE_SKU_INFO]]&lt;br /&gt;
| 0x7000F910&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_CPU_SPEEDO_0_CALIB&lt;br /&gt;
| 0x7000F914&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_CPU_IDDQ_CALIB&lt;br /&gt;
| 0x7000F918&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_DAC_CRT_CALIB&lt;br /&gt;
| 0x7000F91C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_DAC_HDTV_CALIB&lt;br /&gt;
| 0x7000F920&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_DAC_SDTV_CALIB&lt;br /&gt;
| 0x7000F924&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_OPT_FT_REV|FUSE_OPT_FT_REV]]&lt;br /&gt;
| 0x7000F928&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_CPU_SPEEDO_1_CALIB&lt;br /&gt;
| 0x7000F92C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_CPU_SPEEDO_2_CALIB&lt;br /&gt;
| 0x7000F930&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SOC_SPEEDO_0_CALIB&lt;br /&gt;
| 0x7000F934&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_SOC_SPEEDO_1_CALIB|FUSE_SOC_SPEEDO_1_CALIB]]&lt;br /&gt;
| 0x7000F938&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SOC_SPEEDO_2_CALIB&lt;br /&gt;
| 0x7000F93C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SOC_IDDQ_CALIB&lt;br /&gt;
| 0x7000F940&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_RESERVED_PRODUCTION_WP&lt;br /&gt;
| 0x7000F944&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_FA|FUSE_FA]]&lt;br /&gt;
| 0x7000F948&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_RESERVED_PRODUCTION&lt;br /&gt;
| 0x7000F94C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_HDMI_LANE0_CALIB&lt;br /&gt;
| 0x7000F950&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_HDMI_LANE1_CALIB&lt;br /&gt;
| 0x7000F954&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_HDMI_LANE2_CALIB&lt;br /&gt;
| 0x7000F958&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_HDMI_LANE3_CALIB&lt;br /&gt;
| 0x7000F95C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_ENCRYPTION_RATE&lt;br /&gt;
| 0x7000F960&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PUBLIC_KEY|FUSE_PUBLIC_KEY0]]&lt;br /&gt;
| 0x7000F964&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PUBLIC_KEY|FUSE_PUBLIC_KEY1]]&lt;br /&gt;
| 0x7000F968&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PUBLIC_KEY|FUSE_PUBLIC_KEY2]]&lt;br /&gt;
| 0x7000F96C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PUBLIC_KEY|FUSE_PUBLIC_KEY3]]&lt;br /&gt;
| 0x7000F970&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PUBLIC_KEY|FUSE_PUBLIC_KEY4]]&lt;br /&gt;
| 0x7000F974&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PUBLIC_KEY|FUSE_PUBLIC_KEY5]]&lt;br /&gt;
| 0x7000F978&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PUBLIC_KEY|FUSE_PUBLIC_KEY6]]&lt;br /&gt;
| 0x7000F97C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PUBLIC_KEY|FUSE_PUBLIC_KEY7]]&lt;br /&gt;
| 0x7000F980&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR1_CALIB&lt;br /&gt;
| 0x7000F984&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR2_CALIB&lt;br /&gt;
| 0x7000F988&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_VSENSOR_CALIB&lt;br /&gt;
| 0x7000F98C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_OPT_CP_REV|FUSE_OPT_CP_REV]]&lt;br /&gt;
| 0x7000F990&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_PFG&lt;br /&gt;
| 0x7000F994&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR0_CALIB&lt;br /&gt;
| 0x7000F998&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_FIRST_BOOTROM_PATCH_SIZE&lt;br /&gt;
| 0x7000F99C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SECURITY_MODE&lt;br /&gt;
| 0x7000F9A0&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIVATE_KEY|FUSE_PRIVATE_KEY0]]&lt;br /&gt;
| 0x7000F9A4&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIVATE_KEY|FUSE_PRIVATE_KEY1]]&lt;br /&gt;
| 0x7000F9A8&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIVATE_KEY|FUSE_PRIVATE_KEY2]]&lt;br /&gt;
| 0x7000F9AC&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIVATE_KEY|FUSE_PRIVATE_KEY3]]&lt;br /&gt;
| 0x7000F9B0&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PRIVATE_KEY|FUSE_PRIVATE_KEY4]]&lt;br /&gt;
| 0x7000F9B4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_ARM_JTAG_DIS&lt;br /&gt;
| 0x7000F9B8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_BOOT_DEVICE_INFO&lt;br /&gt;
| 0x7000F9BC&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_RESERVED_SW|FUSE_RESERVED_SW]]&lt;br /&gt;
| 0x7000F9C0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_VP9_DISABLE&lt;br /&gt;
| 0x7000F9C4&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_RESERVED_ODM0|FUSE_RESERVED_ODM0]]&lt;br /&gt;
| 0x7000F9C8&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_RESERVED_ODM1|FUSE_RESERVED_ODM1]]&lt;br /&gt;
| 0x7000F9CC&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_RESERVED_ODM2|FUSE_RESERVED_ODM2]]&lt;br /&gt;
| 0x7000F9D0&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_RESERVED_ODM3|FUSE_RESERVED_ODM3]]&lt;br /&gt;
| 0x7000F9D4&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_RESERVED_ODM4|FUSE_RESERVED_ODM4]]&lt;br /&gt;
| 0x7000F9D8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_RESERVED_ODM5&lt;br /&gt;
| 0x7000F9DC&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_RESERVED_ODM6|FUSE_RESERVED_ODM6]]&lt;br /&gt;
| 0x7000F9E0&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_RESERVED_ODM7|FUSE_RESERVED_ODM7]]&lt;br /&gt;
| 0x7000F9E4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OBS_DIS&lt;br /&gt;
| 0x7000F9E8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_NOR_INFO&lt;br /&gt;
| 0x7000F9EC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_USB_CALIB&lt;br /&gt;
| 0x7000F9F0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SKU_DIRECT_CONFIG&lt;br /&gt;
| 0x7000F9F4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_KFUSE_PRIVKEY_CTRL&lt;br /&gt;
| 0x7000F9F8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PACKAGE_INFO&lt;br /&gt;
| 0x7000F9FC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_VENDOR_CODE&lt;br /&gt;
| 0x7000FA00&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_FAB_CODE&lt;br /&gt;
| 0x7000FA04&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_LOT_CODE_0&lt;br /&gt;
| 0x7000FA08&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_LOT_CODE_1&lt;br /&gt;
| 0x7000FA0C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_WAFER_ID&lt;br /&gt;
| 0x7000FA10&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_X_COORDINATE&lt;br /&gt;
| 0x7000FA14&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_Y_COORDINATE&lt;br /&gt;
| 0x7000FA18&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_SEC_DEBUG_EN&lt;br /&gt;
| 0x7000FA1C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_OPS_RESERVED&lt;br /&gt;
| 0x7000FA20&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SATA_CALIB&lt;br /&gt;
| 0x7000FA24&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_GPU_IDDQ_CALIB&lt;br /&gt;
| 0x7000FA28&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR3_CALIB&lt;br /&gt;
| 0x7000FA2C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SKU_BOND_OUT_L&lt;br /&gt;
| 0x7000FA30&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SKU_BOND_OUT_H&lt;br /&gt;
| 0x7000FA34&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SKU_BOND_OUT_U&lt;br /&gt;
| 0x7000FA38&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SKU_BOND_OUT_V&lt;br /&gt;
| 0x7000FA3C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SKU_BOND_OUT_W&lt;br /&gt;
| 0x7000FA40&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_SAMPLE_TYPE&lt;br /&gt;
| 0x7000FA44&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_SUBREVISION&lt;br /&gt;
| 0x7000FA48&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_SW_RESERVED_0&lt;br /&gt;
| 0x7000FA4C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_SW_RESERVED_1&lt;br /&gt;
| 0x7000FA50&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR4_CALIB&lt;br /&gt;
| 0x7000FA54&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR5_CALIB&lt;br /&gt;
| 0x7000FA58&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR6_CALIB&lt;br /&gt;
| 0x7000FA5C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR7_CALIB&lt;br /&gt;
| 0x7000FA60&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_PRIV_SEC_EN&lt;br /&gt;
| 0x7000FA64&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_PKC_DISABLE|FUSE_PKC_DISABLE]]&lt;br /&gt;
| 0x7000FA68&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_FUSE2TSEC_DEBUG_DISABLE&lt;br /&gt;
| 0x7000FA7C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR_COMMON&lt;br /&gt;
| 0x7000FA80&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_CP_BIN&lt;br /&gt;
| 0x7000FA84&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_DISABLE&lt;br /&gt;
| 0x7000FA88&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_FT_BIN&lt;br /&gt;
| 0x7000FA8C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_DONE_MAP&lt;br /&gt;
| 0x7000FA90&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_APB2JTAG_DISABLE&lt;br /&gt;
| 0x7000FA98&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_ODM_INFO&lt;br /&gt;
| 0x7000FA9C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_ARM_CRYPT_DE_FEATURE&lt;br /&gt;
| 0x7000FAA8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_WOA_SKU_FLAG&lt;br /&gt;
| 0x7000FAC0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_ECO_RESERVE_1&lt;br /&gt;
| 0x7000FAC4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_GCPLEX_CONFIG_FUSE&lt;br /&gt;
| 0x7000FAC8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PRODUCTION_MONTH&lt;br /&gt;
| 0x7000FACC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_RAM_REPAIR_INDICATOR&lt;br /&gt;
| 0x7000FAD0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR9_CALIB&lt;br /&gt;
| 0x7000FAD4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_VMIN_CALIBRATION&lt;br /&gt;
| 0x7000FADC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_AGING_SENSOR_CALIBRATION&lt;br /&gt;
| 0x7000FAE0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_DEBUG_AUTHENTICATION&lt;br /&gt;
| 0x7000FAE4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SECURE_PROVISION_INDEX&lt;br /&gt;
| 0x7000FAE8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SECURE_PROVISION_INFO&lt;br /&gt;
| 0x7000FAEC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_DISABLE_CP1&lt;br /&gt;
| 0x7000FAF0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_ENDIS&lt;br /&gt;
| 0x7000FAF4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_ECO_RESERVE_0&lt;br /&gt;
| 0x7000FAF8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_REALIGNMENT_REG_OLD&lt;br /&gt;
| 0x7000FAFC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_RESERVED_CALIB0&lt;br /&gt;
| 0x7000FB04&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_RESERVED_CALIB1&lt;br /&gt;
| 0x7000FB08&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_TPC0_DISABLE&lt;br /&gt;
| 0x7000FB0C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_TPC0_DISABLE_CP1&lt;br /&gt;
| 0x7000FB10&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_CPU_DISABLE&lt;br /&gt;
| 0x7000FB14&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_CPU_DISABLE_CP1&lt;br /&gt;
| 0x7000FB18&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR10_CALIB&lt;br /&gt;
| 0x7000FB1C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_TSENSOR10_CALIB_AUX&lt;br /&gt;
| 0x7000FB20&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_RAM_SVOP_DP&lt;br /&gt;
| 0x7000FB24&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_RAM_SVOP_PDP&lt;br /&gt;
| 0x7000FB28&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_RAM_SVOP_REG&lt;br /&gt;
| 0x7000FB2C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_RAM_SVOP_SP&lt;br /&gt;
| 0x7000FB30&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_RAM_SVOP_SMPDP&lt;br /&gt;
| 0x7000FB34&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_TPC0_DISABLE_CP2&lt;br /&gt;
| 0x7000FB38&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_TPC1_DISABLE&lt;br /&gt;
| 0x7000FB3C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_TPC1_DISABLE_CP1&lt;br /&gt;
| 0x7000FB40&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_TPC1_DISABLE_CP2&lt;br /&gt;
| 0x7000FB44&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_CPU_DISABLE_CP2&lt;br /&gt;
| 0x7000FB48&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_GPU_DISABLE_CP2&lt;br /&gt;
| 0x7000FB4C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_USB_CALIB_EXT&lt;br /&gt;
| 0x7000FB50&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_RESERVED_FIELD&lt;br /&gt;
| 0x7000FB54&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_OPT_ECC_EN&lt;br /&gt;
| 0x7000FB58&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_REALIGNMENT_REG&lt;br /&gt;
| 0x7000FB7C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_0&lt;br /&gt;
| 0x7000FB80&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_1&lt;br /&gt;
| 0x7000FB84&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_SPARE_BIT_2|FUSE_SPARE_BIT_2]]&lt;br /&gt;
| 0x7000FB88&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_SPARE_BIT_3|FUSE_SPARE_BIT_3]]&lt;br /&gt;
| 0x7000FB8C&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_SPARE_BIT_4|FUSE_SPARE_BIT_4]]&lt;br /&gt;
| 0x7000FB90&lt;br /&gt;
|-&lt;br /&gt;
| [[#FUSE_SPARE_BIT_5|FUSE_SPARE_BIT_5]]&lt;br /&gt;
| 0x7000FB94&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_6&lt;br /&gt;
| 0x7000FB98&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_7&lt;br /&gt;
| 0x7000FB9C&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_8&lt;br /&gt;
| 0x7000FBA0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_9&lt;br /&gt;
| 0x7000FBA4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_10&lt;br /&gt;
| 0x7000FBA8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_11&lt;br /&gt;
| 0x7000FBAC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_12&lt;br /&gt;
| 0x7000FBB0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_13&lt;br /&gt;
| 0x7000FBB4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_14&lt;br /&gt;
| 0x7000FBB8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_15&lt;br /&gt;
| 0x7000FBBC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_16&lt;br /&gt;
| 0x7000FBC0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_17&lt;br /&gt;
| 0x7000FBC4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_18&lt;br /&gt;
| 0x7000FBC8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_19&lt;br /&gt;
| 0x7000FBCC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_20&lt;br /&gt;
| 0x7000FBD0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_21&lt;br /&gt;
| 0x7000FBD4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_22&lt;br /&gt;
| 0x7000FBD8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_23&lt;br /&gt;
| 0x7000FBDC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_24&lt;br /&gt;
| 0x7000FBE0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_25&lt;br /&gt;
| 0x7000FBE4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_26&lt;br /&gt;
| 0x7000FBE8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_27&lt;br /&gt;
| 0x7000FBEC&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_28&lt;br /&gt;
| 0x7000FBF0&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_29&lt;br /&gt;
| 0x7000FBF4&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_30&lt;br /&gt;
| 0x7000FBF8&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_SPARE_BIT_31&lt;br /&gt;
| 0x7000FBFC&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== FUSE_SKU_INFO ====&lt;br /&gt;
Stores the SKU ID (must be 0x83).&lt;br /&gt;
&lt;br /&gt;
==== FUSE_OPT_FT_REV ====&lt;br /&gt;
Stores the FT (Final Test) revision.&lt;br /&gt;
&lt;br /&gt;
Original launch units have this value set to 0xA0 (revision 5.0). The first batch of patched units have this value set to 0xC0 (revision 6.0). The second batch of patched units have this value set to 0xE0 (revision 7.0)&lt;br /&gt;
&lt;br /&gt;
==== FUSE_FA ====&lt;br /&gt;
Stores failure analysis mode.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_SOC_SPEEDO_1_CALIB ====&lt;br /&gt;
Stores the bootrom patch version.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_RESERVED_ODM0 ====&lt;br /&gt;
This stores an hardware ID.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_RESERVED_ODM1 ====&lt;br /&gt;
This stores an hardware ID.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_RESERVED_ODM2 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-4&lt;br /&gt;
| [5.0.0+] Used as key generation (patched units only)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This stores an hardware ID in original launch units, but in patched units it stores a single value (key generation).&lt;br /&gt;
&lt;br /&gt;
==== FUSE_RESERVED_ODM3 ====&lt;br /&gt;
This stores an hardware ID in original launch units, but in patched units it&#039;s empty.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_RESERVED_ODM4 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-1&lt;br /&gt;
| Unit type (0x00 = Retail, 0x03 = Debug)&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Production flag (0x00 = Prototype, 0x01 = Production)&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0-3.0.2] 3-5&lt;br /&gt;
[4.0.0+] 3-7&lt;br /&gt;
| DRAM ID&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Development flag (0x00 = Retail, 0x01 = Development)&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Unit type flag (0x00 = Debug, 0x01 = Retail)&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| [3.0.0+] Kiosk flag (0x00 = Retail, 0x01 = Kiosk/Quest)&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| [5.0.0+] Patch flag (0x00 = Unpatched, 1 = Patched)&lt;br /&gt;
|-&lt;br /&gt;
| 16-19&lt;br /&gt;
| [4.0.0+] New hardware type (0x00 = Icosa, 0x01 = Iowa, 0x02 = Hoag)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This stores some device configuration parameters.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_RESERVED_ODM6 ====&lt;br /&gt;
This register returns the value programmed into fuse [[#reserved_odm6|reserved_odm6]].&lt;br /&gt;
&lt;br /&gt;
==== FUSE_RESERVED_ODM7 ====&lt;br /&gt;
This register returns the value programmed into fuse [[#reserved_odm7|reserved_odm7]].&lt;br /&gt;
&lt;br /&gt;
==== FUSE_PUBLIC_KEY ====&lt;br /&gt;
This stores the SHA256 hash of the 2048-bit RSA key expected at BCT+0x210.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_OPT_CP_REV ====&lt;br /&gt;
Stores the CP (Chip Probing) revision.&lt;br /&gt;
&lt;br /&gt;
Original launch units have this value set to 0xA0 (revision 5.0). Patched units have this value set to 0x103 (revision 8.3).&lt;br /&gt;
&lt;br /&gt;
==== FUSE_PRIVATE_KEY ====&lt;br /&gt;
This stores the 160-bit private key (128 bit SBK + 32-bit device key).&lt;br /&gt;
Reads to these registers after the SBK is locked out produce all-FF output.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_RESERVED_SW ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Bits&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-2&lt;br /&gt;
| Boot device&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Skip device selection straps (0 = don&#039;t skip; 1 = skip)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ENABLE_CHARGER_DETECT&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| ENABLE_WATCHDOG&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Forced RCM two button mode (0 = Only VOLUME_UP; 1 = VOLUME_UP + HOME)&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| RCM USB controller mode (0 = USB 2.0; 1 = XUSB)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This caches the value of the reserved_sw fuse from the hardware bitmap.&lt;br /&gt;
&lt;br /&gt;
Original launch units have the RCM USB controller mode set to USB 2.0, while the first batch of patched units have the RCM USB controller mode set to XUSB.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_PKC_DISABLE ====&lt;br /&gt;
This caches the value of the pkc_disable fuse from the hardware bitmap.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_SPARE_BIT_2 ====&lt;br /&gt;
Stores part of the speedo fusing revision.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_SPARE_BIT_3 ====&lt;br /&gt;
Stores part of the speedo fusing revision.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_SPARE_BIT_4 ====&lt;br /&gt;
Stores part of the speedo fusing revision.&lt;br /&gt;
&lt;br /&gt;
==== FUSE_SPARE_BIT_5 ====&lt;br /&gt;
Must be non-zero on retail units, otherwise the first bootloader panics.&lt;br /&gt;
On prototype units it can be zero, which tells the bootloader to choose from two pre-production master key seeds. If set to non-zero on a prototype unit, it tells the bootloader to choose from two master key seeds (with the second one being the same as the retail master key seed).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] This value is no longer used during boot.&lt;br /&gt;
&lt;br /&gt;
== Bitmap ==&lt;br /&gt;
The actual hardware fuses are stored in a bitmap and may be programmed through the fuse driver after enabling fuse programming.&lt;br /&gt;
&lt;br /&gt;
Fuse numbers are relative to the start of the fuse bitmap where each element is a 4 byte word and has a redundant alias. A single fuse write operation must always write the same value to &#039;&#039;&#039;fuse_bitmap + ((fuse_number + 0) &amp;lt;&amp;lt; 2)&#039;&#039;&#039; (PRIMARY_ALIAS) and &#039;&#039;&#039;fuse_bitmap + ((fuse_number + 1) &amp;lt;&amp;lt; 2)&#039;&#039;&#039; (REDUNDANT_ALIAS). However, after offset 0x180 in the fuse bitmap, fuses no longer have a redundant alias.&lt;br /&gt;
&lt;br /&gt;
Below is a list of common fuses used by Tegra devices (and applicable to the Switch).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Name&lt;br /&gt;
!  Number&lt;br /&gt;
!  Redundant number&lt;br /&gt;
!  Bits&lt;br /&gt;
|-&lt;br /&gt;
| enable_fuse_program&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| disable_fuse_program&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| bypass_fuses&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| jtag_direct_access_disable&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| production_mode&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| jtag_secureid_valid&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| odm_lock&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 6-9&lt;br /&gt;
|-&lt;br /&gt;
| fa_mode&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| security_mode&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
| arm_debug_dis&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| obs_dis&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 13&lt;br /&gt;
|-&lt;br /&gt;
| public_key0&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 30-31&lt;br /&gt;
|-&lt;br /&gt;
| public_key0&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 0-29&lt;br /&gt;
|-&lt;br /&gt;
| public_key1&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 30-31&lt;br /&gt;
|-&lt;br /&gt;
| public_key1&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| 0-29&lt;br /&gt;
|-&lt;br /&gt;
| public_key2&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| 30-31&lt;br /&gt;
|-&lt;br /&gt;
| public_key2&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 0-29&lt;br /&gt;
|-&lt;br /&gt;
| public_key3&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 30-31&lt;br /&gt;
|-&lt;br /&gt;
| public_key3&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 0-29&lt;br /&gt;
|-&lt;br /&gt;
| public_key4&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 30-31&lt;br /&gt;
|-&lt;br /&gt;
| public_key4&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 0-29&lt;br /&gt;
|-&lt;br /&gt;
| public_key5&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 30-31&lt;br /&gt;
|-&lt;br /&gt;
| public_key5&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 0-29&lt;br /&gt;
|-&lt;br /&gt;
| public_key6&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 30-31&lt;br /&gt;
|-&lt;br /&gt;
| public_key6&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 0-29&lt;br /&gt;
|-&lt;br /&gt;
| public_key7&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 30-31&lt;br /&gt;
|-&lt;br /&gt;
| public_key7&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 0-29&lt;br /&gt;
|-&lt;br /&gt;
| private_key0&lt;br /&gt;
| 34&lt;br /&gt;
| 35&lt;br /&gt;
| 12-31&lt;br /&gt;
|-&lt;br /&gt;
| private_key0&lt;br /&gt;
| 36&lt;br /&gt;
| 37&lt;br /&gt;
| 0-11&lt;br /&gt;
|-&lt;br /&gt;
| private_key1&lt;br /&gt;
| 36&lt;br /&gt;
| 37&lt;br /&gt;
| 12-31&lt;br /&gt;
|-&lt;br /&gt;
| private_key1&lt;br /&gt;
| 38&lt;br /&gt;
| 39&lt;br /&gt;
| 0-11&lt;br /&gt;
|-&lt;br /&gt;
| private_key2&lt;br /&gt;
| 38&lt;br /&gt;
| 39&lt;br /&gt;
| 12-31&lt;br /&gt;
|-&lt;br /&gt;
| private_key2&lt;br /&gt;
| 40&lt;br /&gt;
| 41&lt;br /&gt;
| 0-11&lt;br /&gt;
|-&lt;br /&gt;
| private_key3&lt;br /&gt;
| 40&lt;br /&gt;
| 41&lt;br /&gt;
| 12-31&lt;br /&gt;
|-&lt;br /&gt;
| private_key3&lt;br /&gt;
| 42&lt;br /&gt;
| 43&lt;br /&gt;
| 0-11&lt;br /&gt;
|-&lt;br /&gt;
| private_key4&lt;br /&gt;
| 42&lt;br /&gt;
| 43&lt;br /&gt;
| 12-31&lt;br /&gt;
|-&lt;br /&gt;
| private_key4&lt;br /&gt;
| 44&lt;br /&gt;
| 45&lt;br /&gt;
| 0-11&lt;br /&gt;
|-&lt;br /&gt;
| boot_device_info&lt;br /&gt;
| 44&lt;br /&gt;
| 45&lt;br /&gt;
| 12-27&lt;br /&gt;
|-&lt;br /&gt;
| reserved_sw&lt;br /&gt;
| 44&lt;br /&gt;
| 45&lt;br /&gt;
| 28-31&lt;br /&gt;
|-&lt;br /&gt;
| reserved_sw&lt;br /&gt;
| 46&lt;br /&gt;
| 47&lt;br /&gt;
| 0-3&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm0&lt;br /&gt;
| 46&lt;br /&gt;
| 47&lt;br /&gt;
| 5-31&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm0&lt;br /&gt;
| 48&lt;br /&gt;
| 49&lt;br /&gt;
| 0-4&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm1&lt;br /&gt;
| 48&lt;br /&gt;
| 49&lt;br /&gt;
| 5-31&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm1&lt;br /&gt;
| 50&lt;br /&gt;
| 51&lt;br /&gt;
| 0-4&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm2&lt;br /&gt;
| 50&lt;br /&gt;
| 51&lt;br /&gt;
| 5-31&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm2&lt;br /&gt;
| 52&lt;br /&gt;
| 53&lt;br /&gt;
| 0-4&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm3&lt;br /&gt;
| 52&lt;br /&gt;
| 53&lt;br /&gt;
| 5-31&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm3&lt;br /&gt;
| 54&lt;br /&gt;
| 55&lt;br /&gt;
| 0-4&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm4&lt;br /&gt;
| 54&lt;br /&gt;
| 55&lt;br /&gt;
| 5-31&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm4&lt;br /&gt;
| 56&lt;br /&gt;
| 57&lt;br /&gt;
| 0-4&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm5&lt;br /&gt;
| 56&lt;br /&gt;
| 57&lt;br /&gt;
| 5-31&lt;br /&gt;
|-&lt;br /&gt;
| reserved_odm5&lt;br /&gt;
| 58&lt;br /&gt;
| 59&lt;br /&gt;
| 0-4&lt;br /&gt;
|-&lt;br /&gt;
| [[#reserved_odm6|reserved_odm6]]&lt;br /&gt;
| 58&lt;br /&gt;
| 59&lt;br /&gt;
| 5-31&lt;br /&gt;
|-&lt;br /&gt;
| [[#reserved_odm6|reserved_odm6]]&lt;br /&gt;
| 60&lt;br /&gt;
| 61&lt;br /&gt;
| 0-4&lt;br /&gt;
|-&lt;br /&gt;
| [[#reserved_odm7|reserved_odm7]]&lt;br /&gt;
| 60&lt;br /&gt;
| 61&lt;br /&gt;
| 5-31&lt;br /&gt;
|-&lt;br /&gt;
| [[#reserved_odm7|reserved_odm7]]&lt;br /&gt;
| 62&lt;br /&gt;
| 63&lt;br /&gt;
| 0-4&lt;br /&gt;
|-&lt;br /&gt;
| kfuse_privkey_ctrl&lt;br /&gt;
| 64&lt;br /&gt;
| 65&lt;br /&gt;
| 13-14&lt;br /&gt;
|-&lt;br /&gt;
| package_info&lt;br /&gt;
| 64&lt;br /&gt;
| 65&lt;br /&gt;
| 15-18&lt;br /&gt;
|-&lt;br /&gt;
| opt_vendor_code&lt;br /&gt;
| 64&lt;br /&gt;
| 65&lt;br /&gt;
| 19-22&lt;br /&gt;
|-&lt;br /&gt;
| opt_fab_code&lt;br /&gt;
| 64&lt;br /&gt;
| 65&lt;br /&gt;
| 23-28&lt;br /&gt;
|-&lt;br /&gt;
| opt_lot_code_0&lt;br /&gt;
| 64&lt;br /&gt;
| 65&lt;br /&gt;
| 29-31&lt;br /&gt;
|-&lt;br /&gt;
| opt_lot_code_0&lt;br /&gt;
| 66&lt;br /&gt;
| 67&lt;br /&gt;
| 0-28&lt;br /&gt;
|-&lt;br /&gt;
| opt_lot_code_1&lt;br /&gt;
| 66&lt;br /&gt;
| 67&lt;br /&gt;
| 29-31&lt;br /&gt;
|-&lt;br /&gt;
| opt_lot_code_1&lt;br /&gt;
| 68&lt;br /&gt;
| 69&lt;br /&gt;
| 0-24&lt;br /&gt;
|-&lt;br /&gt;
| opt_wafer_id&lt;br /&gt;
| 68&lt;br /&gt;
| 69&lt;br /&gt;
| 25-30&lt;br /&gt;
|-&lt;br /&gt;
| opt_x_coordinate&lt;br /&gt;
| 68&lt;br /&gt;
| 69&lt;br /&gt;
| 31&lt;br /&gt;
|-&lt;br /&gt;
| opt_x_coordinate&lt;br /&gt;
| 70&lt;br /&gt;
| 71&lt;br /&gt;
| 0-7&lt;br /&gt;
|-&lt;br /&gt;
| opt_y_coordinate&lt;br /&gt;
| 70&lt;br /&gt;
| 71&lt;br /&gt;
| 8-16&lt;br /&gt;
|-&lt;br /&gt;
| opt_sec_debug_en&lt;br /&gt;
| 70&lt;br /&gt;
| 71&lt;br /&gt;
| 17&lt;br /&gt;
|-&lt;br /&gt;
| opt_ops_reserved&lt;br /&gt;
| 70&lt;br /&gt;
| 71&lt;br /&gt;
| 18-23&lt;br /&gt;
|-&lt;br /&gt;
| sata_calib&lt;br /&gt;
| 70&lt;br /&gt;
| 71&lt;br /&gt;
| 24-25&lt;br /&gt;
|-&lt;br /&gt;
| opt_priv_sec_en&lt;br /&gt;
| 90&lt;br /&gt;
| 91&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| pkc_disable&lt;br /&gt;
| 90&lt;br /&gt;
| 91&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| fuse2tsec_debug_disable&lt;br /&gt;
| 90&lt;br /&gt;
| 91&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| secure_provision_index&lt;br /&gt;
| 90&lt;br /&gt;
| 91&lt;br /&gt;
| 24-27&lt;br /&gt;
|-&lt;br /&gt;
| secure_provision_info&lt;br /&gt;
| 90&lt;br /&gt;
| 91&lt;br /&gt;
| 28-29&lt;br /&gt;
|-&lt;br /&gt;
| aid&lt;br /&gt;
| 103&lt;br /&gt;
| None&lt;br /&gt;
| 0-31&lt;br /&gt;
|-&lt;br /&gt;
| [[#irom_patch|irom_patch]]&lt;br /&gt;
| 114&lt;br /&gt;
| None&lt;br /&gt;
| Variable&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== reserved_odm6 ===&lt;br /&gt;
Used for anti-downgrade control.&lt;br /&gt;
&lt;br /&gt;
=== reserved_odm7 ===&lt;br /&gt;
Used for anti-downgrade control.&lt;br /&gt;
&lt;br /&gt;
=== irom_patch ===&lt;br /&gt;
Tegra210 based hardware such as the Switch provides support for bootrom patches. The patch data is burned to the hardware fuse bitmap using a specific format (see [https://gist.github.com/shuffle2/f8728159da100e9df2606d43925de0af shuffle2&#039;s ipatch decoder]). The bootrom reads these fuses in order to initialize the IPATCH hardware, which allows overriding data returned for code and data fetches done by BPMP.&lt;br /&gt;
&lt;br /&gt;
The following represents the patch data dumped from a Switch console:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
RAM:00000000 ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:00000000&lt;br /&gt;
RAM:00000000&lt;br /&gt;
RAM:00000000 irom_svc_dispatch&lt;br /&gt;
RAM:00000000   STMFD   SP!, {R0-R2}                  ; ipatches (new):&lt;br /&gt;
RAM:00000000                                         ;  0  b57df00     16ae     df00 : svc #0x00 (offset 0x48)&lt;br /&gt;
RAM:00000000                                         ;  1 1820df22     3040     df22 : svc #0x22 (offset 0x8c)&lt;br /&gt;
RAM:00000000                                         ;  2 3797df26     6f2e     df26 : svc #0x26 (offset 0x94)&lt;br /&gt;
RAM:00000000                                         ;  3 3b4d2100     769a     2100 : movs r1, #0x00&lt;br /&gt;
RAM:00000000                                         ;  4  42bdf2c      856     df2c : svc #0x2c (offset 0xa0)&lt;br /&gt;
RAM:00000000                                         ;  5 37aadf42     6f54     df42 : svc #0x42 (offset 0xcc)&lt;br /&gt;
RAM:00000000                                         ;  6  972df4b     12e4     df4b : svc #0x4b (offset 0xde)&lt;br /&gt;
RAM:00000000                                         ;  7 2293df54     4526     df54 : svc #0x54 (offset 0xf0)&lt;br /&gt;
RAM:00000000                                         ;  8 21fadf5d     43f4     df5d : svc #0x5d (offset 0x102)&lt;br /&gt;
RAM:00000000                                         ;  9 bba2ac57    17744     ac57 : data&lt;br /&gt;
RAM:00000000                                         ; 10 bbac3d19    17758     3d19 : data&lt;br /&gt;
RAM:00000000                                         ; 11 1e952001     3d2a     2001 : movs r0, #0x01&lt;br /&gt;
RAM:00000000                                         ; &lt;br /&gt;
RAM:00000000                                         ; ipatches (old):&lt;br /&gt;
RAM:00000000                                         ;  0  b57df00     16ae     df00 : svc #0x00 (offset 0x48)&lt;br /&gt;
RAM:00000000                                         ;  1 1820df22     3040     df22 : svc #0x22 (offset 0x8c)&lt;br /&gt;
RAM:00000000                                         ;  2 3797df26     6f2e     df26 : svc #0x26 (offset 0x94)&lt;br /&gt;
RAM:00000000                                         ;  3 7d9e2000     fb3c     2000 : movs r0, #0x00&lt;br /&gt;
RAM:00000000                                         ;  4  42bdf2c      856     df2c : svc #0x2c (offset 0xa0)&lt;br /&gt;
RAM:00000000                                         ;  5 37aadf42     6f54     df42 : svc #0x42 (offset 0xcc)&lt;br /&gt;
RAM:00000000                                         ;  6  972df4b     12e4     df4b : svc #0x4b (offset 0xde)&lt;br /&gt;
RAM:00000000                                         ;  7 2293df54     4526     df54 : svc #0x54 (offset 0xf0)&lt;br /&gt;
RAM:00000000                                         ;  8 21fadf5d     43f4     df5d : svc #0x5d (offset 0x102)&lt;br /&gt;
RAM:00000000                                         ;  9 bba2ac57    17744     ac57 : data&lt;br /&gt;
RAM:00000000                                         ; 10 bbac3d19    17758     3d19 : data&lt;br /&gt;
RAM:00000000                                         ; 11 1e952001     3d2a     2001 : movs r0, #0x01&lt;br /&gt;
RAM:00000004   MOV     R2, LR&lt;br /&gt;
RAM:00000008   SUB     R2, R2, #2&lt;br /&gt;
RAM:0000000C   LDR     R2, [R2]&lt;br /&gt;
RAM:00000010   AND     R2, R2, #0xFF&lt;br /&gt;
RAM:00000014   MOV     R2, R2,LSL#1&lt;br /&gt;
RAM:00000018   LDR     R0, =0x1007B0&lt;br /&gt;
RAM:0000001C   LDR     R1, =0x1007F8&lt;br /&gt;
RAM:00000020   SUB     R1, R1, R0&lt;br /&gt;
RAM:00000024   LDR     R0, =0x40004C30&lt;br /&gt;
RAM:00000028   ADD     R0, R0, R1&lt;br /&gt;
RAM:0000002C   ADD     R2, R2, R0&lt;br /&gt;
RAM:00000030   ORR     R2, R2, #1&lt;br /&gt;
RAM:00000034   LDMFD   SP!, {R0,R1}&lt;br /&gt;
RAM:00000038   BX      R2&lt;br /&gt;
RAM:00000038 ; End of function irom_svc_dispatch&lt;br /&gt;
RAM:00000038&lt;br /&gt;
RAM:00000038 ; ---------------------------------------------------------------------------&lt;br /&gt;
RAM:0000003C dword_3C DCD 0x1007B0                   ; DATA XREF: irom_svc_dispatch+18↑r&lt;br /&gt;
RAM:00000040 dword_40 DCD 0x1007F8                   ; DATA XREF: irom_svc_dispatch+1C↑r&lt;br /&gt;
RAM:00000044 dword_44 DCD 0x40004C30                 ; DATA XREF: irom_svc_dispatch+24↑r&lt;br /&gt;
RAM:00000048   CODE16&lt;br /&gt;
RAM:00000048&lt;br /&gt;
RAM:00000048 ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:00000048&lt;br /&gt;
RAM:00000048&lt;br /&gt;
RAM:00000048 sub_48&lt;br /&gt;
RAM:00000048   MOVS    R2, #0                        ; 0  b57df00     16ae     df00 : svc #0x00 (offset 0x48)&lt;br /&gt;
RAM:0000004A   MVNS    R2, R2&lt;br /&gt;
RAM:0000004C   LDR     R1, =0x60006410&lt;br /&gt;
RAM:0000004E   STR     R2, [R1,#0x30]&lt;br /&gt;
RAM:00000050   STR     R2, [R1,#0x38]&lt;br /&gt;
RAM:00000052   LDR     R1, =0x600060F8&lt;br /&gt;
RAM:00000054   STR     R2, [R1]&lt;br /&gt;
RAM:00000056   STR     R2, [R1,#4]&lt;br /&gt;
RAM:00000058   LDR     R1, =0x60006284&lt;br /&gt;
RAM:0000005A   STR     R2, [R1]&lt;br /&gt;
RAM:0000005C   STR     R2, [R1,#0x18]&lt;br /&gt;
RAM:0000005E   ADDS    R1, #0x80&lt;br /&gt;
RAM:00000060   ADDS    R1, #0x1C&lt;br /&gt;
RAM:00000062   STR     R2, [R1]&lt;br /&gt;
RAM:00000064   STR     R2, [R1,#8]&lt;br /&gt;
RAM:00000066   STR     R2, [R1,#0x10]&lt;br /&gt;
RAM:00000068   ADDS    R1, #0x80&lt;br /&gt;
RAM:0000006A   STR     R2, [R1]&lt;br /&gt;
RAM:0000006C   STR     R2, [R1,#4]&lt;br /&gt;
RAM:0000006E   LDR     R1, =0x60006554&lt;br /&gt;
RAM:00000070   STR     R2, [R1]&lt;br /&gt;
RAM:00000072   MOVS    R2, #0xA0000000&lt;br /&gt;
RAM:00000076   LDR     R1, =0x60006148&lt;br /&gt;
RAM:00000078   STR     R2, [R1]&lt;br /&gt;
RAM:0000007A   ADDS    R1, #0x38 ; &#039;8&#039;&lt;br /&gt;
RAM:0000007C   STR     R2, [R1]&lt;br /&gt;
RAM:0000007E   MOVS    R2, #0xE0000000&lt;br /&gt;
RAM:00000082   LDR     R1, =0x600066A0&lt;br /&gt;
RAM:00000084   STR     R2, [R1]&lt;br /&gt;
RAM:00000086   MOVS    R1, #0&lt;br /&gt;
RAM:00000088   MOVS    R0, #0xE&lt;br /&gt;
RAM:0000008A   B       pop_r2_mov_pc_lr&lt;br /&gt;
RAM:0000008A ; End of function sub_48&lt;br /&gt;
RAM:0000008A&lt;br /&gt;
RAM:0000008C&lt;br /&gt;
RAM:0000008C ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:0000008C&lt;br /&gt;
RAM:0000008C&lt;br /&gt;
RAM:0000008C sub_8C&lt;br /&gt;
RAM:0000008C   LDR     R0, [R1,#0x18]                ; 1 1820df22     3040     df22 : svc #0x22 (offset 0x8c)&lt;br /&gt;
RAM:0000008E   MOVS    R2, #1&lt;br /&gt;
RAM:00000090   ORRS    R0, R2&lt;br /&gt;
RAM:00000092   B       pop_r2_mov_pc_lr&lt;br /&gt;
RAM:00000092 ; End of function sub_8C&lt;br /&gt;
RAM:00000092&lt;br /&gt;
RAM:00000094&lt;br /&gt;
RAM:00000094 ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:00000094&lt;br /&gt;
RAM:00000094&lt;br /&gt;
RAM:00000094 sub_94&lt;br /&gt;
RAM:00000094   LDR     R2, [R4,#0x50]                ; 2 3797df26     6f2e     df26 : svc #0x26 (offset 0x94)&lt;br /&gt;
RAM:00000096   ADDS    R2, R2, #2&lt;br /&gt;
RAM:00000098   STR     R2, [R4,#0x50]&lt;br /&gt;
RAM:0000009A   SUBS    R1, #0x80&lt;br /&gt;
RAM:0000009C   STR     R1, [R4,#0x34]&lt;br /&gt;
RAM:0000009E   B       pop_r2_mov_pc_lr&lt;br /&gt;
RAM:0000009E ; End of function sub_94&lt;br /&gt;
RAM:0000009E&lt;br /&gt;
RAM:000000A0&lt;br /&gt;
RAM:000000A0 ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:000000A0&lt;br /&gt;
RAM:000000A0&lt;br /&gt;
RAM:000000A0 sub_A0&lt;br /&gt;
RAM:000000A0&lt;br /&gt;
RAM:000000A0 ; FUNCTION CHUNK AT RAM:00000148 SIZE 00000004 BYTES&lt;br /&gt;
RAM:000000A0&lt;br /&gt;
RAM:000000A0   MOVS    R0, #0x70000000               ; 4  42bdf2c      856     df2c : svc #0x2c (offset 0xa0)&lt;br /&gt;
RAM:000000A4   LDR     R6, =dword_7000EF14&lt;br /&gt;
RAM:000000A6   LDR     R2, =dword_7000E5B4&lt;br /&gt;
RAM:000000A8   LDR     R2, [R2]&lt;br /&gt;
RAM:000000AA   CMP     R2, #0&lt;br /&gt;
RAM:000000AC   BEQ     loc_B4&lt;br /&gt;
RAM:000000AE   LDR     R2, [R6]&lt;br /&gt;
RAM:000000B0   STR     R2, [R0,#8]&lt;br /&gt;
RAM:000000B2   B       loc_BC&lt;br /&gt;
RAM:000000B4 ; ---------------------------------------------------------------------------&lt;br /&gt;
RAM:000000B4&lt;br /&gt;
RAM:000000B4 loc_B4                                  ; CODE XREF: sub_A0+C↑j&lt;br /&gt;
RAM:000000B4   LDR     R2, [R0,#8]&lt;br /&gt;
RAM:000000B6   LSRS    R0, R0, #0x12&lt;br /&gt;
RAM:000000B8   ORRS    R2, R0&lt;br /&gt;
RAM:000000BA   STR     R2, [R6]&lt;br /&gt;
RAM:000000BC&lt;br /&gt;
RAM:000000BC loc_BC                                  ; CODE XREF: sub_A0+12↑j&lt;br /&gt;
RAM:000000BC   LDR     R6, =dword_7000E9C0&lt;br /&gt;
RAM:000000BE   LDR     R0, [R6]&lt;br /&gt;
RAM:000000C0   MOVS    R2, #0x4000&lt;br /&gt;
RAM:000000C4   ORRS    R2, R0&lt;br /&gt;
RAM:000000C6   STR     R2, [R6]&lt;br /&gt;
RAM:000000C8   LDR     R0, [R5,#0x10]&lt;br /&gt;
RAM:000000CA   B       pop_r2_mov_pc_lr&lt;br /&gt;
RAM:000000CA ; End of function sub_A0&lt;br /&gt;
RAM:000000CA&lt;br /&gt;
RAM:000000CC&lt;br /&gt;
RAM:000000CC ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:000000CC&lt;br /&gt;
RAM:000000CC&lt;br /&gt;
RAM:000000CC sub_CC&lt;br /&gt;
RAM:000000CC   MOVS    R2, #0xF000000                ; 5 37aadf42     6f54     df42 : svc #0x42 (offset 0xcc)&lt;br /&gt;
RAM:000000D0   BICS    R1, R2&lt;br /&gt;
RAM:000000D2   STR     R1, [R4,#0x10]&lt;br /&gt;
RAM:000000D4   LDR     R1, [R4,#0x50]&lt;br /&gt;
RAM:000000D6   MOVS    R2, #7&lt;br /&gt;
RAM:000000D8   BICS    R1, R2&lt;br /&gt;
RAM:000000DA   STR     R1, [R4,#0x50]&lt;br /&gt;
RAM:000000DC   B       pop_r2_mov_pc_lr&lt;br /&gt;
RAM:000000DC ; End of function sub_CC&lt;br /&gt;
RAM:000000DC&lt;br /&gt;
RAM:000000DE&lt;br /&gt;
RAM:000000DE ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:000000DE&lt;br /&gt;
RAM:000000DE&lt;br /&gt;
RAM:000000DE sub_DE&lt;br /&gt;
RAM:000000DE   LDR     R2, =dword_7000FA9C           ; 6  972df4b     12e4     df4b : svc #0x4b (offset 0xde)&lt;br /&gt;
RAM:000000E0   LDR     R2, [R2]&lt;br /&gt;
RAM:000000E2   LSRS    R2, R2, #8&lt;br /&gt;
RAM:000000E4   LSLS    R2, R2, #1&lt;br /&gt;
RAM:000000E6   LDR     R1, [R4]&lt;br /&gt;
RAM:000000E8   BICS    R1, R2&lt;br /&gt;
RAM:000000EA   STR     R1, [R4]&lt;br /&gt;
RAM:000000EC   CMP     R0, #0&lt;br /&gt;
RAM:000000EE   B       pop_r2_mov_pc_lr&lt;br /&gt;
RAM:000000EE ; End of function sub_DE&lt;br /&gt;
RAM:000000EE&lt;br /&gt;
RAM:000000F0&lt;br /&gt;
RAM:000000F0 ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:000000F0&lt;br /&gt;
RAM:000000F0&lt;br /&gt;
RAM:000000F0 sub_F0&lt;br /&gt;
RAM:000000F0&lt;br /&gt;
RAM:000000F0 arg_0=  0&lt;br /&gt;
RAM:000000F0&lt;br /&gt;
RAM:000000F0   LDR     R0, =0x400049F0               ; 7 2293df54     4526     df54 : svc #0x54 (offset 0xf0)&lt;br /&gt;
RAM:000000F2   LDR     R2, [R0]&lt;br /&gt;
RAM:000000F4   STR     R2, [SP,#arg_0]&lt;br /&gt;
RAM:000000F6   LDR     R0, =0x40010000&lt;br /&gt;
RAM:000000F8   LSRS    R2, R2, #17&lt;br /&gt;
RAM:000000FA   BEQ     pop_r2_mov_pc_lr              ; if ([0x400049F0] &amp;gt;&amp;gt; 17) == 0) {&lt;br /&gt;
RAM:000000FA                                         ;   r2 = [0x400049F0];&lt;br /&gt;
RAM:000000FA                                         ; } else {&lt;br /&gt;
RAM:000000FC   LDR     R0, =APBDEV_PMC_CNTRL_0&lt;br /&gt;
RAM:000000FE   STR     R4, [R0]                      ;  write APBDEV_PMC_CNTRL&lt;br /&gt;
RAM:00000100&lt;br /&gt;
RAM:00000100 loc_100                                 ; CODE XREF: sub_F0:loc_100↓j&lt;br /&gt;
RAM:00000100   B       loc_100                       ;  hang&lt;br /&gt;
RAM:00000100 ; End of function sub_F0                ; }&lt;br /&gt;
RAM:00000100&lt;br /&gt;
RAM:00000102&lt;br /&gt;
RAM:00000102 ; =============== S U B R O U T I N E =======================================&lt;br /&gt;
RAM:00000102&lt;br /&gt;
RAM:00000102&lt;br /&gt;
RAM:00000102 sub_102&lt;br /&gt;
RAM:00000102&lt;br /&gt;
RAM:00000102 arg_0=  0&lt;br /&gt;
RAM:00000102&lt;br /&gt;
RAM:00000102   LDR     R2, =0x40010220               ; 8 21fadf5d     43f4     df5d : svc #0x5d (offset 0x102)&lt;br /&gt;
RAM:00000104   STR     R2, [SP,#arg_0]               ; set r2 retval = [0x40010220]&lt;br /&gt;
RAM:00000106   LDR     R2, [R2,#0x18]&lt;br /&gt;
RAM:00000108   ADDS    R0, #0xFC&lt;br /&gt;
RAM:0000010A   STR     R2, [R0,#0x1C]                ; [r0+0x118] = [0x40010220 + 0x18]&lt;br /&gt;
RAM:0000010C   B       pop_r2_mov_pc_lr&lt;br /&gt;
RAM:0000010C ; End of function sub_102&lt;br /&gt;
RAM:0000010C&lt;br /&gt;
RAM:0000010C ; ---------------------------------------------------------------------------&lt;br /&gt;
RAM:0000010E   DCB    0&lt;br /&gt;
RAM:0000010F   DCB    0&lt;br /&gt;
RAM:00000110 off_110 DCD 0x60006410                  ; DATA XREF: sub_48+4↑r&lt;br /&gt;
RAM:00000114 off_114 DCD 0x600060F8                  ; DATA XREF: sub_48+A↑r&lt;br /&gt;
RAM:00000118 off_118 DCD 0x60006284                  ; DATA XREF: sub_48+10↑r&lt;br /&gt;
RAM:0000011C off_11C DCD 0x60006554                  ; DATA XREF: sub_48+26↑r&lt;br /&gt;
RAM:00000120 off_120 DCD 0x60006148                  ; DATA XREF: sub_48+2E↑r&lt;br /&gt;
RAM:00000124 off_124 DCD 0x600066A0                  ; DATA XREF: sub_48+3A↑r&lt;br /&gt;
RAM:00000128 off_128 DCD dword_7000EF14              ; DATA XREF: sub_A0+4↑r&lt;br /&gt;
RAM:0000012C off_12C DCD dword_7000E5B4              ; DATA XREF: sub_A0+6↑r&lt;br /&gt;
RAM:00000130 off_130 DCD dword_7000E9C0              ; DATA XREF: sub_A0:loc_BC↑r&lt;br /&gt;
RAM:00000134 off_134 DCD dword_7000FA9C              ; DATA XREF: sub_DE↑r&lt;br /&gt;
RAM:00000138 off_138 DCD 0x400049F0                  ; DATA XREF: sub_F0↑r&lt;br /&gt;
RAM:0000013C dword_13C DCD 0x40010000                ; DATA XREF: sub_F0+6↑r&lt;br /&gt;
RAM:00000140 off_140 DCD APBDEV_PMC_CNTRL_0          ; DATA XREF: sub_F0+C↑r&lt;br /&gt;
RAM:00000144 off_144 DCD 0x40010220                  ; DATA XREF: sub_102↑r&lt;br /&gt;
RAM:00000148 ; ---------------------------------------------------------------------------&lt;br /&gt;
RAM:00000148 ; START OF FUNCTION CHUNK FOR sub_A0&lt;br /&gt;
RAM:00000148&lt;br /&gt;
RAM:00000148 pop_r2_mov_pc_lr                        ; CODE XREF: sub_48+42↑j&lt;br /&gt;
RAM:00000148                                         ; sub_8C+6↑j ...&lt;br /&gt;
RAM:00000148   POP     {R2}&lt;br /&gt;
RAM:0000014A   MOV     PC, LR&lt;br /&gt;
RAM:0000014A ; END OF FUNCTION CHUNK FOR sub_A0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The last 4 patches are exclusive to the Switch, while the remaining ones are often included in most Tegra210 based devices.&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 0 ====&lt;br /&gt;
This patch configures clock enables and clock gate overrides for new hardware.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 u32 CLK_ENB_H_SET = 0x60006328;&lt;br /&gt;
 u32 CLK_ENB_L_SET = 0x60006320;&lt;br /&gt;
 u32 CLK_ENB_U_SET = 0x60006330; &lt;br /&gt;
 u32 CLK_ENB_V_SET = 0x60006440;&lt;br /&gt;
 u32 CLK_ENB_W_SET = 0x60006448;&lt;br /&gt;
 u32 CLK_ENB_X_SET = 0x60006284;&lt;br /&gt;
 u32 CLK_ENB_Y_SET = 0x6000629C;&lt;br /&gt;
 u32 LVL2_CLK_GATE_OVRA = 0x600060F8;&lt;br /&gt;
 u32 LVL2_CLK_GATE_OVRB = 0x600060FC;&lt;br /&gt;
 u32 LVL2_CLK_GATE_OVRC = 0x600063A0;&lt;br /&gt;
 u32 LVL2_CLK_GATE_OVRD = 0x600063A4;&lt;br /&gt;
 u32 LVL2_CLK_GATE_OVRE = 0x60006554;&lt;br /&gt;
 u32 CLK_SOURCE_VI = 0x60006148;&lt;br /&gt;
 u32 CLK_SOURCE_HOST1X = 0x60006180;&lt;br /&gt;
 u32 CLK_SOURCE_NVENC = 0x600066A0; &lt;br /&gt;
&lt;br /&gt;
 // Set all clock enables and overrides&lt;br /&gt;
 *(u32 *)CLK_ENB_V_SET = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)CLK_ENB_W_SET = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)LVL2_CLK_GATE_OVRA = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)LVL2_CLK_GATE_OVRB = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)CLK_ENB_X_SET = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)CLK_ENB_Y_SET = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)CLK_ENB_L_SET = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)CLK_ENB_H_SET = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)CLK_ENB_U_SET = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)LVL2_CLK_GATE_OVRC = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)LVL2_CLK_GATE_OVRD = 0xFFFFFFFF;&lt;br /&gt;
 *(u32 *)LVL2_CLK_GATE_OVRE = 0xFFFFFFFF;&lt;br /&gt;
&lt;br /&gt;
 // Set VI, HOST1X and NVENC clock sources to CLK_M&lt;br /&gt;
 *(u32 *)CLK_SOURCE_VI = 0xA0000000;&lt;br /&gt;
 *(u32 *)CLK_SOURCE_HOST1X = 0xA0000000;&lt;br /&gt;
 *(u32 *)CLK_SOURCE_NVENC = 0xE0000000;&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
     Untranslated instructions:&lt;br /&gt;
&lt;br /&gt;
     MOVS    R1, #0&lt;br /&gt;
     MOVS    R0, #0xE&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 return;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 1 ====&lt;br /&gt;
This patch is a bugfix.&lt;br /&gt;
&lt;br /&gt;
LP0 resume code expects APBDEV_PMC_SCRATCH190_0 to be set to 0x01, but the bootrom didn&#039;t set it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 u32 APBDEV_PMC_SCRATCH190_0 = 0x7000EC18;&lt;br /&gt;
 u32 pmc_scratch190_val = *(u32 *)APBDEV_PMC_SCRATCH190_0;&lt;br /&gt;
 &lt;br /&gt;
 return (pmc_scratch190_val | 0x01);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 2 ====&lt;br /&gt;
This patch adjusts USB configurations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 u32 USB1_UTMIP_SPARE_CFG0_0 = 0x7D000834;&lt;br /&gt;
 u32 USB1_UTMIP_BIAS_CFG2_0 = 0x7D000850;&lt;br /&gt;
 &lt;br /&gt;
 // Increase UTMIP_HSSQUELCH_LEVEL_NEW by 0x02&lt;br /&gt;
 *(u32 *)USB1_UTMIP_BIAS_CFG2_0 += 0x02;&lt;br /&gt;
&lt;br /&gt;
 // Clear FUSE_HS_IREF_CAP_CFG&lt;br /&gt;
 *(u32 *)USB1_UTMIP_SPARE_CFG0_0 = ((*(u32 *)USB1_UTMIP_SPARE_CFG0_0 &amp;amp; ~(0x118)) - 0x80);&lt;br /&gt;
 &lt;br /&gt;
 return;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 3 ====&lt;br /&gt;
This patch ensures that waiting on PRC_PENDING from the XUSB_DEV register T_XUSB_DEV_XHCI_PORTSC never fails.&lt;br /&gt;
&lt;br /&gt;
In the second batch of patched units ([[#FUSE_OPT_FT_REV|FUSE_OPT_FT_REV]] set to revision 7.0) this patch has been replaced with a fix for [[Switch_System_Flaws#Hardware|CVE-2018-6242]] (arbitrary copy when handling USB control requests in RCM). By setting R1 to 0 at address 0x0010769A in the bootrom, the upper 16 bits of the USB control request&#039;s wLength field are cleared out, effectively limiting the request&#039;s size to a maximum of 255 bytes.&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 4 ====&lt;br /&gt;
This patch allows backing up and restoring strapping options for warmboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 u32 APBDEV_PMC_SCRATCH0_0 = 0x7000E450;&lt;br /&gt;
 u32 APBDEV_PMC_RST_STATUS_0 = 0x7000E5B4;&lt;br /&gt;
 u32 APBDEV_PMC_SEC_DISABLE8_0 = 0x7000E9C0;&lt;br /&gt;
 u32 APBDEV_PMC_SECURE_SCRATCH111_0 = 0x7000EF14;&lt;br /&gt;
 u32 APB_MISC_PP_STRAPPING_OPT_A_0 = 0x70000008; &lt;br /&gt;
&lt;br /&gt;
 u32 reset_status = *(u32 *)APBDEV_PMC_RST_STATUS_0;&lt;br /&gt;
&lt;br /&gt;
 // Check for regular power on&lt;br /&gt;
 if (reset_status == 0)&lt;br /&gt;
 {    &lt;br /&gt;
     // Set all buttons in RCM_STRAPS and backup to PMC scratch&lt;br /&gt;
     *(u32 *)APBDEV_PMC_SECURE_SCRATCH111_0 = (*(u32 *)APB_MISC_PP_STRAPPING_OPT_A_0 | 0x1C00);&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
     // Restore strapping options from PMC scratch&lt;br /&gt;
     *(u32 *)APB_MISC_PP_STRAPPING_OPT_A_0 = *(u32 *)APBDEV_PMC_SECURE_SCRATCH111_0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Disable write access to APBDEV_PMC_SECURE_SCRATCH111_0&lt;br /&gt;
 *(u32 *)APBDEV_PMC_SEC_DISABLE8_0 |= 0x4000;&lt;br /&gt;
 &lt;br /&gt;
 return *(u32 *)APBDEV_PMC_SCRATCH0_0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 5 ====&lt;br /&gt;
This patch adjusts USB configurations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 u32 USB1_UTMIP_HSRX_CFG0_0 = 0x7D000810;&lt;br /&gt;
 u32 USB1_UTMIP_BIAS_CFG2_0 = 0x7D000850;&lt;br /&gt;
&lt;br /&gt;
 // Clear UTMIP_IDLE_WAIT, UTMIP_ELASTIC_LIMIT and UTMIP_PCOUNT_UPDN_DIV,&lt;br /&gt;
 // and set UTMIP_IDLE_WAIT to 0x11 and UTMIP_ELASTIC_LIMIT to 0x10 &lt;br /&gt;
 *(u32 *)USB1_UTMIP_HSRX_CFG0_0 = ((*(u32 *)USB1_UTMIP_HSRX_CFG0_0 &amp;amp; ~(0xF8000) + 0x88000 &amp;amp; ~(0x7C00) + 0x4000) &amp;amp; ~(0xF000000));&lt;br /&gt;
 &lt;br /&gt;
 // Clear UTMIP_HSSQUELCH_LEVEL_NEW&lt;br /&gt;
 *(u32 *)USB1_UTMIP_BIAS_CFG2_0 &amp;amp;= ~(0x07);&lt;br /&gt;
 &lt;br /&gt;
 return;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 6 ====&lt;br /&gt;
This patch is a factory backdoor.&lt;br /&gt;
&lt;br /&gt;
It allows controlling the debug authentication configuration using a fuse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 u32 FUSE_ODM_INFO = 0x7000FA9C;&lt;br /&gt;
&lt;br /&gt;
 u32 odm_info = *(u32 *)FUSE_ODM_INFO;&lt;br /&gt;
 debug_auth_override_val = ((odm_info &amp;gt;&amp;gt; 0x08) &amp;lt;&amp;lt; 0x01);&lt;br /&gt;
&lt;br /&gt;
 // Override debug authentication value stored in IRAM&lt;br /&gt;
 *(u32 *)0x400028E4 &amp;amp;= ~(debug_auth_override_val);&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
     Untranslated instructions:&lt;br /&gt;
 &lt;br /&gt;
     CMP     R0, #0&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 return;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 7 ====&lt;br /&gt;
This patch is a bugfix.&lt;br /&gt;
&lt;br /&gt;
It prevents overflowing IRAM (0x40010000) when copying the warmboot binary from DRAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 u32 APBDEV_PMC_CNTRL_0 = 0x7000E400;&lt;br /&gt;
 &lt;br /&gt;
 u32 warmboot_header_addr = 0x400049F0;&lt;br /&gt;
 u32 warmboot_bin_size = *(u32 *)warmboot_bin_header_addr;&lt;br /&gt;
 &lt;br /&gt;
 // Invalid warmboot binary size&lt;br /&gt;
 if (warmboot_size &amp;gt;&amp;gt; 0x11)&lt;br /&gt;
 {&lt;br /&gt;
     // Assert MAIN_RST&lt;br /&gt;
     // 0x40004BF0 comes from R4 and the bootrom doesn&#039;t bother to change it&lt;br /&gt;
     *(u32 *)APBDEV_PMC_CNTRL_0 = 0x40004BF0;&lt;br /&gt;
&lt;br /&gt;
     // Deadlock&lt;br /&gt;
     while(1);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /*&lt;br /&gt;
     Untranslated instructions:&lt;br /&gt;
 &lt;br /&gt;
     LDR     R0, =0x40010000&lt;br /&gt;
     LDR     R2, [warmboot_bin_header_addr]&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 8 ====&lt;br /&gt;
This patch is a bugfix.&lt;br /&gt;
&lt;br /&gt;
It sets the correct warmboot binary entrypoint address for RSA signature verification, which would be done in DRAM instead of IRAM without this patch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 u32 warmboot_addr_ptr = 0x40010238;&lt;br /&gt;
 u32 warmboot_entry_addr_ptr = 0x40004C28;&lt;br /&gt;
&lt;br /&gt;
 *(u32 *)warmboot_entry_addr_ptr = *(u32 *)warmboot_addr_ptr;&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
     Untranslated instructions:&lt;br /&gt;
 &lt;br /&gt;
     LDR     R2, [warmboot_addr_ptr]&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 return;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IROM patches 9 and 10 ====&lt;br /&gt;
These patches modify the 256-bit Secure Provisioning AES key with index 0x3A.&lt;br /&gt;
&lt;br /&gt;
==== IROM patch 11 ====&lt;br /&gt;
This patch forces the value of [[Security_Engine|SE_TZRAM_SECURITY]] to be 0x01 instead of restoring it from the saved SE context.&lt;br /&gt;
&lt;br /&gt;
== Anti-downgrade ==&lt;br /&gt;
The first bootloader verifies [[#FUSE_RESERVED_ODM7|FUSE_RESERVED_ODM7]] to prevent downgrading.&lt;br /&gt;
How many fuses are expected to be burnt depends the device&#039;s unit type as below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! System version&lt;br /&gt;
! Expected number of burnt fuses (retail)&lt;br /&gt;
! Expected number of burnt fuses (non-retail)&lt;br /&gt;
|-&lt;br /&gt;
| 1.0.0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 2.0.0-2.3.0&lt;br /&gt;
| 2&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 3.0.0&lt;br /&gt;
| 3&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 3.0.1-3.0.2&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 4.0.0-4.1.0&lt;br /&gt;
| 5&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 5.0.0-5.1.0&lt;br /&gt;
| 6&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 6.0.0-6.1.0&lt;br /&gt;
| 7&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 6.2.0&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 7.0.0-8.0.1&lt;br /&gt;
| 9&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 8.1.0&lt;br /&gt;
| 10&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 9.0.0-9.0.1&lt;br /&gt;
| 11&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If too many fuses are burnt the bootloader will panic immediately.&lt;br /&gt;
&lt;br /&gt;
If too few are burnt, the bootloader will enable fuse programming and write the expected value to fuses [[#reserved_odm6|reserved_odm6]] and [[#reserved_odm7|reserved_odm7]]. Afterwards, fuse programming is disabled and the panic value 0x21 is written to PMC_SCRATCH200 register (0x7000EC40). Finally, the watchdog timer is initialized and programmed to force a reset.&lt;br /&gt;
&lt;br /&gt;
On a subsequent boot, after the anti-downgrade fuses are checked again, the PMC_RST_STATUS register (0x7000E5B4) is checked and if set to 0x01 (watchdog reset) the PMC_SCRATCH200 register (0x7000EC40) will be checked for the panic value 0x21.&lt;br /&gt;
PMC_RST_STATUS will only be set back to 0 (power on reset) if the fuse count matches the new expected value, otherwise the system will panic.&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=8054</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=8054"/>
		<updated>2019-10-02T08:03:58Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: We were lied to. Based on 5.0.0 info.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || [[#svcSignalEvent]] || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || [[#svcClearEvent]] || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || [[#svcResetSignal]] || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=baseaddr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R1=info_sub_id_lower32, R2=info_id, R3=handle, R4=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr&lt;br /&gt;
R0=name_ptr, R2=max_sessions, R3=is_light&lt;br /&gt;
|| W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32, R5=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr&lt;br /&gt;
R0=meminfo_ptr, R1=addr_lower32, R2=process_handle, R3=addr_upper32&lt;br /&gt;
|| W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz&lt;br /&gt;
R0=process_handle, R1=main_thread_prio, R2=default_cpuid, R3=main_thread_stacksz_lower32, R4=main_thread_stacksz_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]]&lt;br /&gt;
R1=process_handle, R2=[[#ProcessInfoType]]&lt;br /&gt;
|| W0=result, X1=[[#ProcessState]]&lt;br /&gt;
R0=result, R1=[[#ProcessState]]_lower32, R2=[[#ProcessState]]_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value&lt;br /&gt;
R0=reslimit_handle, R1=[[#LimitableResource]], R2=value_lower32, R3=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args&lt;br /&gt;
R0=smc_sub_id, R1, R2, R3=smc_args&lt;br /&gt;
|| X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
R0,R1,R2,R3=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d, and always in the Heap memory region) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition. The memory allocated counts towards the caller&#039;s process Memory ResourceLimit.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Invalid size passed. It&#039;s either bigger than 4GB, or misaligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD001:&#039;&#039;&#039; Size is bigger than the Heap Region size.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; KMemoryBlockAllocator slab allocator exhausted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The memory region is in an invalid state. Likely because a mapping was made in the heap region.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x10801:&#039;&#039;&#039; Memory resource limit reached.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The memory region was reprotected.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Unaligned address specified.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Unaligned or zero size specified.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The provided memory region does not fall within the userland address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD801:&#039;&#039;&#039; Invalid permission specified. Valid permissions are ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The provided memory region was in an invalid state. The region must have the PermissionChangeAllowed bit set in its [[#MemoryState]], and must not have the IsBorrowed or IsUncached [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; Kernel resource exhausted.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcSignalEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Puts the given event in the signaled state.&lt;br /&gt;
&lt;br /&gt;
Will wake up any thread currently waiting on this event. Can potentially trigger a reschedule.&lt;br /&gt;
&lt;br /&gt;
Any calls to [[#svcWaitSynchronization]] on this handle will return immediately, until the event&#039;s signaled state is reset.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Event is now in signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
== svcClearEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent or ReadableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Takes the given event out of the signaled state.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success, the event is now in the not-signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a ReadableEvent nor a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xFA01:&#039;&#039;&#039; The handle was not in a signaled state.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcResetSignal ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;ReadableEvent&amp;gt; or Handle&amp;lt;Process&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resets the signal on the given handle, ensuring future calls to [[#svcWaitSynchronization]] on this handle will sleep until the handle is signaled again. If the handle is a ReadableEvent, this is equivalent to calling svcClearEvent() on the handle.&lt;br /&gt;
&lt;br /&gt;
If the handle is a Process, it will clear the signaled state (which is set when the process changes [[#ProcessState]]. Once the process enters the Exited state, calling svcResetSignal on the process will no longer have an effect (the process is permanently signaled), and the syscall will return 0xFA01.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The signal was reset.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The handle is invalid or of the wrong type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xFA01:&#039;&#039;&#039; The handle was not signaled, or the process is in exited state, causing it to be permanently signaled.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 23 || 0 || [9.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || BaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query the physical address of a virtual address. Will always fetch the lowest page-aligned mapping that contains the provided physical address.&lt;br /&gt;
&lt;br /&gt;
The returned BaseAddr is the virtual address of that page-aligned mapping, while PhysAddr is the physical address of that page. Size is the amount of continuous physical memory in that mapping.&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R5 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R1, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R2 || [[#ProcessInfoType]] || InfoType&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1, R2 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || R1-R3 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || R1-R3 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type || &lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls || Allows using [[#svcWriteDebugProcessMemory]] on segments mapped read-only.&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]]) ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted || The physical memory blocks backing this region are refcounted.&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] [[#svcCreateCodeMemory|CodeMemoryAllowed]] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Error_codes&amp;diff=7966</id>
		<title>Error codes</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Error_codes&amp;diff=7966"/>
		<updated>2019-09-20T08:02:35Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: 0xFA01 is InvalidState.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Structure =&lt;br /&gt;
These have been redesigned from the 3DS so that they fit within a Aarch64 MOV instruction immediate most of the time (without requiring the additional MOVK).&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Field&lt;br /&gt;
|-&lt;br /&gt;
| 8-0 || Module&lt;br /&gt;
|-&lt;br /&gt;
| 21-9 || Description&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When a fatal-error is received the error code is outputted using the following formatter:&lt;br /&gt;
  %04d-%04d&lt;br /&gt;
&lt;br /&gt;
.. where the first code is &amp;lt;code&amp;gt;2000 + Module&amp;lt;/code&amp;gt;, and the other being &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;. Bits &amp;gt;=22 from the error-code are unused when displaying fatal-errors, since the Description ends with bit21.&lt;br /&gt;
&lt;br /&gt;
= Modules =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Kernel&lt;br /&gt;
|-&lt;br /&gt;
| 2 || FS&lt;br /&gt;
|-&lt;br /&gt;
| 3 || OS (Memory, Thread, Mutex, NVIDIA)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || HTCS&lt;br /&gt;
|-&lt;br /&gt;
| 5 || NCM&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DD&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Debug Monitor&lt;br /&gt;
|-&lt;br /&gt;
| 8 || LR&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Loader&lt;br /&gt;
|-&lt;br /&gt;
| 10 || CMIF (IPC command interface)&lt;br /&gt;
|-&lt;br /&gt;
| 11 || HIPC (IPC)&lt;br /&gt;
|-&lt;br /&gt;
| 15 || PM&lt;br /&gt;
|-&lt;br /&gt;
| 16 || NS&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Sockets&lt;br /&gt;
|-&lt;br /&gt;
| 18 || HTC&lt;br /&gt;
|-&lt;br /&gt;
| 19 || TSC&lt;br /&gt;
|-&lt;br /&gt;
| 20 || NCM (content)&lt;br /&gt;
|-&lt;br /&gt;
| 21 || SM&lt;br /&gt;
|-&lt;br /&gt;
| 22 || RO (userland)&lt;br /&gt;
|-&lt;br /&gt;
| 24 || SDMMC&lt;br /&gt;
|-&lt;br /&gt;
| 25 || OVLN&lt;br /&gt;
|-&lt;br /&gt;
| 26 || SPL&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Bus&lt;br /&gt;
|-&lt;br /&gt;
| 100 || ETHC&lt;br /&gt;
|-&lt;br /&gt;
| 101 || I2C&lt;br /&gt;
|-&lt;br /&gt;
| 102 || GPIO&lt;br /&gt;
|-&lt;br /&gt;
| 103 || UART&lt;br /&gt;
|-&lt;br /&gt;
| 105 || Settings&lt;br /&gt;
|-&lt;br /&gt;
| 107 || WLAN&lt;br /&gt;
|-&lt;br /&gt;
| 108 || HID (xcd)&lt;br /&gt;
|-&lt;br /&gt;
| 110 || NIFM&lt;br /&gt;
|-&lt;br /&gt;
| 111 || Hwopus&lt;br /&gt;
|-&lt;br /&gt;
| 112 || HID (sasbus)&lt;br /&gt;
|-&lt;br /&gt;
| 113 || Bluetooth&lt;br /&gt;
|-&lt;br /&gt;
| 114 || VI&lt;br /&gt;
|-&lt;br /&gt;
| 115 || NFP&lt;br /&gt;
|-&lt;br /&gt;
| 116 || Time&lt;br /&gt;
|-&lt;br /&gt;
| 117 || FGM&lt;br /&gt;
|-&lt;br /&gt;
| 118 || OE&lt;br /&gt;
|-&lt;br /&gt;
| 120 || PCIe&lt;br /&gt;
|-&lt;br /&gt;
| 121 || Friends&lt;br /&gt;
|-&lt;br /&gt;
| 122 || BCAT&lt;br /&gt;
|-&lt;br /&gt;
| 123 || SSL&lt;br /&gt;
|-&lt;br /&gt;
| 124 || Account&lt;br /&gt;
|-&lt;br /&gt;
| 125 || News&lt;br /&gt;
|-&lt;br /&gt;
| 126 || Mii&lt;br /&gt;
|-&lt;br /&gt;
| 127 || NFC&lt;br /&gt;
|-&lt;br /&gt;
| 128 || AM&lt;br /&gt;
|-&lt;br /&gt;
| 129 || Play Report&lt;br /&gt;
|-&lt;br /&gt;
| 130 || HID (ahid)&lt;br /&gt;
|-&lt;br /&gt;
| 132 || Home Menu (Qlaunch)&lt;br /&gt;
|-&lt;br /&gt;
| 133 || PCV&lt;br /&gt;
|-&lt;br /&gt;
| 134 || OMM&lt;br /&gt;
|-&lt;br /&gt;
| 135 || BPC&lt;br /&gt;
|-&lt;br /&gt;
| 136 || PSM&lt;br /&gt;
|-&lt;br /&gt;
| 137 || NIM&lt;br /&gt;
|-&lt;br /&gt;
| 138 || PSC&lt;br /&gt;
|-&lt;br /&gt;
| 139 || TC&lt;br /&gt;
|-&lt;br /&gt;
| 140 || USB&lt;br /&gt;
|-&lt;br /&gt;
| 141 || NSD&lt;br /&gt;
|-&lt;br /&gt;
| 142 || PCTL&lt;br /&gt;
|-&lt;br /&gt;
| 143 || BTM&lt;br /&gt;
|-&lt;br /&gt;
| 144 || LA (Library Applet)&lt;br /&gt;
|-&lt;br /&gt;
| 145 || ETicket&lt;br /&gt;
|-&lt;br /&gt;
| 146 || NGC (Bad Words)&lt;br /&gt;
|-&lt;br /&gt;
| 147 || Error Report&lt;br /&gt;
|-&lt;br /&gt;
| 148 || APM&lt;br /&gt;
|-&lt;br /&gt;
| 149 || CEC&lt;br /&gt;
|-&lt;br /&gt;
| 150 || Profiler&lt;br /&gt;
|-&lt;br /&gt;
| 151 || Error Upload&lt;br /&gt;
|-&lt;br /&gt;
| 153 || Audio&lt;br /&gt;
|-&lt;br /&gt;
| 154 || NPNS&lt;br /&gt;
|-&lt;br /&gt;
| 155 || NPNS (XMPP Stream)&lt;br /&gt;
|-&lt;br /&gt;
| 157 || ARP&lt;br /&gt;
|-&lt;br /&gt;
| 158 || Updater&lt;br /&gt;
|-&lt;br /&gt;
| 159 || SWKBD&lt;br /&gt;
|-&lt;br /&gt;
| 161 || NFC (Mifare)&lt;br /&gt;
|-&lt;br /&gt;
| 162 || Userland (assert)&lt;br /&gt;
|-&lt;br /&gt;
| 163 || Fatal&lt;br /&gt;
|-&lt;br /&gt;
| 164 || NIM (shop)&lt;br /&gt;
|-&lt;br /&gt;
| 165 || SPSM&lt;br /&gt;
|-&lt;br /&gt;
| 167 || BGTC&lt;br /&gt;
|-&lt;br /&gt;
| 168 || Userland (crash)&lt;br /&gt;
|-&lt;br /&gt;
| 169 || Sasbus (Periodic Receive Mode)&lt;br /&gt;
|-&lt;br /&gt;
| 178 || PDM&lt;br /&gt;
|-&lt;br /&gt;
| 179 || OLSC&lt;br /&gt;
|-&lt;br /&gt;
| 180 || SREPO&lt;br /&gt;
|-&lt;br /&gt;
| 181 || Dauth&lt;br /&gt;
|-&lt;br /&gt;
| 187 || Sasbus&lt;br /&gt;
|-&lt;br /&gt;
| 191 || RTC&lt;br /&gt;
|-&lt;br /&gt;
| 192 || Regulator&lt;br /&gt;
|-&lt;br /&gt;
| 193 || Led&lt;br /&gt;
|-&lt;br /&gt;
| 197 || Clkrst&lt;br /&gt;
|-&lt;br /&gt;
| 202 || HID&lt;br /&gt;
|-&lt;br /&gt;
| 203 || LDN&lt;br /&gt;
|-&lt;br /&gt;
| 205 || HID (irsensor)&lt;br /&gt;
|-&lt;br /&gt;
| 206 || Capture&lt;br /&gt;
|-&lt;br /&gt;
| 208 || Manu&lt;br /&gt;
|-&lt;br /&gt;
| 209 || ATK&lt;br /&gt;
|-&lt;br /&gt;
| 210 || Web&lt;br /&gt;
|-&lt;br /&gt;
| 211 || Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 212 || GRC&lt;br /&gt;
|-&lt;br /&gt;
| 216 || Migration&lt;br /&gt;
|-&lt;br /&gt;
| 217 || Migration (Idc Server)&lt;br /&gt;
|-&lt;br /&gt;
| 229 || Glue (notification)&lt;br /&gt;
|-&lt;br /&gt;
| 230 || PSC (ins)&lt;br /&gt;
|-&lt;br /&gt;
| 231 || LDN (lp2p)&lt;br /&gt;
|-&lt;br /&gt;
| 345 || libnx&lt;br /&gt;
|-&lt;br /&gt;
| 346 || [[Homebrew ABI]]&lt;br /&gt;
|-&lt;br /&gt;
| 347 || Homebrew Loader&lt;br /&gt;
|-&lt;br /&gt;
| 348 || libnx Nvidia errors&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Error codes =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Module || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E01 || 1 || 7 || Session count exceeded&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C01 || 1 || 14 || Invalid kernel capability descriptor&lt;br /&gt;
|-&lt;br /&gt;
| 0x4201 || 1 || 33 || Not Implemented&lt;br /&gt;
|-&lt;br /&gt;
| 0x7601 || 1 || 59 || Thread terminated/termination requested&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C01 || 1 || 70 || No more debug events&lt;br /&gt;
|-&lt;br /&gt;
| 0xCA01 || 1 || 101 || Invalid size&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC01 || 1 || 102 || Invalid address&lt;br /&gt;
|-&lt;br /&gt;
| 0xCE01 || 1 || 103 || Resource exhaustion&lt;br /&gt;
|-&lt;br /&gt;
| 0xD001 || 1 || 104 || Memory exhaustion&lt;br /&gt;
|-&lt;br /&gt;
| 0xD201 || 1 || 105 || Handle-table exhaustion&lt;br /&gt;
|-&lt;br /&gt;
| 0xD401 || 1 || 106 || Invalid memory state / invalid memory permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD801 || 1 || 108 || Invalid memory permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 0xDC01 || 1 || 110 || Invalid memory range&lt;br /&gt;
|-&lt;br /&gt;
| 0xE001 || 1 || 112 || Invalid thread priority.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE201 || 1 || 113 || Invalid processor id.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE401 || 1 || 114 || Invalid handle.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE601 || 1 || 115 || Invalid pointer/Syscall copy from user failed.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE801 || 1 || 116 || Invalid combination&lt;br /&gt;
|-&lt;br /&gt;
| 0xEA01 || 1 || 117 || Time out. Also when you give 0 handles to svcWaitSynchronizationN.&lt;br /&gt;
|-&lt;br /&gt;
| 0xEC01 || 1 || 118 || Operation canceled&lt;br /&gt;
|-&lt;br /&gt;
| 0xEE01 || 1 || 119 || Out of range&lt;br /&gt;
|-&lt;br /&gt;
| 0xF001 || 1 || 120 || Invalid enum&lt;br /&gt;
|-&lt;br /&gt;
| 0xF201 || 1 || 121 || No such entry&lt;br /&gt;
|-&lt;br /&gt;
| 0xF401 || 1 || 122 || Irq/DeviceAddressSpace/{...} already registered&lt;br /&gt;
|-&lt;br /&gt;
| 0xF601 || 1 || 123 || Port remote dead&lt;br /&gt;
|-&lt;br /&gt;
| 0xF801 || 1 || 124 || [Usermode] Unhandled interrupt/exception&lt;br /&gt;
|-&lt;br /&gt;
| 0xFA01 || 1 || 125 || Invalid state&lt;br /&gt;
|-&lt;br /&gt;
| 0xFC01 || 1 || 126 || Reserved value&lt;br /&gt;
|-&lt;br /&gt;
| 0xFE01 || 1 || 127 || Invalid hardware breakpoint&lt;br /&gt;
|-&lt;br /&gt;
| 0x10001 || 1 || 128 || [Usermode] Fatal exception&lt;br /&gt;
|-&lt;br /&gt;
| 0x10201 || 1 || 129 || Last thread didn&#039;t belong to your process&lt;br /&gt;
|-&lt;br /&gt;
| 0x10601 || 1 || 131 || Port closed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10801 || 1 || 132 || Resource limit exceeded&lt;br /&gt;
|-&lt;br /&gt;
| 0x20801 || 1 || 260 || Command buffer too small&lt;br /&gt;
|-&lt;br /&gt;
| 0x40A01 || 1 || 517 || Invalid process ID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40C01 || 1 || 518 || Invalid thread ID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40E01 || 1 || 519 || Invalid thread ID (used in svcGetDebugThreadParam).&lt;br /&gt;
|-&lt;br /&gt;
| 0x41001 || 1 || 520 || Process not being debugged&lt;br /&gt;
|-&lt;br /&gt;
| 0x202 || 2 || 1 || Path does not exist.&lt;br /&gt;
|-&lt;br /&gt;
| 0x402 || 2 || 2 || Path already exists.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE02 || 2 || 7 || Resource already in use (file already opened, savedata filesystem already mounted).&lt;br /&gt;
|-&lt;br /&gt;
| 0x4602 || 2 || 35 || Not enough free space for BIS Calibration partition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4802 || 2 || 36 || Not enough free space for BIS Safe partition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A02 || 2 || 37 || Not enough free space for BIS User partition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C02 || 2 || 38 || Not enough free space for BIS System partition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E02 || 2 || 39 || Not enough free space on SD card.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6402 || 2 || 50 || NCA is older than version 3, or NCA SDK version is older than 0.11.0.0&lt;br /&gt;
|-&lt;br /&gt;
| 0x7802 || 2 || 60 || Specified mount name already exists.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D202 || 2 || 1001 || Process does not have RomFs &lt;br /&gt;
|-&lt;br /&gt;
| 0x7D402 || 2 || 1002 || Title-id not found / savedata not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0xFA202 || 2 || 2001 || SD card not inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x13B002 || 2 || 2520 || Gamecard not inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x13DA02 || 2 || 2541 || Version check failed when mounting gamecard sysupdate partition?&lt;br /&gt;
|-&lt;br /&gt;
| 0x171402 || 2 || 2954 || Invalid gamecard handle.&lt;br /&gt;
|-&lt;br /&gt;
| 0x177202 || 2 || 3001 || Unimplemented behavior&lt;br /&gt;
|-&lt;br /&gt;
| 0x177602 || 2 || 3003 || File/Directory already exists.&lt;br /&gt;
|-&lt;br /&gt;
| 0x190202 || 2 || 3201 || Memory allocation failure related to FAT filesystem code&lt;br /&gt;
|-&lt;br /&gt;
| 0x190602 || 2 || 3203 || Memory allocation failure related to FAT filesystem code&lt;br /&gt;
|-&lt;br /&gt;
| 0x190802 || 2 || 3204 || Memory allocation failure related to FAT filesystem code&lt;br /&gt;
|-&lt;br /&gt;
| 0x190A02 || 2 || 3205 || Memory allocation failure related to FAT filesystem code&lt;br /&gt;
|-&lt;br /&gt;
| 0x190C02 || 2 || 3206 || Memory allocation failure related to FAT filesystem code&lt;br /&gt;
|-&lt;br /&gt;
| 0x191002 || 2 || 3208 || Memory allocation failure related to FAT filesystem code&lt;br /&gt;
|-&lt;br /&gt;
| 0x195802 || 2 || 3244 || Allocation failure related to SD cards&lt;br /&gt;
|-&lt;br /&gt;
| 0x196002 || 2 || 3248 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x196202 || 2 || 3249 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A3E02 || 2 || 3359 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A4002 || 2 || 3360 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A4A02 || 2 || 3365 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x21BC02 || 2 || 4318 || Invalid save data filesystem magic (valid magic is SAVE in ASCII)&lt;br /&gt;
|-&lt;br /&gt;
| 0x234202 || 2 || 4513 || Error reading ACID section in NPDM&lt;br /&gt;
|-&lt;br /&gt;
| 0x234402 || 2 || 4514 || Invalid NPDM ACID section size&lt;br /&gt;
|-&lt;br /&gt;
| 0x234602 || 2 || 4515 || Last byte of the ACID modulus is zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x234802 || 2 || 4516 || Invalid ACID fixed key signature&lt;br /&gt;
|-&lt;br /&gt;
| 0x234A02 || 2 || 4517 || Invalid NCA magic&lt;br /&gt;
|-&lt;br /&gt;
| 0x234C02 || 2 || 4518 || Invalid NCA header fixed key signature&lt;br /&gt;
|-&lt;br /&gt;
| 0x234E02 || 2 || 4519 || Invalid NCA header ACID signature&lt;br /&gt;
|-&lt;br /&gt;
| 0x235002 || 2 || 4520 || Invalid NCA header section hash&lt;br /&gt;
|-&lt;br /&gt;
| 0x235202 || 2 || 4521 || Invalid NCA Key index&lt;br /&gt;
|-&lt;br /&gt;
| 0x235602 || 2 || 4523 || Invalid encryption type&lt;br /&gt;
|-&lt;br /&gt;
| 0x235802 || 2 || 4524 || Redirection BKTR table size is negative&lt;br /&gt;
|-&lt;br /&gt;
| 0x235A02 || 2 || 4525 || Encryption BKTR table size is negative&lt;br /&gt;
|-&lt;br /&gt;
| 0x235C02 || 2 || 4526 || Redirection BKTR table end offset is past the Encryption BKTR table start offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x235E02 || 2 || 4527 || NCA-path used with the wrong titleID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x236002 || 2 || 4528 || NCA header value is out of range&lt;br /&gt;
|-&lt;br /&gt;
| 0x236202 || 2 || 4529 || NCA FS header value is out of range&lt;br /&gt;
|-&lt;br /&gt;
| 0x236802 || 2 || 4532 || PartitionFS hash block size is not a power of 2&lt;br /&gt;
|-&lt;br /&gt;
| 0x236A02 || 2 || 4533 || PartitionFS hash &amp;quot;always_2&amp;quot; field is not 2&lt;br /&gt;
|-&lt;br /&gt;
| 0x236C02 || 2 || 4534 || PartitionFS hash table is too small for main data&lt;br /&gt;
|-&lt;br /&gt;
| 0x236E02 || 2 || 4535 || Invalid PartitionFS block hash&lt;br /&gt;
|-&lt;br /&gt;
| 0x244402 || 2 || 4642 || Invalid Partition file hashed region bounds&lt;br /&gt;
|-&lt;br /&gt;
| 0x244602 || 2 || 4643 || Invalid Partition FS hash&lt;br /&gt;
|-&lt;br /&gt;
| 0x244802 || 2 || 4644 || Invalid PFS0 magic&lt;br /&gt;
|-&lt;br /&gt;
| 0x244A02 || 2 || 4645 || Invalid HFS0 magic&lt;br /&gt;
|-&lt;br /&gt;
| 0x244C02 || 2 || 4646 || Invalid name offset for Partition FS file entry&lt;br /&gt;
|-&lt;br /&gt;
| 0x244E02 || 2 || 4647 || Calculated Partition FS header size changed between 2 consecutive reads&lt;br /&gt;
|-&lt;br /&gt;
| 0x249802 || 2 || 4684 || Invalid FAT file number.&lt;br /&gt;
|-&lt;br /&gt;
| 0x249C02 || 2 || 4686 || Invalid FAT format for BIS User partition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x249E02 || 2 || 4687 || Invalid FAT format for BIS System partition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24A002 || 2 || 4688 || Invalid FAT format for BIS Safe partition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24A202 || 2 || 4689 || Invalid FAT format for BIS Calibration partition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x250E02 || 2 || 4743 || [[NAX0|Corrupted]] NAX0 header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x251002 || 2 || 4744 || Invalid [[NAX0]] magicnum.&lt;br /&gt;
|-&lt;br /&gt;
| 0x280202 || 2 || 5121 || Invalid FAT size&lt;br /&gt;
|-&lt;br /&gt;
| 0x280402 || 2 || 5122 || Invalid FAT BPB (BIOS Parameter Block)&lt;br /&gt;
|-&lt;br /&gt;
| 0x280602 || 2 || 5123 || Invalid FAT parameter&lt;br /&gt;
|-&lt;br /&gt;
| 0x280802 || 2 || 5124 || Invalid FAT sector&lt;br /&gt;
|-&lt;br /&gt;
| 0x280A02 || 2 || 5125 || Invalid FAT sector&lt;br /&gt;
|-&lt;br /&gt;
| 0x280C02 || 2 || 5126 || Invalid FAT sector&lt;br /&gt;
|-&lt;br /&gt;
| 0x280E02 || 2 || 5127 || Invalid FAT sector&lt;br /&gt;
|-&lt;br /&gt;
| 0x296A02 || 2 || 5301 || Mountpoint not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE202 || 2 || 6001 || Invalid input&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE602 || 2 || 6003 || Path too long&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE802 || 2 || 6004 || Invalid character.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EEA02 || 2 || 6005 || Invalid directory path.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EEC02 || 2 || 6006 || Unable to retrieve directory from path&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F5A02 || 2 || 6061 || Offset outside storage&lt;br /&gt;
|-&lt;br /&gt;
| 0x313802 || 2 || 6300 || Operation not supported&lt;br /&gt;
|-&lt;br /&gt;
| 0x313C02 || 2 || 6302 || Attempted to resize a nn::fs::SubStorage or BufferedStorage that is marked as non-resizable&lt;br /&gt;
|-&lt;br /&gt;
| 0x313E02 || 2 || 6303 || Attempted to resize a nn::fs::SubStorage or BufferedStorage when the SubStorage ends before the base storage&lt;br /&gt;
|-&lt;br /&gt;
| 0x314002 || 2 || 6304 || Attempted to call nn::fs::MemoryStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x314202 || 2 || 6305 || Invalid Operation ID in nn::fs::MemoryStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x314402 || 2 || 6306 || Invalid Operation ID in nn::fs::FileStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x314C02 || 2 || 6310 || Attempted to call nn::fssystem::AesCtrCounterExtendedStorage::Write&lt;br /&gt;
|-&lt;br /&gt;
| 0x314E02 || 2 || 6311 || Attempted to call nn::fssystem::AesCtrCounterExtendedStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x315002 || 2 || 6312 || Invalid Operation ID in nn::fssystem::AesCtrCounterExtendedStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x315802 || 2 || 6316 || Attempted to call nn::fssystem::save::HierarchicalIntegrityVerificationStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x315A02 || 2 || 6317 || Attempted to call nn::fssystem::save::HierarchicalIntegrityVerificationStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x315C02 || 2 || 6318 || Attempted to call nn::fssystem::save::IntegrityVerificationStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x315E02 || 2 || 6319 || Attempted to invalidate the cache of a RomFs IVFC storage in nn::fssystem::save::IntegrityVerificationStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x316002 || 2 || 6320 || Invalid Operation ID in nn::fssystem::save::IntegrityVerificationStorage::OperateRange &lt;br /&gt;
|-&lt;br /&gt;
| 0x316202 || 2 || 6321 || Attempted to call nn::fssystem::save::BlockCacheBufferedStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x316402 || 2 || 6322 || Attempted to invalidate the cache of something other than a savedata IVFC storage in nn::fssystem::save::BlockCacheBufferedStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x316602 || 2 || 6323 || Invalid Operation ID in nn::fssystem::save::BlockCacheBufferedStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x316802 || 2 || 6324 || Attempted to call nn::fssystem::IndirectStorage::Write&lt;br /&gt;
|-&lt;br /&gt;
| 0x316A02 || 2 || 6325 || Attempted to call nn::fssystem::IndirectStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x316C02 || 2 || 6326 || Invalid Operation ID in nn::fssystem::IndirectStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x317202 || 2 || 6329 || Attempted to call nn::fssystem::HierarchicalSha256Storage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x317402 || 2 || 6330 || Attempted to call nn::fssystem::ReadOnlyBlockCacheStorage::Write&lt;br /&gt;
|-&lt;br /&gt;
| 0x317602 || 2 || 6331 || Attempted to call nn::fssystem::ReadOnlyBlockCacheStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x317802 || 2 || 6332 || Attempted to call nn::fssystem::IntegrityRomFsStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x317A02 || 2 || 6333 || Attempted to call nn::fssystem::save::DuplexStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x317C02 || 2 || 6334 || Invalid Operation ID in nn::fssystem::save::DuplexStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x317E02 || 2 || 6335 || Attempted to call nn::fssystem::save::HierarchicalDuplexStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x318002 || 2 || 6336 || Attempted to call nn::fssystem::save::RemapStorage::GetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x318202 || 2 || 6337 || Attempted to call nn::fssystem::save::RemapStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x318402 || 2 || 6338 || Invalid Operation ID in nn::fssystem::save::RemapStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x318602 || 2 || 6339 || Attempted to call nn::fssystem::save::IntegritySaveDataStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x318802 || 2 || 6340 || Invalid Operation ID in nn::fssystem::save::IntegritySaveDataStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x318A02 || 2 || 6341 || Attempted to call nn::fssystem::save::JournalIntegritySaveDataStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x318C02 || 2 || 6342 || Invalid Operation ID in nn::fssystem::save::JournalIntegritySaveDataStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x318E02 || 2 || 6343 || Attempted to call nn::fssystem::save::JournalStorage::GetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x319002 || 2 || 6344 || Attempted to call nn::fssystem::save::JournalStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x319202 || 2 || 6345 || Invalid Operation ID in nn::fssystem::save::JournalStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x319602 || 2 || 6347 || Attempted to call nn::fssystem::dbm::AllocationTableStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x31A602 || 2 || 6355 || Invalid Operation ID in nn::fat::FatFile::DoOperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x31A802 || 2 || 6356 || Invalid Operation ID in nn::fssystem::StorageFile::DoOperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x31AE02 || 2 || 6359 || Invalid Query ID in nn::fssystem::ConcatenationFileSystem::DoQueryEntry&lt;br /&gt;
|-&lt;br /&gt;
| 0x31B002 || 2 || 6360 || Invalid Operation ID in nn::fssystem::ConcatenationFile::DoOperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x31B402 || 2 || 6362 || Invalid Operation ID in nn::fs::detail::FileServiceObjectAdapter::DoOperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x31B602 || 2 || 6363 || Invalid Operation ID in nn::fssystem::AesXtsFile::DoOperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x31B802 || 2 || 6364 || Attempted to modify a nn::fs::RomFsFileSystem&lt;br /&gt;
|-&lt;br /&gt;
| 0x31BA02 || 2 || 6365 || Attempted to call nn::fs::RomFsFileSystem::DoCommitProvisionally&lt;br /&gt;
|-&lt;br /&gt;
| 0x31BC02 || 2 || 6366 || Attempted to query the space in a nn::fs::RomFsFileSystem&lt;br /&gt;
|-&lt;br /&gt;
| 0x31BE02 || 2 || 6367 || Attempted to modify a nn::fssystem::RomFsFile&lt;br /&gt;
|-&lt;br /&gt;
| 0x31C002 || 2 || 6368 || Invalid Operation ID in nn::fssystem::RomFsFile::DoOperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x31C202 || 2 || 6369 || Attempted to modify a nn::fs::ReadOnlyFileSystemTemplate&lt;br /&gt;
|-&lt;br /&gt;
| 0x31C402 || 2 || 6370 || Attempted to call nn::fs::ReadOnlyFileSystemTemplate::DoCommitProvisionally&lt;br /&gt;
|-&lt;br /&gt;
| 0x31C602 || 2 || 6371 || Attempted to query the space in a nn::fs::ReadOnlyFileSystemTemplate&lt;br /&gt;
|-&lt;br /&gt;
| 0x31C802 || 2 || 6372 || Attempted to modify a nn::fs::ReadOnlyFileSystemFile&lt;br /&gt;
|-&lt;br /&gt;
| 0x31CA02 || 2 || 6373 || Invalid Operation ID in nn::fs::ReadOnlyFileSystemFile::DoOperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x31CC02 || 2 || 6374 || Attempted to modify a nn::fssystem::PartitionFileSystemCore&lt;br /&gt;
|-&lt;br /&gt;
| 0x31CE02 || 2 || 6375 || Attempted to call nn::fssystem::PartitionFileSystemCore::DoCommitProvisionally&lt;br /&gt;
|-&lt;br /&gt;
| 0x31D002 || 2 || 6376 || Attempted to call nn::fssystem::PartitionFileSystemCore::PartitionFile::DoSetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x31D202 || 2 || 6377 || Invalid Operation ID in nn::fssystem::PartitionFileSystemCore::PartitionFile::DoOperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x31DC02 || 2 || 6382 || Attempted to call nn::fssystem::ApplicationTemporaryFileSystem::DoCommitProvisionally&lt;br /&gt;
|-&lt;br /&gt;
| 0x31DE02 || 2 || 6383 || Attempted to call nn::fssystem::SaveDataFileSystem::DoCommitProvisionally&lt;br /&gt;
|-&lt;br /&gt;
| 0x31E002 || 2 || 6384 || Attempted to call nn::fssystem::DirectorySaveDataFileSystem::DoCommitProvisionally&lt;br /&gt;
|-&lt;br /&gt;
| 0x320002 || 2 || 6400 || Permission denied&lt;br /&gt;
|-&lt;br /&gt;
| 0x326602 || 2 || 6451 || Missing titlekey(?) required to mount content&lt;br /&gt;
|-&lt;br /&gt;
| 0x326E02 || 2 || 6455 || File not closed&lt;br /&gt;
|-&lt;br /&gt;
| 0x327002 || 2 || 6456 || Directory not closed&lt;br /&gt;
|-&lt;br /&gt;
| 0x327202 || 2 || 6457 || Writable file not closed when committing&lt;br /&gt;
|-&lt;br /&gt;
| 0x327402 || 2 || 6458 || FS allocators already registered&lt;br /&gt;
|-&lt;br /&gt;
| 0x327602 || 2 || 6459 || FS allocators already used&lt;br /&gt;
|-&lt;br /&gt;
| 0x327A02 || 2 || 6461 || FS allocator alignment violation&lt;br /&gt;
|-&lt;br /&gt;
| 0x339402 || 2 || 6602 || File not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0x339602 || 2 || 6603 || Directory not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0x35F202 || 2 || 6905 || Mount name not found in table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DBC02 || 2 || 7902 || RomFs table: Entry not found in dictionary&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DBE02 || 2 || 7903 || RomFs table: File not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DC002 || 2 || 7904 || RomFs table: Directory not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DC402 || 2 || 7906 || RomFs table: Entry already exists when trying to add a new entry&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DC602 || 2 || 7907 || RomFs table: Insufficient space to add new entry&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DC802 || 2 || 7908 || RomFs table: Unable to add new directory&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DCA02 || 2 || 7909 || RomFs table: Unable to add new file&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DCC02 || 2 || 7910 || RomFs directory has no more child directories/files when iterating&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DD402 || 2 || 7914 || RomFs table: Path is file, not directory&lt;br /&gt;
|-&lt;br /&gt;
| 0x803 || 3 || 4 || OS busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xE03 || 3 || 7 || Invalid parameter&lt;br /&gt;
|-&lt;br /&gt;
| 0x1003 || 3 || 8 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x1203 || 3 || 9 || Out of resources&lt;br /&gt;
|-&lt;br /&gt;
| 0x3EA03 || 3 || 501 || Invalid handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x3EE03 || 3 || 503 || Invalid memory mirror&lt;br /&gt;
|-&lt;br /&gt;
| 0x7FE03 || 3 || 1023 || TLS slot is not allocated&lt;br /&gt;
|-&lt;br /&gt;
| 0xA05 || 5 || 5 || [[Content_Manager_services|NcaID]] not found. Returned when attempting to mount titles which exist that aren&#039;t *8XX titles, the same way *8XX titles are mounted.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE05 || 5 || 7 || TitleId not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x1805 || 5 || 12 || Invalid StorageId&lt;br /&gt;
|-&lt;br /&gt;
| 0xDC05 || 5 || 110 || Gamecard not inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x17C05 || 5 || 190 || Gamecard not initialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F405 || 5 || 250 || Sdcard not inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x20805 || 5 || 260 || Storage not mounted&lt;br /&gt;
|-&lt;br /&gt;
| 0x806 || 6 || 4 || Converted from error 0xD401&lt;br /&gt;
|-&lt;br /&gt;
| 0x1006 || 6 || 8 || Converted from error 0xE401&lt;br /&gt;
|-&lt;br /&gt;
| 0x408 || 8 || 2 || Program location entry not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x608 || 8 || 3 || Invalid context for control location&lt;br /&gt;
|-&lt;br /&gt;
| 0x808 || 8 || 4 || Storage not found&lt;br /&gt;
|-&lt;br /&gt;
| 0xA08 || 8 || 5 || Access denied&lt;br /&gt;
|-&lt;br /&gt;
| 0xC08 || 8 || 6 || Offline manual HTML location entry not found&lt;br /&gt;
|-&lt;br /&gt;
| 0xE08 || 8 || 7 || Title is not registered&lt;br /&gt;
|-&lt;br /&gt;
| 0x1008 || 8 || 8 || Control location entry for host not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x1208 || 8 || 9 || Legal info HTML location entry not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x1408 || 8 || 10 || Program location for debug entry not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x209 || 9 || 1 || Args too long.&lt;br /&gt;
|-&lt;br /&gt;
| 0x409 || 9 || 2 || Maximum processes loaded.&lt;br /&gt;
|-&lt;br /&gt;
| 0x609 || 9 || 3 || NPDM too big.&lt;br /&gt;
|-&lt;br /&gt;
| 0x809 || 9 || 4 || Invalid NPDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA09 || 9 || 5 || Invalid NSO.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC09 || 9 || 6 || Invalid Path.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE09 || 9 || 7 || Already registered.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1009 || 9 || 8 || Title not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1209 || 9 || 9 || Title-id in ACI0 doesn&#039;t match range in ACID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1409 || 9 || 10 || Invalid version in NPDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6609 || 9 || 51 || Insufficient address space.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6809 || 9 || 52 || Insufficient NRO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A09 || 9 || 53 || Invalid NRR&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C09 || 9 || 54 || Invalid signature&lt;br /&gt;
|-&lt;br /&gt;
| 0x6E09 || 9 || 55 || Insufficient NRO registrations.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7009 || 9 || 56 || Insufficient NRR registrations.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7209 || 9 || 57 || NRO Already loaded.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA209 || 9 || 81 || Unaligned NRR address&lt;br /&gt;
|-&lt;br /&gt;
| 0xA409 || 9 || 82 || Bad NRR size&lt;br /&gt;
|-&lt;br /&gt;
| 0xA809 || 9 || 84 || NRR Not Loaded.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAA09 || 9 || 85 || Bad NRR address&lt;br /&gt;
|-&lt;br /&gt;
| 0xAE09 || 9 || 87 || Bad initialization&lt;br /&gt;
|-&lt;br /&gt;
| 0xC809 || 9 || 100 || Unknown ACI0 descriptor&lt;br /&gt;
|-&lt;br /&gt;
| 0xCE09 || 9 || 103 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;KernelFlags&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xD009 || 9 || 104 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;SyscallMask&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xD409 || 9 || 106 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;MapIoOrNormalRange&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xD609 || 9 || 107 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;MapNormalPage&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xDE09 || 9 || 111 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;InterruptPair&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xE209 || 9 || 113 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;ApplicationType&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xE409 || 9 || 114 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;KernelReleaseVersion&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xE609 || 9 || 115 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;HandleTableSize&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xE809 || 9 || 116 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;DebugFlags&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0x1940A || 10 || 202 || Invalid CMIF header size.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A60A || 10 || 211 || Invalid CMIF input header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A80A || 10 || 212 || Invalid CMIF output header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1BA0A || 10 || 221 || Invalid method dispatch ID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D60A || 10 || 235 || Invalid in object count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D80A || 10 || 236 || Invalid out object count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x25A0A || 10 || 301 || Out of domain entries.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20B || 11 || 1 || Unsupported operation&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC0B || 11 || 102 || Out of server session memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A0B || 11 || 141 || Went past maximum during marshalling.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1900B || 11 || 200 || Session doesn&#039;t support domains.&lt;br /&gt;
|-&lt;br /&gt;
| 0x25A0B || 11 || 301 || Remote process is dead.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3260B || 11 || 403 || Unknown request type&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D60B || 11 || 491 || IPC Query 1 failed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20F || 15 || 1 || Pid not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x60F || 15 || 3 || Process has no pending events&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0F || 15 || 5 || Application already running&lt;br /&gt;
|-&lt;br /&gt;
| 0x410 || 16 || 2 || Title-id not found&lt;br /&gt;
|-&lt;br /&gt;
| 0xF010 || 16 || 120 || Gamecard sysupdate not required&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F610 || 16 || 251 || Unexpected StorageId&lt;br /&gt;
|-&lt;br /&gt;
| 0x215 || 21 || 1 || Out of processes&lt;br /&gt;
|-&lt;br /&gt;
| 0x415 || 21 || 2 || Not initialized.&lt;br /&gt;
|-&lt;br /&gt;
| 0x615 || 21 || 3 || Max sessions&lt;br /&gt;
|-&lt;br /&gt;
| 0x815 || 21 || 4 || Service already registered&lt;br /&gt;
|-&lt;br /&gt;
| 0xA15 || 21 || 5 || Out of services&lt;br /&gt;
|-&lt;br /&gt;
| 0xC15 || 21 || 6 || Invalid name (all zeroes)&lt;br /&gt;
|-&lt;br /&gt;
| 0xE15 || 21 || 7 || Service not registered&lt;br /&gt;
|-&lt;br /&gt;
| 0x1015 || 21 || 8 || Permission denied&lt;br /&gt;
|-&lt;br /&gt;
| 0x1215 || 21 || 9 || Service Access Control too big.&lt;br /&gt;
|-&lt;br /&gt;
| 0x416 || 22 || 2 || Address space is full&lt;br /&gt;
|-&lt;br /&gt;
| 0x616 || 22 || 3 || NRO already loaded&lt;br /&gt;
|-&lt;br /&gt;
| 0x816 || 22 || 4 || Invalid NRO header values&lt;br /&gt;
|-&lt;br /&gt;
| 0xC16 || 22 || 6 || Bad NRR magic&lt;br /&gt;
|-&lt;br /&gt;
| 0x1016 || 22 || 8 || Reached max NRR count&lt;br /&gt;
|-&lt;br /&gt;
| 0x1216 || 22 || 9 || Unable to verify NRO hash or NRR signature&lt;br /&gt;
|-&lt;br /&gt;
| 0x80216 || 22 || 1025 || Address not page-aligned&lt;br /&gt;
|-&lt;br /&gt;
| 0x80416 || 22 || 1026 || Incorrect NRO size&lt;br /&gt;
|-&lt;br /&gt;
| 0x80816 || 22 || 1028 || NRO not loaded&lt;br /&gt;
|-&lt;br /&gt;
| 0x80A16 || 22 || 1029 || NRR not loaded&lt;br /&gt;
|-&lt;br /&gt;
| 0x80C16 || 22 || 1030 || Already initialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x80E16 || 22 || 1031 || Not initialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x21A || 26 || 1 || SMC is not implemented&lt;br /&gt;
|-&lt;br /&gt;
| 0x41A || 26 || 2 || SMC argument is invalid&lt;br /&gt;
|-&lt;br /&gt;
| 0x61A || 26 || 3 || SMC is currently in progress/secmon is busy&lt;br /&gt;
|-&lt;br /&gt;
| 0x81A || 26 || 4 || Secmon not currently performing async operation&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1A || 26 || 5 || Invalid SMC async callback key&lt;br /&gt;
|-&lt;br /&gt;
| 0xC1A || 26 || 6 || SMC is blacklisted during current boot&lt;br /&gt;
|-&lt;br /&gt;
| 0xC81A || 26 || 100 || Invalid (buffer) size&lt;br /&gt;
|-&lt;br /&gt;
| 0xCA1A || 26 || 101 || Unknown SMC error&lt;br /&gt;
|-&lt;br /&gt;
| 0xCA1A || 26 || 101 || Decryption failure&lt;br /&gt;
|-&lt;br /&gt;
| 0xD01A || 26 || 104 || No AES keyslots available&lt;br /&gt;
|-&lt;br /&gt;
| 0xD21A || 26 || 105 || Invalid AES keyslot&lt;br /&gt;
|-&lt;br /&gt;
| 0xD41A || 26 || 106 || BootReason already set&lt;br /&gt;
|-&lt;br /&gt;
| 0xD61A || 26 || 107 || BootReason not set&lt;br /&gt;
|-&lt;br /&gt;
| 0xD81A || 26 || 108 || Invalid argument&lt;br /&gt;
|-&lt;br /&gt;
| 0x19269 || 105 || 201 || Null settings name&lt;br /&gt;
|-&lt;br /&gt;
| 0x19469 || 105 || 202 || Null settings key&lt;br /&gt;
|-&lt;br /&gt;
| 0x19669 || 105 || 203 || Null settings value&lt;br /&gt;
|-&lt;br /&gt;
| 0x19A69 || 105 || 205 || Null settings value buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A069 || 105 || 208 || Null setting value size buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A269 || 105 || 209 || Null debug mode flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x1BA69 || 105 || 221 || Setting group name has zero length&lt;br /&gt;
|-&lt;br /&gt;
| 0x1BC69 || 105 || 222 || Empty settings item key&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E269 || 105 || 241 || Setting group name is too long (64 character limit?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E469 || 105 || 242 || Setting name is too long (64 character limit?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x20A69 || 105 || 261 || Setting group name ends with &#039;.&#039; or contains invalid characters (allowed: [a-z0-9_\-.])&lt;br /&gt;
|-&lt;br /&gt;
| 0x20C69 || 105 || 262 || Setting name ends with &#039;.&#039; or contains invalid characters (allowed: [a-z0-9_\-.])&lt;br /&gt;
|-&lt;br /&gt;
| 0x4DA69 || 105 || 621 || Null language code buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x4EE69 || 105 || 631 || Null network settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F069 || 105 || 632 || Null network settings output count buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x50269 || 105 || 641 || Null backlight settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x51669 || 105 || 651 || Null Bluetooth device setting buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x51869 || 105 || 652 || Null Bluetooth device setting output count buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x51A69 || 105 || 653 || Null Bluetooth enable flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x51C69 || 105 || 654 || Null Bluetooth AFH enable flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x51E69 || 105 || 655 || Null Bluetooth boost enable flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x52069 || 105 || 656 || Null BLE pairing settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x52269 || 105 || 657 || Null BLE pairing settings entry count buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x52A69 || 105 || 661 || Null external steady clock source ID buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x52C69 || 105 || 662 || Null user system clock context buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x52E69 || 105 || 663 || Null network system clock context buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x53069 || 105 || 664 || Null user system clock automatic correction enabled flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x53269 || 105 || 665 || Null shutdown RTC value buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x53469 || 105 || 666 || Null external steady clock internal offset buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x53E69 || 105 || 671 || Null account settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x55269 || 105 || 681 || Null audio volume buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x55669 || 105 || 683 || Null ForceMuteOnHeadphoneRemoved buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x55869 || 105 || 684 || Null headphone volume warning count buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x55E69 || 105 || 687 || Invalid audio output mode&lt;br /&gt;
|-&lt;br /&gt;
| 0x56069 || 105 || 688 || Null headphone volume update flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x56669 || 105 || 691 || Null console information upload flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x57A69 || 105 || 701 || Null automatic application download flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x57C69 || 105 || 702 || Null notification settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x57E69 || 105 || 703 || Null account notification settings entry count buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x58069 || 105 || 704 || Null account notification settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x58E69 || 105 || 711 || Null vibration master volume buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x59069 || 105 || 712 || Null NX controller settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x59269 || 105 || 713 || Null NX controller settings entry count buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x59469 || 105 || 714 || Null USB full key enable flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A269 || 105 || 721 || Null TV settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A469 || 105 || 722 || Null EDID buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5B669 || 105 || 731 || Null data deletion settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5CA69 || 105 || 741 || Null initial system applet program ID buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5CC69 || 105 || 742 || Null overlay disp program ID buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5CE69 || 105 || 743 || Null IsInRepairProcess buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D069 || 105 || 744 || Null RequiresRunRepairTimeReviser buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5DE69 || 105 || 751 || Null device timezone location name buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F269 || 105 || 761 || Null primary album storage buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x60669 || 105 || 771 || Null USB 3.0 enable flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x60869 || 105 || 772 || Null USB Type-C power source circuit version buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x61A69 || 105 || 781 || Null battery lot buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x62E69 || 105 || 791 || Null serial number buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x64269 || 105 || 801 || Null lock screen flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x64669 || 105 || 803 || Null color set ID buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x64869 || 105 || 804 || Null quest flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x64A69 || 105 || 805 || Null wireless certification file size buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x64C69 || 105 || 806 || Null wireless certification file buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x64E69 || 105 || 807 || Null initial launch settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x65069 || 105 || 808 || Null device nickname buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x65269 || 105 || 809 || Null battery percentage flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x65469 || 105 || 810 || Null applet launch flags buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x7E869 || 105 || 1012 || Null wireless LAN enable flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x7FA69 || 105 || 1021 || Null product model buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x80E69 || 105 || 1031 || Null NFC enable flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x82269 || 105 || 1041 || Null ECI device certificate buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x82469 || 105 || 1042 || Null E-Ticket device certificate buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x83669 || 105 || 1051 || Null sleep settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x84A69 || 105 || 1061 || Null EULA version buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x84C69 || 105 || 1062 || Null EULA version entry count buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x85E69 || 105 || 1071 || Null LDN channel buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x87269 || 105 || 1081 || Null SSL key buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x87469 || 105 || 1082 || Null SSL certificate buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x88669 || 105 || 1091 || Null telemetry flags buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x89A69 || 105 || 1101 || Null Gamecard key buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x89C69 || 105 || 1102 || Null Gamecard certificate buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8AE69 || 105 || 1111 || Null PTM battery lot buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B069 || 105 || 1112 || Null PTM fuel gauge parameter buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C269 || 105 || 1121 || Null ECI device key buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C469 || 105 || 1122 || Null E-Ticket device key buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D669 || 105 || 1131 || Null speaker parameter buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8EA69 || 105 || 1141 || Null firmware version buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8EC69 || 105 || 1142 || Null firmware version digest buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8EE69 || 105 || 1143 || Null rebootless system update version buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8FE69 || 105 || 1151 || Null Mii author ID buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x91269 || 105 || 1161 || Null fatal flags buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x92669 || 105 || 1171 || Null auto update enable flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x93A69 || 105 || 1181 || Null external RTC reset flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x94E69 || 105 || 1191 || Null push notification activity mode buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x96269 || 105 || 1201 || Null service discovery control setting buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x97669 || 105 || 1211 || Null error report share permission buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x98A69 || 105 || 1221 || Null LCD vendor ID buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x99E69 || 105 || 1231 || Null console SixAxis sensor acceleration bias buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9A069 || 105 || 1232 || Null console SixAxis sensor angular velocity bias buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9A269 || 105 || 1233 || Null console SixAxis sensor acceleration gain buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9A469 || 105 || 1234 || Null console SixAxis sensor angular velocity gain buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9A669 || 105 || 1235 || Null console SixAxis sensor angular velocity time bias buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9A869 || 105 || 1236 || Null console SixAxis sensor angular acceleration buffer &lt;br /&gt;
|-&lt;br /&gt;
| 0x9B269 || 105 || 1241 || Null keyboard layout buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9BA69 || 105 || 1245 || Invalid keyboard layout&lt;br /&gt;
|-&lt;br /&gt;
| 0x9C669 || 105 || 1251 || Null web inspector flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9C869 || 105 || 1252 || Null allowed SSL hosts buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9CA69 || 105 || 1253 || Null allowed SSL hosts entry count buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9CC69 || 105 || 1254 || Null host FS mount point buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9EE69 || 105 || 1271 || Null Amiibo key buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9F069 || 105 || 1272 || Null Amiibo ECQV certificate buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9F269 || 105 || 1273 || Null Amiibo ECDSA certificate buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9F469 || 105 || 1274 || Null Amiibo ECQV BLS key buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9F669 || 105 || 1275 || Null Amiibo ECQV BLS certificate buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9F869 || 105 || 1276 || Null Amiibo ECQV BLS root certificate buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x272 || 114 || 1 || Generic error&lt;br /&gt;
|-&lt;br /&gt;
| 0xC72 || 114 || 6 || Unsupported operation&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || 116 || 0 || Time service not initialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x274 || 116 || 1 || Permission denied&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC74 || 116 || 102 || Time not set / Clock Source Id mismatch&lt;br /&gt;
|-&lt;br /&gt;
| 0x19074 || 116 || 200 || Invalid time comparison&lt;br /&gt;
|-&lt;br /&gt;
| 0x19274 || 116 || 201 || Signed overflow/underflow&lt;br /&gt;
|-&lt;br /&gt;
| 0x64274 || 116 || 801 || Memory allocation failure&lt;br /&gt;
|-&lt;br /&gt;
| 0x70A74 || 116 || 901 || Null pointer&lt;br /&gt;
|-&lt;br /&gt;
| 0x70C74 || 116 || 902 || Value out of valid range&lt;br /&gt;
|-&lt;br /&gt;
| 0x70E74 || 116 || 903 || TimeZoneRule conversion failed&lt;br /&gt;
|-&lt;br /&gt;
| 0x7BA74 || 116 || 989 || TimeZone location name not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x7BC74 || 116 || 990 || Unimplemented functionality&lt;br /&gt;
|-&lt;br /&gt;
| 0x27A || 122 || 1 || Invalid argument&lt;br /&gt;
|-&lt;br /&gt;
| 0x47A || 122 || 2 || Object not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x67A || 122 || 3 || Object locked/in used&lt;br /&gt;
|-&lt;br /&gt;
| 0x87A || 122 || 4 || Target already mounted&lt;br /&gt;
|-&lt;br /&gt;
| 0xA7A || 122 || 5 || Target not mounted&lt;br /&gt;
|-&lt;br /&gt;
| 0xC7A || 122 || 6 || Object already opened&lt;br /&gt;
|-&lt;br /&gt;
| 0xE7A || 122 || 7 || Object not opened&lt;br /&gt;
|-&lt;br /&gt;
| 0xA07A || 122 || 80 || Passphrase not found&lt;br /&gt;
|-&lt;br /&gt;
| 0xA27A || 122 || 81 || Data verification failed&lt;br /&gt;
|-&lt;br /&gt;
| 0xB47A || 122 || 90 || Invalid API call&lt;br /&gt;
|-&lt;br /&gt;
| 0xC47A || 122 || 98 || Invalid operation&lt;br /&gt;
|-&lt;br /&gt;
| 0x287C || 124 || 20 || Argument is NULL&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C7C || 124 || 22 || Argument is invalid&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C7C || 124 || 30 || Bad input buffer size&lt;br /&gt;
|-&lt;br /&gt;
| 0x407C || 124 || 32 || Invalid input buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x27E || 126 || 1 || Invalid argument&lt;br /&gt;
|-&lt;br /&gt;
| 0x87E || 126 || 4 || Entry not found&lt;br /&gt;
|-&lt;br /&gt;
| 0xCE7E || 126 || 67 || Invalid database signature value (should be &amp;quot;NFDB&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| 0xD27E || 126 || 69 || Invalid database entry count&lt;br /&gt;
|-&lt;br /&gt;
| 0x1987E || 126 || 204 || Development/debug-only behavior&lt;br /&gt;
|-&lt;br /&gt;
| 0x480 || 128 || 2 || IStorage not available.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4680 || 128 || 35 || Error while launching applet.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A80 || 128 || 37 || Title-ID not found. Caused by code 0x410 when applet launch fails&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E880 || 128 || 500 || Invalid input&lt;br /&gt;
|-&lt;br /&gt;
| 0x3EC80 || 128 || 502 || IStorage has already been opened by another accessor&lt;br /&gt;
|-&lt;br /&gt;
| 0x3EE80 || 128 || 503 || IStorage Read/Write out-of-bounds&lt;br /&gt;
|-&lt;br /&gt;
| 0x3FE80 || 128 || 511 || IStorage opened as wrong type (data opened as transfermem, transfermem opened as data)&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080 || 128 || 512 || Unbalanced fatal section leave (returned when executing LeaveFatalSection without a preceding EnterFatalSection call)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B080 || 128 || 600 || Failed to allocate memory for IStorage&lt;br /&gt;
|-&lt;br /&gt;
| 0x59080 || 128 || 712 || Thread stack pool exhausted (out of memory)&lt;br /&gt;
|-&lt;br /&gt;
| 0x79C80 || 128 || 974 || DebugMode not enabled&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A880 || 128 || 980 || &amp;lt;code&amp;gt;am.debug!dev_function&amp;lt;/code&amp;gt; setting needs to be set / DebugMode not enabled&lt;br /&gt;
|-&lt;br /&gt;
| 0x7CC80 || 128 || 998 || Not Implemented&lt;br /&gt;
|-&lt;br /&gt;
| 0xA83 || 131 || 5 || Unrecognized applet ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x485 || 133 || 2 || Invalid DVFS table ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x885 || 133 || 4 || Invalid parameter&lt;br /&gt;
|-&lt;br /&gt;
| 0x3CF089 || 137 || 7800 || Unknown/invalid libcurl error.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E8289-0x3F4089 || 137 || 8001-8096 || libcurl error 1-96. Some of the libcurl errors in the error-table map to the above unknown-libcurl-error however.&lt;br /&gt;
|-&lt;br /&gt;
| 0x68A || 138 || 3 || Not initialized.&lt;br /&gt;
|-&lt;br /&gt;
| 0x668C || 140 || 51 || USB data-transfer in progress&lt;br /&gt;
|-&lt;br /&gt;
| 0xD48C || 140 || 106 || Invalid descriptor&lt;br /&gt;
|-&lt;br /&gt;
| 0x1928C || 140 || 201 || USB device not bound / interface already enabled&lt;br /&gt;
|-&lt;br /&gt;
| 0x290 || 144 || 1 || Exited Abnormally ([[Applet_Manager_services#LibraryAppletExitReason|ExitReason]] == Abormal)&lt;br /&gt;
|-&lt;br /&gt;
| 0x690 || 144 || 3 || Canceled ([[Applet_Manager_services#LibraryAppletExitReason|ExitReason]] == Canceled)&lt;br /&gt;
|-&lt;br /&gt;
| 0x890 || 144 || 4 || Rejected&lt;br /&gt;
|-&lt;br /&gt;
| 0xA90 || 144 || 5 || Exited Unexpectedly ([[Applet_Manager_services#LibraryAppletExitReason|ExitReason]] == Unexpected)&lt;br /&gt;
|-&lt;br /&gt;
| 0x299 || 153 || 1 || Invalid audio device&lt;br /&gt;
|-&lt;br /&gt;
| 0x499 || 153 || 2 || Operation couldn&#039;t complete successfully&lt;br /&gt;
|-&lt;br /&gt;
| 0x699 || 153 || 3 || Invalid sample rate&lt;br /&gt;
|-&lt;br /&gt;
| 0x899 || 153 || 4 || Buffer size too small&lt;br /&gt;
|-&lt;br /&gt;
| 0x1099 || 153 || 8 || Too many buffers are still unreleased&lt;br /&gt;
|-&lt;br /&gt;
| 0x1499 || 153 || 10 || Invalid channel count&lt;br /&gt;
|-&lt;br /&gt;
| 0x40299 || 153 || 513 || Invalid/Unsupported operation&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0099 || 153 || 1536 || Invalid handle&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0899 || 153 || 1540 || Audio output was already started&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C9D || 157 || 30 || Address is NULL&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E9D || 157 || 31 || PID is NULL&lt;br /&gt;
|-&lt;br /&gt;
| 0x549D || 157 || 42 || Already bound&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC9D || 157 || 102 || Invalid PID&lt;br /&gt;
|-&lt;br /&gt;
| 0xAA3 || 163 ||  5 || System is booting up repair process without VOL+ held down.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCA3 || 163 || 6 || System is booting up repair process that requires RepairTimeReviser but does not have special cartridge inserted.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC8B2 || 178 || 100 || Invalid user ID&lt;br /&gt;
|-&lt;br /&gt;
| 0xCAB2 || 178 || 101 || User does not exist&lt;br /&gt;
|-&lt;br /&gt;
| 0x12CB2 || 178 || 150 || Service unavailable&lt;br /&gt;
|-&lt;br /&gt;
| 0x190B2 || 178 || 200 || File storage failure&lt;br /&gt;
|-&lt;br /&gt;
| 0x58ACA || 202 || 709 || Npad ID is out of range.&lt;br /&gt;
|-&lt;br /&gt;
| 0xF0CD || 205 || 120 || IR image data not available/ready.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A8CD || 205 || 212 || IR camera handle pointer is null.&lt;br /&gt;
|-&lt;br /&gt;
| 0x198CD || 205 || 204 || IR camera invalid handle value.&lt;br /&gt;
|-&lt;br /&gt;
| 0x35B || 347 || 1 || Failed to init SM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x55B || 347 || 2 || Failed to init FS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x75B || 347 || 3 || Failed to open NRO file. May also happen when SD card isn&#039;t inserted / SD mounting failed earlier.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95B || 347 || 4 || Failed to read NRO header.&lt;br /&gt;
|-&lt;br /&gt;
| 0xB5B || 347 || 5 || Invalid NRO magic.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD5B || 347 || 6 || Invalid NRO segments.&lt;br /&gt;
|-&lt;br /&gt;
| 0xF5B || 347 || 7 || Failed to read NRO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x135B || 347 || 9 || Failed to allocate heap.&lt;br /&gt;
|-&lt;br /&gt;
| 0x255B || 347 || 18 || Failed to map code-binary memory.&lt;br /&gt;
|-&lt;br /&gt;
| 0x275B || 347 || 19 || Failed to map code memory (.text).&lt;br /&gt;
|-&lt;br /&gt;
| 0x295B || 347 || 20 || Failed to map code memory (.rodata).&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B5B || 347 || 21 || Failed to map code memory (.data+.bss).&lt;br /&gt;
|-&lt;br /&gt;
| 0x315B || 347 || 24 || Failed to unmap code memory (.text).&lt;br /&gt;
|-&lt;br /&gt;
| 0x335B || 347 || 25 || Failed to unmap code memory (.rodata).&lt;br /&gt;
|-&lt;br /&gt;
| 0x355B || 347 || 26 || Failed to unmap code memory (.data+.bss).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FS Error Codes ==&lt;br /&gt;
The following are the error codes recognized by nn::fs::detail::LogErrorMessage found in some [[Factory Setup|factory]] titles:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Description || Message&lt;br /&gt;
|-&lt;br /&gt;
| 0x7802 || 60 || nn::fs::ResultMountNameAlreadyExists: Error: Specified mount name already exists.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD401 || 106 || nn::svc::ResultInvalidCurrentMemory: Error: Passed buffer is not usable for fs library. See a manual of fs library for more information.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D202 || 1001 || nn::fs::ResultPartitionNotFound: Error: Specified partition is not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D402 || 1002 || nn::fs::ResultTargetNotFound: Error: Specified target is not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0xFA002 - 0x138602 || 2000 - 2499 || nn::fs::ResultSdCardAccessFailed: Error: Failed to access SD card.&lt;br /&gt;
|-&lt;br /&gt;
| 0x136802 - 0x176E02 || 2500 - 2999 || nn::fs::ResultGameCardAccessFailed: Error: Failed to access game card.&lt;br /&gt;
|-&lt;br /&gt;
| 0x177202 || 3001 || nn::fs::ResultNotImplemented: Error: Specified operation is not implemented.&lt;br /&gt;
|-&lt;br /&gt;
| 0x177A02 || 3005 || nn::fs::ResultOutOfRange: Error: Specified value is out of range.&lt;br /&gt;
|-&lt;br /&gt;
| 0x190002 - 0x1B5602 || 3200 - 3499 || nn::fs::ResultAllocationMemoryFailed: Error: Failed to allocate memory.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B5802 - 0x1F3E02 || 3500 - 3999 || nn::fs::ResultMmcAccessFailed: Error: Failed to access MMC.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F4202 - 0x219602 || 4001 - 4299 || nn::fs::ResultRomCorrupted: Error: ROM is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x219A02 - 0x232602 || 4301 - 4499 || nn::fs::ResultSaveDataCorrupted: Error: Save data is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x232A02 - 0x23EE02 || 4501 - 4599 || nn::fs::ResultNcaCorrupted: Error: NCA is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23F202 - 0x243E02 || 4601 - 4639 || nn::fs::ResultIntegrityVerificationStorageCorrupted: Error: Integrity verification failed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x244202 - 0x246602 || 4641 - 4659 || nn::fs::ResultPartitionFileSystemCorrupted: Error: Partition FS is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x246A02 - 0x248E02 || 4661 - 4679 || nn::fs::ResultBuiltInStorageCorrupted: Error: Built-in-storage is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x249202 - 0x24B602 || 4681 - 4699 || nn::fs::ResultFatFileSystemCorrupted: Error: FAT FS is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24BA02 - 0x24DE02 || 4701 - 4719 || nn::fs::ResultHostFileSystemCorrupted: Error: HOST FS is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F4002 - 0x270E02 || 4000, 4300, 4500, 4600, 4640, 4660, 4680, 4700, 4720-4999 || nn::fs::ResultDataCorrupted: Error: Data is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x271002 - 0x2EDE02 || 5000-5999 || nn::fs::ResultUnexpected: Error: Unexpected failure occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE002 - 0x32C602 || 6000-6499 || nn::fs::ResultPreconditionViolation: Error: Precondition violation.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE202 - 0x306E02 || 6001-6199 || nn::fs::ResultInvalidArgument: Error: Invalid argument was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE402 - 0x2F1A02 || 6002-6029 || nn::fs::ResultInvalidPath: Error: Invalid path was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE602 || 6003 || nn::fs::ResultTooLongPath: Error: Too long path was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE802 || 6004 || nn::fs::ResultInvalidCharacter: Error: Invalid path character was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EEA02 || 6005 || nn::fs::ResultInvalidPathFormat: Error: Invalid path format was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F5A02 || 6061 || nn::fs::ResultInvalidOffset: Error: Invalid offset was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F5C02 || 6062 || nn::fs::ResultInvalidSize: Error: Invalid size was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F5E02 || 6063 || nn::fs::ResultNullptrArgument: Error: Null pointer argument was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F6202 || 6065 || nn::fs::ResultInvalidMountName: Error: Invalid mount name was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F6402 || 6066 || nn::fs::ResultExtensionSizeTooLarge: Error: Extension size exceeds max value set in nmeta file.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F6602 || 6067 || nn::fs::ResultExtensionSizeInvalid: Error: Extension size is not a multiple of nn::fs::SaveDataExtensionUnitSize.&lt;br /&gt;
|-&lt;br /&gt;
| 0x307202 || 6201 || nn::fs::ResultFileExtensionWithoutOpenModeAllowAppend: Error: OpenMode_AllowAppend is required for implicit extension of file size by WriteFile().&lt;br /&gt;
|-&lt;br /&gt;
| 0x307002 - 0x313602 || 6200, 6202 - 6299 || nn::fs::ResultInvalidOperationForOpenMode: Error: Invalid operation for the open mode.&lt;br /&gt;
|-&lt;br /&gt;
| 0x313802 - 0x31FE02 || 6300-6399 || nn::fs::ResultUnsupportedOperation: Error: Unsupported operation.&lt;br /&gt;
|-&lt;br /&gt;
| 0x320002 - 0x326202 || 6400-6449 || nn::fs::ResultPermissionDenied: Error: Permission denied.&lt;br /&gt;
|-&lt;br /&gt;
| 0x327202 || 6457 || nn::fs::ResultWriteModeFileNotClosed: Error: Close files opened in write mode before committing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x328202 || 6465 || nn::fs::ResultUserNotExist: Error: Specified user doesn&#039;t exist.&lt;br /&gt;
|-&lt;br /&gt;
| 0x346402 || 6706 || nn::fs::ResultMappingTableFull: Error: Enough journal space is not left.&lt;br /&gt;
|-&lt;br /&gt;
| 0x346A02 || 6709 || nn::fs::ResultOpenCountLimit: Error: The open count of files and directories reached the limitation.&lt;br /&gt;
|-&lt;br /&gt;
| 0x353602 || 6811 || nn::fs::ResultMapFull: Error: Save data extension count reached the limitation.&lt;br /&gt;
|-&lt;br /&gt;
| 0x35F202 || 6905 || nn::fs::ResultNotMounted: Error: Specified mount name is not found.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Fatal Errors =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Error || Description&lt;br /&gt;
|-&lt;br /&gt;
| 2162-0002&lt;br /&gt;
| Can be triggered by running [[SVC|svcBreak]]. The svcBreak params have no effect on the value of the thrown error-code.&lt;br /&gt;
|-&lt;br /&gt;
| 2168-0000&lt;br /&gt;
| Userland ARM undefined instruction exception&lt;br /&gt;
|-&lt;br /&gt;
| 2168-0001&lt;br /&gt;
| Userland ARM prefetch-abort due to PC set to non-executable region&lt;br /&gt;
|-&lt;br /&gt;
| 2168-0002&lt;br /&gt;
| Userland ARM data abort. Also caused by abnormal process termination via [[SVC|svcExitProcess]]. Note: directly jumping to nnMain()-retaddr from non-main-thread has the same result.&lt;br /&gt;
|-&lt;br /&gt;
| 2168-0003&lt;br /&gt;
| Userland PC address not aligned to 4 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 2168-0008&lt;br /&gt;
| Can occur when attempting to call an svc outside the whitelist&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Support Errors =&lt;br /&gt;
This section is for Support Errors displayed by the error-applet, separate from the normal Result errors.&lt;br /&gt;
&lt;br /&gt;
== Support Modules ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 800 || [[Internet_Browser|General web-applet]]&lt;br /&gt;
|-&lt;br /&gt;
| 809 || [[Internet_Browser|WifiWebAuthApplet]]&lt;br /&gt;
|-&lt;br /&gt;
| 810 || [[Internet_Browser|Whitelisted-applet]]&lt;br /&gt;
|-&lt;br /&gt;
| 811 || [[Internet_Browser|ShopN]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
8XX is for/includes system applets.&lt;br /&gt;
&lt;br /&gt;
== Errors ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Error || Module || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| {web-applets listed above}&lt;br /&gt;
| 2750&lt;br /&gt;
| MP4 parsing failed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Normal error-codes displayed by the system also use the same format as fatal-errors.&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7965</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7965"/>
		<updated>2019-09-20T07:58:22Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Link resetsignal to doc.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || [[#svcSignalEvent]] || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || [[#svcClearEvent]] || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || [[#svcResetSignal]] || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R1=info_sub_id_lower32, R2=info_id, R3=handle, R4=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr&lt;br /&gt;
R0=name_ptr, R2=max_sessions, R3=is_light&lt;br /&gt;
|| W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32, R5=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr&lt;br /&gt;
R0=meminfo_ptr, R1=addr_lower32, R2=process_handle, R3=addr_upper32&lt;br /&gt;
|| W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz&lt;br /&gt;
R0=process_handle, R1=main_thread_prio, R2=default_cpuid, R3=main_thread_stacksz_lower32, R4=main_thread_stacksz_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]]&lt;br /&gt;
R1=process_handle, R2=[[#ProcessInfoType]]&lt;br /&gt;
|| W0=result, X1=[[#ProcessState]]&lt;br /&gt;
R0=result, R1=[[#ProcessState]]_lower32, R2=[[#ProcessState]]_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value&lt;br /&gt;
R0=reslimit_handle, R1=[[#LimitableResource]], R2=value_lower32, R3=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args&lt;br /&gt;
R0=smc_sub_id, R1, R2, R3=smc_args&lt;br /&gt;
|| X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
R0,R1,R2,R3=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d, and always in the Heap memory region) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition. The memory allocated counts towards the caller&#039;s process Memory ResourceLimit.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Invalid size passed. It&#039;s either bigger than 4GB, or misaligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD001:&#039;&#039;&#039; Size is bigger than the Heap Region size.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; KMemoryBlockAllocator slab allocator exhausted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The memory region is in an invalid state. Likely because a mapping was made in the heap region.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x10801:&#039;&#039;&#039; Memory resource limit reached.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The memory region was reprotected.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Unaligned address specified.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Unaligned or zero size specified.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The provided memory region does not fall within the userland address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD801:&#039;&#039;&#039; Invalid permission specified. Valid permissions are ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The provided memory region was in an invalid state. The region must have the PermissionChangeAllowed bit set in its [[#MemoryState]], and must not have the IsBorrowed or IsUncached [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; Kernel resource exhausted.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcSignalEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Puts the given event in the signaled state.&lt;br /&gt;
&lt;br /&gt;
Will wake up any thread currently waiting on this event. Can potentially trigger a reschedule.&lt;br /&gt;
&lt;br /&gt;
Any calls to [[#svcWaitSynchronization]] on this handle will return immediately, until the event&#039;s signaled state is reset.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Event is now in signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
== svcClearEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent or ReadableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Takes the given event out of the signaled state.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success, the event is now in the not-signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a ReadableEvent nor a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xFA01:&#039;&#039;&#039; The handle was not in a signaled state.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcResetSignal ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;ReadableEvent&amp;gt; or Handle&amp;lt;Process&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resets the signal on the given handle, ensuring future calls to [[#svcWaitSynchronization]] on this handle will sleep until the handle is signaled again. If the handle is a ReadableEvent, this is equivalent to calling svcClearEvent() on the handle.&lt;br /&gt;
&lt;br /&gt;
If the handle is a Process, it will clear the signaled state (which is set when the process changes [[#ProcessState]]. Once the process enters the Exited state, calling svcResetSignal on the process will no longer have an effect (the process is permanently signaled), and the syscall will return 0xFA01.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The signal was reset.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The handle is invalid or of the wrong type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xFA01:&#039;&#039;&#039; The handle was not signaled, or the process is in exited state, causing it to be permanently signaled.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 23 || 0 || [9.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R5 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R1, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R2 || [[#ProcessInfoType]] || InfoType&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1, R2 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || R1-R3 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || R1-R3 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type || &lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls || Allows using [[#svcWriteDebugProcessMemory]] on segments mapped read-only.&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]]) ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted || The physical memory blocks backing this region are refcounted.&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] [[#svcCreateCodeMemory|CodeMemoryAllowed]] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7964</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7964"/>
		<updated>2019-09-20T07:57:57Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add documentation for svcResetSignal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || [[#svcSignalEvent]] || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || [[#svcClearEvent]] || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R1=info_sub_id_lower32, R2=info_id, R3=handle, R4=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr&lt;br /&gt;
R0=name_ptr, R2=max_sessions, R3=is_light&lt;br /&gt;
|| W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32, R5=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr&lt;br /&gt;
R0=meminfo_ptr, R1=addr_lower32, R2=process_handle, R3=addr_upper32&lt;br /&gt;
|| W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz&lt;br /&gt;
R0=process_handle, R1=main_thread_prio, R2=default_cpuid, R3=main_thread_stacksz_lower32, R4=main_thread_stacksz_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]]&lt;br /&gt;
R1=process_handle, R2=[[#ProcessInfoType]]&lt;br /&gt;
|| W0=result, X1=[[#ProcessState]]&lt;br /&gt;
R0=result, R1=[[#ProcessState]]_lower32, R2=[[#ProcessState]]_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value&lt;br /&gt;
R0=reslimit_handle, R1=[[#LimitableResource]], R2=value_lower32, R3=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args&lt;br /&gt;
R0=smc_sub_id, R1, R2, R3=smc_args&lt;br /&gt;
|| X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
R0,R1,R2,R3=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d, and always in the Heap memory region) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition. The memory allocated counts towards the caller&#039;s process Memory ResourceLimit.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Invalid size passed. It&#039;s either bigger than 4GB, or misaligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD001:&#039;&#039;&#039; Size is bigger than the Heap Region size.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; KMemoryBlockAllocator slab allocator exhausted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The memory region is in an invalid state. Likely because a mapping was made in the heap region.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x10801:&#039;&#039;&#039; Memory resource limit reached.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The memory region was reprotected.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Unaligned address specified.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Unaligned or zero size specified.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The provided memory region does not fall within the userland address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD801:&#039;&#039;&#039; Invalid permission specified. Valid permissions are ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The provided memory region was in an invalid state. The region must have the PermissionChangeAllowed bit set in its [[#MemoryState]], and must not have the IsBorrowed or IsUncached [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; Kernel resource exhausted.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcSignalEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Puts the given event in the signaled state.&lt;br /&gt;
&lt;br /&gt;
Will wake up any thread currently waiting on this event. Can potentially trigger a reschedule.&lt;br /&gt;
&lt;br /&gt;
Any calls to [[#svcWaitSynchronization]] on this handle will return immediately, until the event&#039;s signaled state is reset.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Event is now in signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
== svcClearEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent or ReadableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Takes the given event out of the signaled state.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success, the event is now in the not-signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a ReadableEvent nor a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xFA01:&#039;&#039;&#039; The handle was not in a signaled state.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcResetSignal ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;ReadableEvent&amp;gt; or Handle&amp;lt;Process&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resets the signal on the given handle, ensuring future calls to [[#svcWaitSynchronization]] on this handle will sleep until the handle is signaled again. If the handle is a ReadableEvent, this is equivalent to calling svcClearEvent() on the handle.&lt;br /&gt;
&lt;br /&gt;
If the handle is a Process, it will clear the signaled state (which is set when the process changes [[#ProcessState]]. Once the process enters the Exited state, calling svcResetSignal on the process will no longer have an effect (the process is permanently signaled), and the syscall will return 0xFA01.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The signal was reset.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The handle is invalid or of the wrong type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xFA01:&#039;&#039;&#039; The handle was not signaled, or the process is in exited state, causing it to be permanently signaled.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 23 || 0 || [9.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R5 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R1, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R2 || [[#ProcessInfoType]] || InfoType&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1, R2 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || R1-R3 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || R1-R3 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type || &lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls || Allows using [[#svcWriteDebugProcessMemory]] on segments mapped read-only.&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]]) ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted || The physical memory blocks backing this region are refcounted.&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] [[#svcCreateCodeMemory|CodeMemoryAllowed]] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Error_codes&amp;diff=7821</id>
		<title>Error codes</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Error_codes&amp;diff=7821"/>
		<updated>2019-09-11T07:15:55Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add some missing errors from loader.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Structure =&lt;br /&gt;
These have been redesigned from the 3DS so that they fit within a Aarch64 MOV instruction immediate most of the time (without requiring the additional MOVK).&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Field&lt;br /&gt;
|-&lt;br /&gt;
| 8-0 || Module&lt;br /&gt;
|-&lt;br /&gt;
| 21-9 || Description&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When a fatal-error is received the error code is outputted using the following formatter:&lt;br /&gt;
  %04d-%04d&lt;br /&gt;
&lt;br /&gt;
.. where the first code is &amp;lt;code&amp;gt;2000 + Module&amp;lt;/code&amp;gt;, and the other being &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;. Bits &amp;gt;=22 from the error-code are unused when displaying fatal-errors, since the Description ends with bit21.&lt;br /&gt;
&lt;br /&gt;
= Modules =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Kernel&lt;br /&gt;
|-&lt;br /&gt;
| 2 || FS&lt;br /&gt;
|-&lt;br /&gt;
| 3 || OS (Memory, Thread, Mutex, NVIDIA)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || HTCS&lt;br /&gt;
|-&lt;br /&gt;
| 5 || NCM&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DD&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Debug Monitor&lt;br /&gt;
|-&lt;br /&gt;
| 8 || LR&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Loader&lt;br /&gt;
|-&lt;br /&gt;
| 10 || CMIF (IPC command interface)&lt;br /&gt;
|-&lt;br /&gt;
| 11 || HIPC (IPC)&lt;br /&gt;
|-&lt;br /&gt;
| 15 || PM&lt;br /&gt;
|-&lt;br /&gt;
| 16 || NS&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Sockets&lt;br /&gt;
|-&lt;br /&gt;
| 18 || HTC&lt;br /&gt;
|-&lt;br /&gt;
| 19 || TSC&lt;br /&gt;
|-&lt;br /&gt;
| 20 || NCM (content)&lt;br /&gt;
|-&lt;br /&gt;
| 21 || SM&lt;br /&gt;
|-&lt;br /&gt;
| 22 || RO (userland)&lt;br /&gt;
|-&lt;br /&gt;
| 24 || SDMMC&lt;br /&gt;
|-&lt;br /&gt;
| 25 || OVLN&lt;br /&gt;
|-&lt;br /&gt;
| 26 || SPL&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Bus&lt;br /&gt;
|-&lt;br /&gt;
| 100 || ETHC&lt;br /&gt;
|-&lt;br /&gt;
| 101 || I2C&lt;br /&gt;
|-&lt;br /&gt;
| 102 || GPIO&lt;br /&gt;
|-&lt;br /&gt;
| 103 || UART&lt;br /&gt;
|-&lt;br /&gt;
| 105 || Settings&lt;br /&gt;
|-&lt;br /&gt;
| 107 || WLAN&lt;br /&gt;
|-&lt;br /&gt;
| 108 || HID (xcd)&lt;br /&gt;
|-&lt;br /&gt;
| 110 || NIFM&lt;br /&gt;
|-&lt;br /&gt;
| 111 || Hwopus&lt;br /&gt;
|-&lt;br /&gt;
| 112 || HID (sasbus)&lt;br /&gt;
|-&lt;br /&gt;
| 113 || Bluetooth&lt;br /&gt;
|-&lt;br /&gt;
| 114 || VI&lt;br /&gt;
|-&lt;br /&gt;
| 115 || NFP&lt;br /&gt;
|-&lt;br /&gt;
| 116 || Time&lt;br /&gt;
|-&lt;br /&gt;
| 117 || FGM&lt;br /&gt;
|-&lt;br /&gt;
| 118 || OE&lt;br /&gt;
|-&lt;br /&gt;
| 120 || PCIe&lt;br /&gt;
|-&lt;br /&gt;
| 121 || Friends&lt;br /&gt;
|-&lt;br /&gt;
| 122 || BCAT&lt;br /&gt;
|-&lt;br /&gt;
| 123 || SSL&lt;br /&gt;
|-&lt;br /&gt;
| 124 || Account&lt;br /&gt;
|-&lt;br /&gt;
| 125 || News&lt;br /&gt;
|-&lt;br /&gt;
| 126 || Mii&lt;br /&gt;
|-&lt;br /&gt;
| 127 || NFC&lt;br /&gt;
|-&lt;br /&gt;
| 128 || AM&lt;br /&gt;
|-&lt;br /&gt;
| 129 || Play Report&lt;br /&gt;
|-&lt;br /&gt;
| 130 || HID (ahid)&lt;br /&gt;
|-&lt;br /&gt;
| 132 || Home Menu (Qlaunch)&lt;br /&gt;
|-&lt;br /&gt;
| 133 || PCV&lt;br /&gt;
|-&lt;br /&gt;
| 134 || OMM&lt;br /&gt;
|-&lt;br /&gt;
| 135 || BPC&lt;br /&gt;
|-&lt;br /&gt;
| 136 || PSM&lt;br /&gt;
|-&lt;br /&gt;
| 137 || NIM&lt;br /&gt;
|-&lt;br /&gt;
| 138 || PSC&lt;br /&gt;
|-&lt;br /&gt;
| 139 || TC&lt;br /&gt;
|-&lt;br /&gt;
| 140 || USB&lt;br /&gt;
|-&lt;br /&gt;
| 141 || NSD&lt;br /&gt;
|-&lt;br /&gt;
| 142 || PCTL&lt;br /&gt;
|-&lt;br /&gt;
| 143 || BTM&lt;br /&gt;
|-&lt;br /&gt;
| 144 || LA (Library Applet)&lt;br /&gt;
|-&lt;br /&gt;
| 145 || ETicket&lt;br /&gt;
|-&lt;br /&gt;
| 146 || NGC (Bad Words)&lt;br /&gt;
|-&lt;br /&gt;
| 147 || Error Report&lt;br /&gt;
|-&lt;br /&gt;
| 148 || APM&lt;br /&gt;
|-&lt;br /&gt;
| 149 || CEC&lt;br /&gt;
|-&lt;br /&gt;
| 150 || Profiler&lt;br /&gt;
|-&lt;br /&gt;
| 151 || Error Upload&lt;br /&gt;
|-&lt;br /&gt;
| 153 || Audio&lt;br /&gt;
|-&lt;br /&gt;
| 154 || NPNS&lt;br /&gt;
|-&lt;br /&gt;
| 155 || NPNS (XMPP Stream)&lt;br /&gt;
|-&lt;br /&gt;
| 157 || ARP&lt;br /&gt;
|-&lt;br /&gt;
| 158 || Updater&lt;br /&gt;
|-&lt;br /&gt;
| 159 || SWKBD&lt;br /&gt;
|-&lt;br /&gt;
| 161 || NFC (Mifare)&lt;br /&gt;
|-&lt;br /&gt;
| 162 || Userland (assert)&lt;br /&gt;
|-&lt;br /&gt;
| 163 || Fatal&lt;br /&gt;
|-&lt;br /&gt;
| 164 || NIM (shop)&lt;br /&gt;
|-&lt;br /&gt;
| 165 || SPSM&lt;br /&gt;
|-&lt;br /&gt;
| 167 || BGTC&lt;br /&gt;
|-&lt;br /&gt;
| 168 || Userland (crash)&lt;br /&gt;
|-&lt;br /&gt;
| 169 || Sasbus (Periodic Receive Mode)&lt;br /&gt;
|-&lt;br /&gt;
| 178 || PDM&lt;br /&gt;
|-&lt;br /&gt;
| 179 || OLSC&lt;br /&gt;
|-&lt;br /&gt;
| 180 || SREPO&lt;br /&gt;
|-&lt;br /&gt;
| 181 || Dauth&lt;br /&gt;
|-&lt;br /&gt;
| 187 || Sasbus&lt;br /&gt;
|-&lt;br /&gt;
| 191 || RTC&lt;br /&gt;
|-&lt;br /&gt;
| 192 || Regulator&lt;br /&gt;
|-&lt;br /&gt;
| 193 || Led&lt;br /&gt;
|-&lt;br /&gt;
| 197 || Clkrst&lt;br /&gt;
|-&lt;br /&gt;
| 202 || HID&lt;br /&gt;
|-&lt;br /&gt;
| 203 || LDN&lt;br /&gt;
|-&lt;br /&gt;
| 205 || HID (irsensor)&lt;br /&gt;
|-&lt;br /&gt;
| 206 || Capture&lt;br /&gt;
|-&lt;br /&gt;
| 208 || Manu&lt;br /&gt;
|-&lt;br /&gt;
| 209 || ATK&lt;br /&gt;
|-&lt;br /&gt;
| 210 || Web&lt;br /&gt;
|-&lt;br /&gt;
| 211 || Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 212 || GRC&lt;br /&gt;
|-&lt;br /&gt;
| 216 || Migration&lt;br /&gt;
|-&lt;br /&gt;
| 217 || Migration (Idc Server)&lt;br /&gt;
|-&lt;br /&gt;
| 229 || Glue (notification)&lt;br /&gt;
|-&lt;br /&gt;
| 230 || PSC (ins)&lt;br /&gt;
|-&lt;br /&gt;
| 345 || libnx&lt;br /&gt;
|-&lt;br /&gt;
| 346 || [[Homebrew ABI]]&lt;br /&gt;
|-&lt;br /&gt;
| 347 || Homebrew Loader&lt;br /&gt;
|-&lt;br /&gt;
| 348 || libnx Nvidia errors&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Error codes =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Module || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E01 || 1 || 7 || Session count exceeded&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C01 || 1 || 14 || Invalid kernel capability descriptor&lt;br /&gt;
|-&lt;br /&gt;
| 0x4201 || 1 || 33 || Not Implemented&lt;br /&gt;
|-&lt;br /&gt;
| 0x7601 || 1 || 59 || Thread terminated/termination requested&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C01 || 1 || 70 || No more debug events&lt;br /&gt;
|-&lt;br /&gt;
| 0xCA01 || 1 || 101 || Invalid size&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC01 || 1 || 102 || Invalid address&lt;br /&gt;
|-&lt;br /&gt;
| 0xCE01 || 1 || 103 || Resource exhaustion&lt;br /&gt;
|-&lt;br /&gt;
| 0xD001 || 1 || 104 || Memory exhaustion&lt;br /&gt;
|-&lt;br /&gt;
| 0xD201 || 1 || 105 || Handle-table exhaustion&lt;br /&gt;
|-&lt;br /&gt;
| 0xD401 || 1 || 106 || Invalid memory state / invalid memory permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD801 || 1 || 108 || Invalid memory permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 0xDC01 || 1 || 110 || Invalid memory range&lt;br /&gt;
|-&lt;br /&gt;
| 0xE001 || 1 || 112 || Invalid thread priority.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE201 || 1 || 113 || Invalid processor id.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE401 || 1 || 114 || Invalid handle.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE601 || 1 || 115 || Invalid pointer/Syscall copy from user failed.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE801 || 1 || 116 || Invalid combination&lt;br /&gt;
|-&lt;br /&gt;
| 0xEA01 || 1 || 117 || Time out. Also when you give 0 handles to svcWaitSynchronizationN.&lt;br /&gt;
|-&lt;br /&gt;
| 0xEC01 || 1 || 118 || Operation canceled&lt;br /&gt;
|-&lt;br /&gt;
| 0xEE01 || 1 || 119 || Out of range&lt;br /&gt;
|-&lt;br /&gt;
| 0xF001 || 1 || 120 || Invalid enum&lt;br /&gt;
|-&lt;br /&gt;
| 0xF201 || 1 || 121 || No such entry&lt;br /&gt;
|-&lt;br /&gt;
| 0xF401 || 1 || 122 || Irq/DeviceAddressSpace/{...} already registered&lt;br /&gt;
|-&lt;br /&gt;
| 0xF601 || 1 || 123 || Port remote dead&lt;br /&gt;
|-&lt;br /&gt;
| 0xF801 || 1 || 124 || [Usermode] Unhandled interrupt/exception&lt;br /&gt;
|-&lt;br /&gt;
| 0xFA01 || 1 || 125 || Process already started/Wrong memory permission?&lt;br /&gt;
|-&lt;br /&gt;
| 0xFC01 || 1 || 126 || Reserved value&lt;br /&gt;
|-&lt;br /&gt;
| 0xFE01 || 1 || 127 || Invalid hardware breakpoint&lt;br /&gt;
|-&lt;br /&gt;
| 0x10001 || 1 || 128 || [Usermode] Fatal exception&lt;br /&gt;
|-&lt;br /&gt;
| 0x10201 || 1 || 129 || Last thread didn&#039;t belong to your process&lt;br /&gt;
|-&lt;br /&gt;
| 0x10601 || 1 || 131 || Port closed&lt;br /&gt;
|-&lt;br /&gt;
| 0x10801 || 1 || 132 || Resource limit exceeded&lt;br /&gt;
|-&lt;br /&gt;
| 0x20801 || 1 || 260 || Command buffer too small&lt;br /&gt;
|-&lt;br /&gt;
| 0x40A01 || 1 || 517 || Invalid process ID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40C01 || 1 || 518 || Invalid thread ID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40E01 || 1 || 519 || Invalid thread ID (used in svcGetDebugThreadParam).&lt;br /&gt;
|-&lt;br /&gt;
| 0x41001 || 1 || 520 || Process not being debugged&lt;br /&gt;
|-&lt;br /&gt;
| 0x202 || 2 || 1 || Path does not exist.&lt;br /&gt;
|-&lt;br /&gt;
| 0x402 || 2 || 2 || Path already exists.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE02 || 2 || 7 || Resource already in use (file already opened, savedata filesystem already mounted).&lt;br /&gt;
|-&lt;br /&gt;
| 0x4602 || 2 || 35 || Not enough free space for BIS Calibration partition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4802 || 2 || 36 || Not enough free space for BIS Safe partition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A02 || 2 || 37 || Not enough free space for BIS User partition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C02 || 2 || 38 || Not enough free space for BIS System partition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E02 || 2 || 39 || Not enough free space on SD card.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6402 || 2 || 50 || NCA is older than version 3, or NCA SDK version is older than 0.11.0.0&lt;br /&gt;
|-&lt;br /&gt;
| 0x7802 || 2 || 60 || Specified mount name already exists.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D202 || 2 || 1001 || Process does not have RomFs &lt;br /&gt;
|-&lt;br /&gt;
| 0x7D402 || 2 || 1002 || Title-id not found / savedata not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0xFA202 || 2 || 2001 || SD card not inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x13B002 || 2 || 2520 || Gamecard not inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x13DA02 || 2 || 2541 || Version check failed when mounting gamecard sysupdate partition?&lt;br /&gt;
|-&lt;br /&gt;
| 0x171402 || 2 || 2954 || Invalid gamecard handle.&lt;br /&gt;
|-&lt;br /&gt;
| 0x177202 || 2 || 3001 || Unimplemented behavior&lt;br /&gt;
|-&lt;br /&gt;
| 0x177602 || 2 || 3003 || File/Directory already exists.&lt;br /&gt;
|-&lt;br /&gt;
| 0x190202 || 2 || 3201 || Memory allocation failure related to FAT filesystem code&lt;br /&gt;
|-&lt;br /&gt;
| 0x190602 || 2 || 3203 || Memory allocation failure related to FAT filesystem code&lt;br /&gt;
|-&lt;br /&gt;
| 0x190802 || 2 || 3204 || Memory allocation failure related to FAT filesystem code&lt;br /&gt;
|-&lt;br /&gt;
| 0x190A02 || 2 || 3205 || Memory allocation failure related to FAT filesystem code&lt;br /&gt;
|-&lt;br /&gt;
| 0x190C02 || 2 || 3206 || Memory allocation failure related to FAT filesystem code&lt;br /&gt;
|-&lt;br /&gt;
| 0x191002 || 2 || 3208 || Memory allocation failure related to FAT filesystem code&lt;br /&gt;
|-&lt;br /&gt;
| 0x195802 || 2 || 3244 || Allocation failure related to SD cards&lt;br /&gt;
|-&lt;br /&gt;
| 0x196002 || 2 || 3248 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x196202 || 2 || 3249 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A3E02 || 2 || 3359 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A4002 || 2 || 3360 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A4A02 || 2 || 3365 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x21BC02 || 2 || 4318 || Invalid save data filesystem magic (valid magic is SAVE in ASCII)&lt;br /&gt;
|-&lt;br /&gt;
| 0x234202 || 2 || 4513 || Error reading ACID section in NPDM&lt;br /&gt;
|-&lt;br /&gt;
| 0x234402 || 2 || 4514 || Invalid NPDM ACID section size&lt;br /&gt;
|-&lt;br /&gt;
| 0x234602 || 2 || 4515 || Last byte of the ACID modulus is zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x234802 || 2 || 4516 || Invalid ACID fixed key signature&lt;br /&gt;
|-&lt;br /&gt;
| 0x234A02 || 2 || 4517 || Invalid NCA magic&lt;br /&gt;
|-&lt;br /&gt;
| 0x234C02 || 2 || 4518 || Invalid NCA header fixed key signature&lt;br /&gt;
|-&lt;br /&gt;
| 0x234E02 || 2 || 4519 || Invalid NCA header ACID signature&lt;br /&gt;
|-&lt;br /&gt;
| 0x235002 || 2 || 4520 || Invalid NCA header section hash&lt;br /&gt;
|-&lt;br /&gt;
| 0x235202 || 2 || 4521 || Invalid NCA Key index&lt;br /&gt;
|-&lt;br /&gt;
| 0x235602 || 2 || 4523 || Invalid encryption type&lt;br /&gt;
|-&lt;br /&gt;
| 0x235802 || 2 || 4524 || Redirection BKTR table size is negative&lt;br /&gt;
|-&lt;br /&gt;
| 0x235A02 || 2 || 4525 || Encryption BKTR table size is negative&lt;br /&gt;
|-&lt;br /&gt;
| 0x235C02 || 2 || 4526 || Redirection BKTR table end offset is past the Encryption BKTR table start offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x235E02 || 2 || 4527 || NCA-path used with the wrong titleID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x236002 || 2 || 4528 || NCA header value is out of range&lt;br /&gt;
|-&lt;br /&gt;
| 0x236202 || 2 || 4529 || NCA FS header value is out of range&lt;br /&gt;
|-&lt;br /&gt;
| 0x236802 || 2 || 4532 || PartitionFS hash block size is not a power of 2&lt;br /&gt;
|-&lt;br /&gt;
| 0x236A02 || 2 || 4533 || PartitionFS hash &amp;quot;always_2&amp;quot; field is not 2&lt;br /&gt;
|-&lt;br /&gt;
| 0x236C02 || 2 || 4534 || PartitionFS hash table is too small for main data&lt;br /&gt;
|-&lt;br /&gt;
| 0x236E02 || 2 || 4535 || Invalid PartitionFS block hash&lt;br /&gt;
|-&lt;br /&gt;
| 0x244402 || 2 || 4642 || Invalid Partition file hashed region bounds&lt;br /&gt;
|-&lt;br /&gt;
| 0x244602 || 2 || 4643 || Invalid Partition FS hash&lt;br /&gt;
|-&lt;br /&gt;
| 0x244802 || 2 || 4644 || Invalid PFS0 magic&lt;br /&gt;
|-&lt;br /&gt;
| 0x244A02 || 2 || 4645 || Invalid HFS0 magic&lt;br /&gt;
|-&lt;br /&gt;
| 0x244C02 || 2 || 4646 || Invalid name offset for Partition FS file entry&lt;br /&gt;
|-&lt;br /&gt;
| 0x244E02 || 2 || 4647 || Calculated Partition FS header size changed between 2 consecutive reads&lt;br /&gt;
|-&lt;br /&gt;
| 0x249802 || 2 || 4684 || Invalid FAT file number.&lt;br /&gt;
|-&lt;br /&gt;
| 0x249C02 || 2 || 4686 || Invalid FAT format for BIS User partition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x249E02 || 2 || 4687 || Invalid FAT format for BIS System partition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24A002 || 2 || 4688 || Invalid FAT format for BIS Safe partition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24A202 || 2 || 4689 || Invalid FAT format for BIS Calibration partition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x250E02 || 2 || 4743 || [[NAX0|Corrupted]] NAX0 header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x251002 || 2 || 4744 || Invalid [[NAX0]] magicnum.&lt;br /&gt;
|-&lt;br /&gt;
| 0x280202 || 2 || 5121 || Invalid FAT size&lt;br /&gt;
|-&lt;br /&gt;
| 0x280402 || 2 || 5122 || Invalid FAT BPB (BIOS Parameter Block)&lt;br /&gt;
|-&lt;br /&gt;
| 0x280602 || 2 || 5123 || Invalid FAT parameter&lt;br /&gt;
|-&lt;br /&gt;
| 0x280802 || 2 || 5124 || Invalid FAT sector&lt;br /&gt;
|-&lt;br /&gt;
| 0x280A02 || 2 || 5125 || Invalid FAT sector&lt;br /&gt;
|-&lt;br /&gt;
| 0x280C02 || 2 || 5126 || Invalid FAT sector&lt;br /&gt;
|-&lt;br /&gt;
| 0x280E02 || 2 || 5127 || Invalid FAT sector&lt;br /&gt;
|-&lt;br /&gt;
| 0x296A02 || 2 || 5301 || Mountpoint not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE202 || 2 || 6001 || Invalid input&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE602 || 2 || 6003 || Path too long&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE802 || 2 || 6004 || Invalid character.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EEA02 || 2 || 6005 || Invalid directory path.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EEC02 || 2 || 6006 || Unable to retrieve directory from path&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F5A02 || 2 || 6061 || Offset outside storage&lt;br /&gt;
|-&lt;br /&gt;
| 0x313802 || 2 || 6300 || Operation not supported&lt;br /&gt;
|-&lt;br /&gt;
| 0x313C02 || 2 || 6302 || Attempted to resize a nn::fs::SubStorage or BufferedStorage that is marked as non-resizable&lt;br /&gt;
|-&lt;br /&gt;
| 0x313E02 || 2 || 6303 || Attempted to resize a nn::fs::SubStorage or BufferedStorage when the SubStorage ends before the base storage&lt;br /&gt;
|-&lt;br /&gt;
| 0x314002 || 2 || 6304 || Attempted to call nn::fs::MemoryStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x314202 || 2 || 6305 || Invalid Operation ID in nn::fs::MemoryStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x314402 || 2 || 6306 || Invalid Operation ID in nn::fs::FileStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x314C02 || 2 || 6310 || Attempted to call nn::fssystem::AesCtrCounterExtendedStorage::Write&lt;br /&gt;
|-&lt;br /&gt;
| 0x314E02 || 2 || 6311 || Attempted to call nn::fssystem::AesCtrCounterExtendedStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x315002 || 2 || 6312 || Invalid Operation ID in nn::fssystem::AesCtrCounterExtendedStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x315802 || 2 || 6316 || Attempted to call nn::fssystem::save::HierarchicalIntegrityVerificationStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x315A02 || 2 || 6317 || Attempted to call nn::fssystem::save::HierarchicalIntegrityVerificationStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x315C02 || 2 || 6318 || Attempted to call nn::fssystem::save::IntegrityVerificationStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x315E02 || 2 || 6319 || Attempted to invalidate the cache of a RomFs IVFC storage in nn::fssystem::save::IntegrityVerificationStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x316002 || 2 || 6320 || Invalid Operation ID in nn::fssystem::save::IntegrityVerificationStorage::OperateRange &lt;br /&gt;
|-&lt;br /&gt;
| 0x316202 || 2 || 6321 || Attempted to call nn::fssystem::save::BlockCacheBufferedStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x316402 || 2 || 6322 || Attempted to invalidate the cache of something other than a savedata IVFC storage in nn::fssystem::save::BlockCacheBufferedStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x316602 || 2 || 6323 || Invalid Operation ID in nn::fssystem::save::BlockCacheBufferedStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x316802 || 2 || 6324 || Attempted to call nn::fssystem::IndirectStorage::Write&lt;br /&gt;
|-&lt;br /&gt;
| 0x316A02 || 2 || 6325 || Attempted to call nn::fssystem::IndirectStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x316C02 || 2 || 6326 || Invalid Operation ID in nn::fssystem::IndirectStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x317202 || 2 || 6329 || Attempted to call nn::fssystem::HierarchicalSha256Storage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x317402 || 2 || 6330 || Attempted to call nn::fssystem::ReadOnlyBlockCacheStorage::Write&lt;br /&gt;
|-&lt;br /&gt;
| 0x317602 || 2 || 6331 || Attempted to call nn::fssystem::ReadOnlyBlockCacheStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x317802 || 2 || 6332 || Attempted to call nn::fssystem::IntegrityRomFsStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x317A02 || 2 || 6333 || Attempted to call nn::fssystem::save::DuplexStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x317C02 || 2 || 6334 || Invalid Operation ID in nn::fssystem::save::DuplexStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x317E02 || 2 || 6335 || Attempted to call nn::fssystem::save::HierarchicalDuplexStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x318002 || 2 || 6336 || Attempted to call nn::fssystem::save::RemapStorage::GetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x318202 || 2 || 6337 || Attempted to call nn::fssystem::save::RemapStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x318402 || 2 || 6338 || Invalid Operation ID in nn::fssystem::save::RemapStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x318602 || 2 || 6339 || Attempted to call nn::fssystem::save::IntegritySaveDataStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x318802 || 2 || 6340 || Invalid Operation ID in nn::fssystem::save::IntegritySaveDataStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x318A02 || 2 || 6341 || Attempted to call nn::fssystem::save::JournalIntegritySaveDataStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x318C02 || 2 || 6342 || Invalid Operation ID in nn::fssystem::save::JournalIntegritySaveDataStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x318E02 || 2 || 6343 || Attempted to call nn::fssystem::save::JournalStorage::GetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x319002 || 2 || 6344 || Attempted to call nn::fssystem::save::JournalStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x319202 || 2 || 6345 || Invalid Operation ID in nn::fssystem::save::JournalStorage::OperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x319602 || 2 || 6347 || Attempted to call nn::fssystem::dbm::AllocationTableStorage::SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x31A602 || 2 || 6355 || Invalid Operation ID in nn::fat::FatFile::DoOperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x31A802 || 2 || 6356 || Invalid Operation ID in nn::fssystem::StorageFile::DoOperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x31AE02 || 2 || 6359 || Invalid Query ID in nn::fssystem::ConcatenationFileSystem::DoQueryEntry&lt;br /&gt;
|-&lt;br /&gt;
| 0x31B002 || 2 || 6360 || Invalid Operation ID in nn::fssystem::ConcatenationFile::DoOperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x31B402 || 2 || 6362 || Invalid Operation ID in nn::fs::detail::FileServiceObjectAdapter::DoOperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x31B602 || 2 || 6363 || Invalid Operation ID in nn::fssystem::AesXtsFile::DoOperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x31B802 || 2 || 6364 || Attempted to modify a nn::fs::RomFsFileSystem&lt;br /&gt;
|-&lt;br /&gt;
| 0x31BA02 || 2 || 6365 || Attempted to call nn::fs::RomFsFileSystem::DoCommitProvisionally&lt;br /&gt;
|-&lt;br /&gt;
| 0x31BC02 || 2 || 6366 || Attempted to query the space in a nn::fs::RomFsFileSystem&lt;br /&gt;
|-&lt;br /&gt;
| 0x31BE02 || 2 || 6367 || Attempted to modify a nn::fssystem::RomFsFile&lt;br /&gt;
|-&lt;br /&gt;
| 0x31C002 || 2 || 6368 || Invalid Operation ID in nn::fssystem::RomFsFile::DoOperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x31C202 || 2 || 6369 || Attempted to modify a nn::fs::ReadOnlyFileSystemTemplate&lt;br /&gt;
|-&lt;br /&gt;
| 0x31C402 || 2 || 6370 || Attempted to call nn::fs::ReadOnlyFileSystemTemplate::DoCommitProvisionally&lt;br /&gt;
|-&lt;br /&gt;
| 0x31C602 || 2 || 6371 || Attempted to query the space in a nn::fs::ReadOnlyFileSystemTemplate&lt;br /&gt;
|-&lt;br /&gt;
| 0x31C802 || 2 || 6372 || Attempted to modify a nn::fs::ReadOnlyFileSystemFile&lt;br /&gt;
|-&lt;br /&gt;
| 0x31CA02 || 2 || 6373 || Invalid Operation ID in nn::fs::ReadOnlyFileSystemFile::DoOperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x31CC02 || 2 || 6374 || Attempted to modify a nn::fssystem::PartitionFileSystemCore&lt;br /&gt;
|-&lt;br /&gt;
| 0x31CE02 || 2 || 6375 || Attempted to call nn::fssystem::PartitionFileSystemCore::DoCommitProvisionally&lt;br /&gt;
|-&lt;br /&gt;
| 0x31D002 || 2 || 6376 || Attempted to call nn::fssystem::PartitionFileSystemCore::PartitionFile::DoSetSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x31D202 || 2 || 6377 || Invalid Operation ID in nn::fssystem::PartitionFileSystemCore::PartitionFile::DoOperateRange&lt;br /&gt;
|-&lt;br /&gt;
| 0x31DC02 || 2 || 6382 || Attempted to call nn::fssystem::ApplicationTemporaryFileSystem::DoCommitProvisionally&lt;br /&gt;
|-&lt;br /&gt;
| 0x31DE02 || 2 || 6383 || Attempted to call nn::fssystem::SaveDataFileSystem::DoCommitProvisionally&lt;br /&gt;
|-&lt;br /&gt;
| 0x31E002 || 2 || 6384 || Attempted to call nn::fssystem::DirectorySaveDataFileSystem::DoCommitProvisionally&lt;br /&gt;
|-&lt;br /&gt;
| 0x320002 || 2 || 6400 || Permission denied&lt;br /&gt;
|-&lt;br /&gt;
| 0x326602 || 2 || 6451 || Missing titlekey(?) required to mount content&lt;br /&gt;
|-&lt;br /&gt;
| 0x326E02 || 2 || 6455 || File not closed&lt;br /&gt;
|-&lt;br /&gt;
| 0x327002 || 2 || 6456 || Directory not closed&lt;br /&gt;
|-&lt;br /&gt;
| 0x327202 || 2 || 6457 || Writable file not closed when committing&lt;br /&gt;
|-&lt;br /&gt;
| 0x327402 || 2 || 6458 || FS allocators already registered&lt;br /&gt;
|-&lt;br /&gt;
| 0x327602 || 2 || 6459 || FS allocators already used&lt;br /&gt;
|-&lt;br /&gt;
| 0x327A02 || 2 || 6461 || FS allocator alignment violation&lt;br /&gt;
|-&lt;br /&gt;
| 0x339402 || 2 || 6602 || File not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0x339602 || 2 || 6603 || Directory not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0x35F202 || 2 || 6905 || Mount name not found in table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DBC02 || 2 || 7902 || RomFs table: Entry not found in dictionary&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DBE02 || 2 || 7903 || RomFs table: File not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DC002 || 2 || 7904 || RomFs table: Directory not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DC402 || 2 || 7906 || RomFs table: Entry already exists when trying to add a new entry&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DC602 || 2 || 7907 || RomFs table: Insufficient space to add new entry&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DC802 || 2 || 7908 || RomFs table: Unable to add new directory&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DCA02 || 2 || 7909 || RomFs table: Unable to add new file&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DCC02 || 2 || 7910 || RomFs directory has no more child directories/files when iterating&lt;br /&gt;
|-&lt;br /&gt;
| 0x3DD402 || 2 || 7914 || RomFs table: Path is file, not directory&lt;br /&gt;
|-&lt;br /&gt;
| 0x803 || 3 || 4 || OS busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xE03 || 3 || 7 || Invalid parameter&lt;br /&gt;
|-&lt;br /&gt;
| 0x1003 || 3 || 8 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x1203 || 3 || 9 || Out of resources&lt;br /&gt;
|-&lt;br /&gt;
| 0x3EA03 || 3 || 501 || Invalid handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x3EE03 || 3 || 503 || Invalid memory mirror&lt;br /&gt;
|-&lt;br /&gt;
| 0x7FE03 || 3 || 1023 || TLS slot is not allocated&lt;br /&gt;
|-&lt;br /&gt;
| 0xA05 || 5 || 5 || [[Content_Manager_services|NcaID]] not found. Returned when attempting to mount titles which exist that aren&#039;t *8XX titles, the same way *8XX titles are mounted.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE05 || 5 || 7 || TitleId not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x1805 || 5 || 12 || Invalid StorageId&lt;br /&gt;
|-&lt;br /&gt;
| 0xDC05 || 5 || 110 || Gamecard not inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x17C05 || 5 || 190 || Gamecard not initialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F405 || 5 || 250 || Sdcard not inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x20805 || 5 || 260 || Storage not mounted&lt;br /&gt;
|-&lt;br /&gt;
| 0x806 || 6 || 4 || Converted from error 0xD401&lt;br /&gt;
|-&lt;br /&gt;
| 0x1006 || 6 || 8 || Converted from error 0xE401&lt;br /&gt;
|-&lt;br /&gt;
| 0x408 || 8 || 2 || Program location entry not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x608 || 8 || 3 || Invalid context for control location&lt;br /&gt;
|-&lt;br /&gt;
| 0x808 || 8 || 4 || Storage not found&lt;br /&gt;
|-&lt;br /&gt;
| 0xA08 || 8 || 5 || Access denied&lt;br /&gt;
|-&lt;br /&gt;
| 0xC08 || 8 || 6 || Offline manual HTML location entry not found&lt;br /&gt;
|-&lt;br /&gt;
| 0xE08 || 8 || 7 || Title is not registered&lt;br /&gt;
|-&lt;br /&gt;
| 0x1008 || 8 || 8 || Control location entry for host not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x1208 || 8 || 9 || Legal info HTML location entry not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x1408 || 8 || 10 || Program location for debug entry not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x209 || 9 || 1 || Args too long.&lt;br /&gt;
|-&lt;br /&gt;
| 0x409 || 9 || 2 || Maximum processes loaded.&lt;br /&gt;
|-&lt;br /&gt;
| 0x609 || 9 || 3 || NPDM too big.&lt;br /&gt;
|-&lt;br /&gt;
| 0x809 || 9 || 4 || Invalid NPDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA09 || 9 || 5 || Invalid NSO.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC09 || 9 || 6 || Invalid Path.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE09 || 9 || 7 || Already registered.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1009 || 9 || 8 || Title not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1209 || 9 || 9 || Title-id in ACI0 doesn&#039;t match range in ACID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1409 || 9 || 10 || Invalid version in NPDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6609 || 9 || 51 || Insufficient address space.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6809 || 9 || 52 || Insufficient NRO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A09 || 9 || 53 || Invalid NRR&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C09 || 9 || 54 || Invalid signature&lt;br /&gt;
|-&lt;br /&gt;
| 0x6E09 || 9 || 55 || Insufficient NRO registrations.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7009 || 9 || 56 || Insufficient NRR registrations.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7209 || 9 || 57 || NRO Already loaded.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA209 || 9 || 81 || Unaligned NRR address&lt;br /&gt;
|-&lt;br /&gt;
| 0xA409 || 9 || 82 || Bad NRR size&lt;br /&gt;
|-&lt;br /&gt;
| 0xA809 || 9 || 84 || NRR Not Loaded.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAA09 || 9 || 85 || Bad NRR address&lt;br /&gt;
|-&lt;br /&gt;
| 0xAE09 || 9 || 87 || Bad initialization&lt;br /&gt;
|-&lt;br /&gt;
| 0xC809 || 9 || 100 || Unknown ACI0 descriptor&lt;br /&gt;
|-&lt;br /&gt;
| 0xCE09 || 9 || 103 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;KernelFlags&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xD009 || 9 || 104 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;SyscallMask&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xD409 || 9 || 106 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;MapIoOrNormalRange&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xD609 || 9 || 107 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;MapNormalPage&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xDE09 || 9 || 111 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;InterruptPair&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xE209 || 9 || 113 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;ApplicationType&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xE409 || 9 || 114 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;KernelReleaseVersion&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xE609 || 9 || 115 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;HandleTableSize&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xE809 || 9 || 116 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;DebugFlags&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0x1940A || 10 || 202 || Invalid CMIF header size.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A60A || 10 || 211 || Invalid CMIF input header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A80A || 10 || 212 || Invalid CMIF output header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1BA0A || 10 || 221 || Invalid method dispatch ID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D60A || 10 || 235 || Invalid in object count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D80A || 10 || 236 || Invalid out object count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x25A0A || 10 || 301 || Out of domain entries.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20B || 11 || 1 || Unsupported operation&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC0B || 11 || 102 || Out of server session memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A0B || 11 || 141 || Went past maximum during marshalling.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1900B || 11 || 200 || Session doesn&#039;t support domains.&lt;br /&gt;
|-&lt;br /&gt;
| 0x25A0B || 11 || 301 || Remote process is dead.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3260B || 11 || 403 || Unknown request type&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D60B || 11 || 491 || IPC Query 1 failed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20F || 15 || 1 || Pid not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x60F || 15 || 3 || Process has no pending events&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0F || 15 || 5 || Application already running&lt;br /&gt;
|-&lt;br /&gt;
| 0x410 || 16 || 2 || Title-id not found&lt;br /&gt;
|-&lt;br /&gt;
| 0xF010 || 16 || 120 || Gamecard sysupdate not required&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F610 || 16 || 251 || Unexpected StorageId&lt;br /&gt;
|-&lt;br /&gt;
| 0x215 || 21 || 1 || Out of processes&lt;br /&gt;
|-&lt;br /&gt;
| 0x415 || 21 || 2 || Not initialized.&lt;br /&gt;
|-&lt;br /&gt;
| 0x615 || 21 || 3 || Max sessions&lt;br /&gt;
|-&lt;br /&gt;
| 0x815 || 21 || 4 || Service already registered&lt;br /&gt;
|-&lt;br /&gt;
| 0xA15 || 21 || 5 || Out of services&lt;br /&gt;
|-&lt;br /&gt;
| 0xC15 || 21 || 6 || Invalid name (all zeroes)&lt;br /&gt;
|-&lt;br /&gt;
| 0xE15 || 21 || 7 || Service not registered&lt;br /&gt;
|-&lt;br /&gt;
| 0x1015 || 21 || 8 || Permission denied&lt;br /&gt;
|-&lt;br /&gt;
| 0x1215 || 21 || 9 || Service Access Control too big.&lt;br /&gt;
|-&lt;br /&gt;
| 0x416 || 22 || 2 || Address space is full&lt;br /&gt;
|-&lt;br /&gt;
| 0x616 || 22 || 3 || NRO already loaded&lt;br /&gt;
|-&lt;br /&gt;
| 0x816 || 22 || 4 || Invalid NRO header values&lt;br /&gt;
|-&lt;br /&gt;
| 0xC16 || 22 || 6 || Bad NRR magic&lt;br /&gt;
|-&lt;br /&gt;
| 0x1016 || 22 || 8 || Reached max NRR count&lt;br /&gt;
|-&lt;br /&gt;
| 0x1216 || 22 || 9 || Unable to verify NRO hash or NRR signature&lt;br /&gt;
|-&lt;br /&gt;
| 0x80216 || 22 || 1025 || Address not page-aligned&lt;br /&gt;
|-&lt;br /&gt;
| 0x80416 || 22 || 1026 || Incorrect NRO size&lt;br /&gt;
|-&lt;br /&gt;
| 0x80816 || 22 || 1028 || NRO not loaded&lt;br /&gt;
|-&lt;br /&gt;
| 0x80A16 || 22 || 1029 || NRR not loaded&lt;br /&gt;
|-&lt;br /&gt;
| 0x80C16 || 22 || 1030 || Already initialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x80E16 || 22 || 1031 || Not initialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x21A || 26 || 1 || SMC is not implemented&lt;br /&gt;
|-&lt;br /&gt;
| 0x41A || 26 || 2 || SMC argument is invalid&lt;br /&gt;
|-&lt;br /&gt;
| 0x61A || 26 || 3 || SMC is currently in progress/secmon is busy&lt;br /&gt;
|-&lt;br /&gt;
| 0x81A || 26 || 4 || Secmon not currently performing async operation&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1A || 26 || 5 || Invalid SMC async callback key&lt;br /&gt;
|-&lt;br /&gt;
| 0xC1A || 26 || 6 || SMC is blacklisted during current boot&lt;br /&gt;
|-&lt;br /&gt;
| 0xC81A || 26 || 100 || Invalid (buffer) size&lt;br /&gt;
|-&lt;br /&gt;
| 0xCA1A || 26 || 101 || Unknown SMC error&lt;br /&gt;
|-&lt;br /&gt;
| 0xCA1A || 26 || 101 || Decryption failure&lt;br /&gt;
|-&lt;br /&gt;
| 0xD01A || 26 || 104 || No AES keyslots available&lt;br /&gt;
|-&lt;br /&gt;
| 0xD21A || 26 || 105 || Invalid AES keyslot&lt;br /&gt;
|-&lt;br /&gt;
| 0xD41A || 26 || 106 || BootReason already set&lt;br /&gt;
|-&lt;br /&gt;
| 0xD61A || 26 || 107 || BootReason not set&lt;br /&gt;
|-&lt;br /&gt;
| 0xD81A || 26 || 108 || Invalid argument&lt;br /&gt;
|-&lt;br /&gt;
| 0x19269 || 105 || 201 || Null settings name&lt;br /&gt;
|-&lt;br /&gt;
| 0x19469 || 105 || 202 || Null settings key&lt;br /&gt;
|-&lt;br /&gt;
| 0x19669 || 105 || 203 || Null settings value&lt;br /&gt;
|-&lt;br /&gt;
| 0x19A69 || 105 || 205 || Null settings value buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A069 || 105 || 208 || Null setting value size buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A269 || 105 || 209 || Null debug mode flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x1BA69 || 105 || 221 || Setting group name has zero length&lt;br /&gt;
|-&lt;br /&gt;
| 0x1BC69 || 105 || 222 || Empty settings item key&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E269 || 105 || 241 || Setting group name is too long (64 character limit?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E469 || 105 || 242 || Setting name is too long (64 character limit?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x20A69 || 105 || 261 || Setting group name ends with &#039;.&#039; or contains invalid characters (allowed: [a-z0-9_\-.])&lt;br /&gt;
|-&lt;br /&gt;
| 0x20C69 || 105 || 262 || Setting name ends with &#039;.&#039; or contains invalid characters (allowed: [a-z0-9_\-.])&lt;br /&gt;
|-&lt;br /&gt;
| 0x4DA69 || 105 || 621 || Null language code buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x4EE69 || 105 || 631 || Null network settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F069 || 105 || 632 || Null network settings output count buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x50269 || 105 || 641 || Null backlight settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x51669 || 105 || 651 || Null Bluetooth device setting buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x51869 || 105 || 652 || Null Bluetooth device setting output count buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x51A69 || 105 || 653 || Null Bluetooth enable flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x51C69 || 105 || 654 || Null Bluetooth AFH enable flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x51E69 || 105 || 655 || Null Bluetooth boost enable flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x52069 || 105 || 656 || Null BLE pairing settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x52269 || 105 || 657 || Null BLE pairing settings entry count buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x52A69 || 105 || 661 || Null external steady clock source ID buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x52C69 || 105 || 662 || Null user system clock context buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x52E69 || 105 || 663 || Null network system clock context buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x53069 || 105 || 664 || Null user system clock automatic correction enabled flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x53269 || 105 || 665 || Null shutdown RTC value buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x53469 || 105 || 666 || Null external steady clock internal offset buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x53E69 || 105 || 671 || Null account settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x55269 || 105 || 681 || Null audio volume buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x55669 || 105 || 683 || Null ForceMuteOnHeadphoneRemoved buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x55869 || 105 || 684 || Null headphone volume warning count buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x55E69 || 105 || 687 || Invalid audio output mode&lt;br /&gt;
|-&lt;br /&gt;
| 0x56069 || 105 || 688 || Null headphone volume update flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x56669 || 105 || 691 || Null console information upload flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x57A69 || 105 || 701 || Null automatic application download flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x57C69 || 105 || 702 || Null notification settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x57E69 || 105 || 703 || Null account notification settings entry count buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x58069 || 105 || 704 || Null account notification settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x58E69 || 105 || 711 || Null vibration master volume buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x59069 || 105 || 712 || Null NX controller settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x59269 || 105 || 713 || Null NX controller settings entry count buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x59469 || 105 || 714 || Null USB full key enable flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A269 || 105 || 721 || Null TV settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A469 || 105 || 722 || Null EDID buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5B669 || 105 || 731 || Null data deletion settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5CA69 || 105 || 741 || Null initial system applet program ID buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5CC69 || 105 || 742 || Null overlay disp program ID buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5CE69 || 105 || 743 || Null IsInRepairProcess buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D069 || 105 || 744 || Null RequiresRunRepairTimeReviser buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5DE69 || 105 || 751 || Null device timezone location name buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F269 || 105 || 761 || Null primary album storage buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x60669 || 105 || 771 || Null USB 3.0 enable flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x60869 || 105 || 772 || Null USB Type-C power source circuit version buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x61A69 || 105 || 781 || Null battery lot buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x62E69 || 105 || 791 || Null serial number buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x64269 || 105 || 801 || Null lock screen flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x64669 || 105 || 803 || Null color set ID buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x64869 || 105 || 804 || Null quest flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x64A69 || 105 || 805 || Null wireless certification file size buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x64C69 || 105 || 806 || Null wireless certification file buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x64E69 || 105 || 807 || Null initial launch settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x65069 || 105 || 808 || Null device nickname buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x65269 || 105 || 809 || Null battery percentage flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x65469 || 105 || 810 || Null applet launch flags buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x7E869 || 105 || 1012 || Null wireless LAN enable flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x7FA69 || 105 || 1021 || Null product model buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x80E69 || 105 || 1031 || Null NFC enable flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x82269 || 105 || 1041 || Null ECI device certificate buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x82469 || 105 || 1042 || Null E-Ticket device certificate buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x83669 || 105 || 1051 || Null sleep settings buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x84A69 || 105 || 1061 || Null EULA version buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x84C69 || 105 || 1062 || Null EULA version entry count buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x85E69 || 105 || 1071 || Null LDN channel buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x87269 || 105 || 1081 || Null SSL key buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x87469 || 105 || 1082 || Null SSL certificate buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x88669 || 105 || 1091 || Null telemetry flags buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x89A69 || 105 || 1101 || Null Gamecard key buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x89C69 || 105 || 1102 || Null Gamecard certificate buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8AE69 || 105 || 1111 || Null PTM battery lot buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B069 || 105 || 1112 || Null PTM fuel gauge parameter buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C269 || 105 || 1121 || Null ECI device key buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C469 || 105 || 1122 || Null E-Ticket device key buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D669 || 105 || 1131 || Null speaker parameter buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8EA69 || 105 || 1141 || Null firmware version buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8EC69 || 105 || 1142 || Null firmware version digest buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8EE69 || 105 || 1143 || Null rebootless system update version buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x8FE69 || 105 || 1151 || Null Mii author ID buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x91269 || 105 || 1161 || Null fatal flags buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x92669 || 105 || 1171 || Null auto update enable flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x93A69 || 105 || 1181 || Null external RTC reset flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x94E69 || 105 || 1191 || Null push notification activity mode buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x96269 || 105 || 1201 || Null service discovery control setting buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x97669 || 105 || 1211 || Null error report share permission buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x98A69 || 105 || 1221 || Null LCD vendor ID buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x99E69 || 105 || 1231 || Null console SixAxis sensor acceleration bias buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9A069 || 105 || 1232 || Null console SixAxis sensor angular velocity bias buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9A269 || 105 || 1233 || Null console SixAxis sensor acceleration gain buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9A469 || 105 || 1234 || Null console SixAxis sensor angular velocity gain buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9A669 || 105 || 1235 || Null console SixAxis sensor angular velocity time bias buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9A869 || 105 || 1236 || Null console SixAxis sensor angular acceleration buffer &lt;br /&gt;
|-&lt;br /&gt;
| 0x9B269 || 105 || 1241 || Null keyboard layout buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9BA69 || 105 || 1245 || Invalid keyboard layout&lt;br /&gt;
|-&lt;br /&gt;
| 0x9C669 || 105 || 1251 || Null web inspector flag buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9C869 || 105 || 1252 || Null allowed SSL hosts buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9CA69 || 105 || 1253 || Null allowed SSL hosts entry count buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9CC69 || 105 || 1254 || Null host FS mount point buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9EE69 || 105 || 1271 || Null Amiibo key buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9F069 || 105 || 1272 || Null Amiibo ECQV certificate buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9F269 || 105 || 1273 || Null Amiibo ECDSA certificate buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9F469 || 105 || 1274 || Null Amiibo ECQV BLS key buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9F669 || 105 || 1275 || Null Amiibo ECQV BLS certificate buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x9F869 || 105 || 1276 || Null Amiibo ECQV BLS root certificate buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x272 || 114 || 1 || Generic error&lt;br /&gt;
|-&lt;br /&gt;
| 0xC72 || 114 || 6 || Unsupported operation&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || 116 || 0 || Time service not initialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x274 || 116 || 1 || Permission denied&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC74 || 116 || 102 || Time not set / Clock Source Id mismatch&lt;br /&gt;
|-&lt;br /&gt;
| 0x19074 || 116 || 200 || Invalid time comparison&lt;br /&gt;
|-&lt;br /&gt;
| 0x19274 || 116 || 201 || Signed overflow/underflow&lt;br /&gt;
|-&lt;br /&gt;
| 0x64274 || 116 || 801 || Memory allocation failure&lt;br /&gt;
|-&lt;br /&gt;
| 0x70A74 || 116 || 901 || Null pointer&lt;br /&gt;
|-&lt;br /&gt;
| 0x70C74 || 116 || 902 || Value out of valid range&lt;br /&gt;
|-&lt;br /&gt;
| 0x70E74 || 116 || 903 || TimeZoneRule conversion failed&lt;br /&gt;
|-&lt;br /&gt;
| 0x7BA74 || 116 || 989 || TimeZone location name not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x7BC74 || 116 || 990 || Unimplemented functionality&lt;br /&gt;
|-&lt;br /&gt;
| 0x27A || 122 || 1 || Invalid argument&lt;br /&gt;
|-&lt;br /&gt;
| 0x47A || 122 || 2 || Object not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x67A || 122 || 3 || Object locked/in used&lt;br /&gt;
|-&lt;br /&gt;
| 0x87A || 122 || 4 || Target already mounted&lt;br /&gt;
|-&lt;br /&gt;
| 0xA7A || 122 || 5 || Target not mounted&lt;br /&gt;
|-&lt;br /&gt;
| 0xC7A || 122 || 6 || Object already opened&lt;br /&gt;
|-&lt;br /&gt;
| 0xE7A || 122 || 7 || Object not opened&lt;br /&gt;
|-&lt;br /&gt;
| 0xA07A || 122 || 80 || Passphrase not found&lt;br /&gt;
|-&lt;br /&gt;
| 0xA27A || 122 || 81 || Data verification failed&lt;br /&gt;
|-&lt;br /&gt;
| 0xB47A || 122 || 90 || Invalid API call&lt;br /&gt;
|-&lt;br /&gt;
| 0xC47A || 122 || 98 || Invalid operation&lt;br /&gt;
|-&lt;br /&gt;
| 0x287C || 124 || 20 || Argument is NULL&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C7C || 124 || 22 || Argument is invalid&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C7C || 124 || 30 || Bad input buffer size&lt;br /&gt;
|-&lt;br /&gt;
| 0x407C || 124 || 32 || Invalid input buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x27E || 126 || 1 || Invalid argument&lt;br /&gt;
|-&lt;br /&gt;
| 0x87E || 126 || 4 || Entry not found&lt;br /&gt;
|-&lt;br /&gt;
| 0xCE7E || 126 || 67 || Invalid database signature value (should be &amp;quot;NFDB&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| 0xD27E || 126 || 69 || Invalid database entry count&lt;br /&gt;
|-&lt;br /&gt;
| 0x1987E || 126 || 204 || Development/debug-only behavior&lt;br /&gt;
|-&lt;br /&gt;
| 0x480 || 128 || 2 || IStorage not available.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4680 || 128 || 35 || Error while launching applet.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A80 || 128 || 37 || Title-ID not found. Caused by code 0x410 when applet launch fails&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E880 || 128 || 500 || Invalid input&lt;br /&gt;
|-&lt;br /&gt;
| 0x3EC80 || 128 || 502 || IStorage has already been opened by another accessor&lt;br /&gt;
|-&lt;br /&gt;
| 0x3EE80 || 128 || 503 || IStorage Read/Write out-of-bounds&lt;br /&gt;
|-&lt;br /&gt;
| 0x3FE80 || 128 || 511 || IStorage opened as wrong type (data opened as transfermem, transfermem opened as data)&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080 || 128 || 512 || Unbalanced fatal section leave (returned when executing LeaveFatalSection without a preceding EnterFatalSection call)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B080 || 128 || 600 || Failed to allocate memory for IStorage&lt;br /&gt;
|-&lt;br /&gt;
| 0x59080 || 128 || 712 || Thread stack pool exhausted (out of memory)&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A880 || 128 || 980 || &amp;lt;code&amp;gt;am.debug!dev_function&amp;lt;/code&amp;gt; setting needs to be set&lt;br /&gt;
|-&lt;br /&gt;
| 0xA83 || 131 || 5 || Unrecognized applet ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x485 || 133 || 2 || Invalid DVFS table ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x885 || 133 || 4 || Invalid parameter&lt;br /&gt;
|-&lt;br /&gt;
| 0x3CF089 || 137 || 7800 || Unknown/invalid libcurl error.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E8289-0x3F4089 || 137 || 8001-8096 || libcurl error 1-96. Some of the libcurl errors in the error-table map to the above unknown-libcurl-error however.&lt;br /&gt;
|-&lt;br /&gt;
| 0x68A || 138 || 3 || Not initialized.&lt;br /&gt;
|-&lt;br /&gt;
| 0x668C || 140 || 51 || USB data-transfer in progress&lt;br /&gt;
|-&lt;br /&gt;
| 0xD48C || 140 || 106 || Invalid descriptor&lt;br /&gt;
|-&lt;br /&gt;
| 0x1928C || 140 || 201 || USB device not bound / interface already enabled&lt;br /&gt;
|-&lt;br /&gt;
| 0x290 || 144 || 1 || Exited Abnormally ([[Applet_Manager_services#LibraryAppletExitReason|ExitReason]] == Abormal)&lt;br /&gt;
|-&lt;br /&gt;
| 0x690 || 144 || 3 || Canceled ([[Applet_Manager_services#LibraryAppletExitReason|ExitReason]] == Canceled)&lt;br /&gt;
|-&lt;br /&gt;
| 0x890 || 144 || 4 || Rejected&lt;br /&gt;
|-&lt;br /&gt;
| 0xA90 || 144 || 5 || Exited Unexpectedly ([[Applet_Manager_services#LibraryAppletExitReason|ExitReason]] == Unexpected)&lt;br /&gt;
|-&lt;br /&gt;
| 0x299 || 153 || 1 || Invalid audio device&lt;br /&gt;
|-&lt;br /&gt;
| 0x499 || 153 || 2 || Operation couldn&#039;t complete successfully&lt;br /&gt;
|-&lt;br /&gt;
| 0x699 || 153 || 3 || Invalid sample rate&lt;br /&gt;
|-&lt;br /&gt;
| 0x899 || 153 || 4 || Buffer size too small&lt;br /&gt;
|-&lt;br /&gt;
| 0x1099 || 153 || 8 || Too many buffers are still unreleased&lt;br /&gt;
|-&lt;br /&gt;
| 0x1499 || 153 || 10 || Invalid channel count&lt;br /&gt;
|-&lt;br /&gt;
| 0x40299 || 153 || 513 || Invalid/Unsupported operation&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0099 || 153 || 1536 || Invalid handle&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0899 || 153 || 1540 || Audio output was already started&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C9D || 157 || 30 || Address is NULL&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E9D || 157 || 31 || PID is NULL&lt;br /&gt;
|-&lt;br /&gt;
| 0x549D || 157 || 42 || Already bound&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC9D || 157 || 102 || Invalid PID&lt;br /&gt;
|-&lt;br /&gt;
| 0xAA3 || 163 ||  5 || System is booting up repair process without VOL+ held down.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCA3 || 163 || 6 || System is booting up repair process that requires RepairTimeReviser but does not have special cartridge inserted.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC8B2 || 178 || 100 || Invalid user ID&lt;br /&gt;
|-&lt;br /&gt;
| 0xCAB2 || 178 || 101 || User does not exist&lt;br /&gt;
|-&lt;br /&gt;
| 0x12CB2 || 178 || 150 || Service unavailable&lt;br /&gt;
|-&lt;br /&gt;
| 0x190B2 || 178 || 200 || File storage failure&lt;br /&gt;
|-&lt;br /&gt;
| 0x58ACA || 202 || 709 || Npad ID is out of range.&lt;br /&gt;
|-&lt;br /&gt;
| 0xF0CD || 205 || 120 || IR image data not available/ready.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A8CD || 205 || 212 || IR camera handle pointer is null.&lt;br /&gt;
|-&lt;br /&gt;
| 0x198CD || 205 || 204 || IR camera invalid handle value.&lt;br /&gt;
|-&lt;br /&gt;
| 0x35B || 347 || 1 || Failed to init SM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x55B || 347 || 2 || Failed to init FS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x75B || 347 || 3 || Failed to open NRO file. May also happen when SD card isn&#039;t inserted / SD mounting failed earlier.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95B || 347 || 4 || Failed to read NRO header.&lt;br /&gt;
|-&lt;br /&gt;
| 0xB5B || 347 || 5 || Invalid NRO magic.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD5B || 347 || 6 || Invalid NRO segments.&lt;br /&gt;
|-&lt;br /&gt;
| 0xF5B || 347 || 7 || Failed to read NRO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x135B || 347 || 9 || Failed to allocate heap.&lt;br /&gt;
|-&lt;br /&gt;
| 0x255B || 347 || 18 || Failed to map code-binary memory.&lt;br /&gt;
|-&lt;br /&gt;
| 0x275B || 347 || 19 || Failed to map code memory (.text).&lt;br /&gt;
|-&lt;br /&gt;
| 0x295B || 347 || 20 || Failed to map code memory (.rodata).&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B5B || 347 || 21 || Failed to map code memory (.data+.bss).&lt;br /&gt;
|-&lt;br /&gt;
| 0x315B || 347 || 24 || Failed to unmap code memory (.text).&lt;br /&gt;
|-&lt;br /&gt;
| 0x335B || 347 || 25 || Failed to unmap code memory (.rodata).&lt;br /&gt;
|-&lt;br /&gt;
| 0x355B || 347 || 26 || Failed to unmap code memory (.data+.bss).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FS Error Codes ==&lt;br /&gt;
The following are the error codes recognized by nn::fs::detail::LogErrorMessage found in some [[Factory Setup|factory]] titles:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Description || Message&lt;br /&gt;
|-&lt;br /&gt;
| 0x7802 || 60 || nn::fs::ResultMountNameAlreadyExists: Error: Specified mount name already exists.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD401 || 106 || nn::svc::ResultInvalidCurrentMemory: Error: Passed buffer is not usable for fs library. See a manual of fs library for more information.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D202 || 1001 || nn::fs::ResultPartitionNotFound: Error: Specified partition is not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D402 || 1002 || nn::fs::ResultTargetNotFound: Error: Specified target is not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0xFA002 - 0x138602 || 2000 - 2499 || nn::fs::ResultSdCardAccessFailed: Error: Failed to access SD card.&lt;br /&gt;
|-&lt;br /&gt;
| 0x136802 - 0x176E02 || 2500 - 2999 || nn::fs::ResultGameCardAccessFailed: Error: Failed to access game card.&lt;br /&gt;
|-&lt;br /&gt;
| 0x177202 || 3001 || nn::fs::ResultNotImplemented: Error: Specified operation is not implemented.&lt;br /&gt;
|-&lt;br /&gt;
| 0x177A02 || 3005 || nn::fs::ResultOutOfRange: Error: Specified value is out of range.&lt;br /&gt;
|-&lt;br /&gt;
| 0x190002 - 0x1B5602 || 3200 - 3499 || nn::fs::ResultAllocationMemoryFailed: Error: Failed to allocate memory.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B5802 - 0x1F3E02 || 3500 - 3999 || nn::fs::ResultMmcAccessFailed: Error: Failed to access MMC.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F4202 - 0x219602 || 4001 - 4299 || nn::fs::ResultRomCorrupted: Error: ROM is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x219A02 - 0x232602 || 4301 - 4499 || nn::fs::ResultSaveDataCorrupted: Error: Save data is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x232A02 - 0x23EE02 || 4501 - 4599 || nn::fs::ResultNcaCorrupted: Error: NCA is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23F202 - 0x243E02 || 4601 - 4639 || nn::fs::ResultIntegrityVerificationStorageCorrupted: Error: Integrity verification failed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x244202 - 0x246602 || 4641 - 4659 || nn::fs::ResultPartitionFileSystemCorrupted: Error: Partition FS is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x246A02 - 0x248E02 || 4661 - 4679 || nn::fs::ResultBuiltInStorageCorrupted: Error: Built-in-storage is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x249202 - 0x24B602 || 4681 - 4699 || nn::fs::ResultFatFileSystemCorrupted: Error: FAT FS is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24BA02 - 0x24DE02 || 4701 - 4719 || nn::fs::ResultHostFileSystemCorrupted: Error: HOST FS is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F4002 - 0x270E02 || 4000, 4300, 4500, 4600, 4640, 4660, 4680, 4700, 4720-4999 || nn::fs::ResultDataCorrupted: Error: Data is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x271002 - 0x2EDE02 || 5000-5999 || nn::fs::ResultUnexpected: Error: Unexpected failure occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE002 - 0x32C602 || 6000-6499 || nn::fs::ResultPreconditionViolation: Error: Precondition violation.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE202 - 0x306E02 || 6001-6199 || nn::fs::ResultInvalidArgument: Error: Invalid argument was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE402 - 0x2F1A02 || 6002-6029 || nn::fs::ResultInvalidPath: Error: Invalid path was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE602 || 6003 || nn::fs::ResultTooLongPath: Error: Too long path was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE802 || 6004 || nn::fs::ResultInvalidCharacter: Error: Invalid path character was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EEA02 || 6005 || nn::fs::ResultInvalidPathFormat: Error: Invalid path format was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F5A02 || 6061 || nn::fs::ResultInvalidOffset: Error: Invalid offset was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F5C02 || 6062 || nn::fs::ResultInvalidSize: Error: Invalid size was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F5E02 || 6063 || nn::fs::ResultNullptrArgument: Error: Null pointer argument was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F6202 || 6065 || nn::fs::ResultInvalidMountName: Error: Invalid mount name was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F6402 || 6066 || nn::fs::ResultExtensionSizeTooLarge: Error: Extension size exceeds max value set in nmeta file.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F6602 || 6067 || nn::fs::ResultExtensionSizeInvalid: Error: Extension size is not a multiple of nn::fs::SaveDataExtensionUnitSize.&lt;br /&gt;
|-&lt;br /&gt;
| 0x307202 || 6201 || nn::fs::ResultFileExtensionWithoutOpenModeAllowAppend: Error: OpenMode_AllowAppend is required for implicit extension of file size by WriteFile().&lt;br /&gt;
|-&lt;br /&gt;
| 0x307002 - 0x313602 || 6200, 6202 - 6299 || nn::fs::ResultInvalidOperationForOpenMode: Error: Invalid operation for the open mode.&lt;br /&gt;
|-&lt;br /&gt;
| 0x313802 - 0x31FE02 || 6300-6399 || nn::fs::ResultUnsupportedOperation: Error: Unsupported operation.&lt;br /&gt;
|-&lt;br /&gt;
| 0x320002 - 0x326202 || 6400-6449 || nn::fs::ResultPermissionDenied: Error: Permission denied.&lt;br /&gt;
|-&lt;br /&gt;
| 0x327202 || 6457 || nn::fs::ResultWriteModeFileNotClosed: Error: Close files opened in write mode before committing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x328202 || 6465 || nn::fs::ResultUserNotExist: Error: Specified user doesn&#039;t exist.&lt;br /&gt;
|-&lt;br /&gt;
| 0x346402 || 6706 || nn::fs::ResultMappingTableFull: Error: Enough journal space is not left.&lt;br /&gt;
|-&lt;br /&gt;
| 0x346A02 || 6709 || nn::fs::ResultOpenCountLimit: Error: The open count of files and directories reached the limitation.&lt;br /&gt;
|-&lt;br /&gt;
| 0x353602 || 6811 || nn::fs::ResultMapFull: Error: Save data extension count reached the limitation.&lt;br /&gt;
|-&lt;br /&gt;
| 0x35F202 || 6905 || nn::fs::ResultNotMounted: Error: Specified mount name is not found.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Fatal Errors =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Error || Description&lt;br /&gt;
|-&lt;br /&gt;
| 2162-0002&lt;br /&gt;
| Can be triggered by running [[SVC|svcBreak]]. The svcBreak params have no effect on the value of the thrown error-code.&lt;br /&gt;
|-&lt;br /&gt;
| 2168-0000&lt;br /&gt;
| Userland ARM undefined instruction exception&lt;br /&gt;
|-&lt;br /&gt;
| 2168-0001&lt;br /&gt;
| Userland ARM prefetch-abort due to PC set to non-executable region&lt;br /&gt;
|-&lt;br /&gt;
| 2168-0002&lt;br /&gt;
| Userland ARM data abort. Also caused by abnormal process termination via [[SVC|svcExitProcess]]. Note: directly jumping to nnMain()-retaddr from non-main-thread has the same result.&lt;br /&gt;
|-&lt;br /&gt;
| 2168-0003&lt;br /&gt;
| Userland PC address not aligned to 4 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 2168-0008&lt;br /&gt;
| Can occur when attempting to call an svc outside the whitelist&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Support Errors =&lt;br /&gt;
This section is for Support Errors displayed by the error-applet, separate from the normal Result errors.&lt;br /&gt;
&lt;br /&gt;
== Support Modules ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 800 || [[Internet_Browser|General web-applet]]&lt;br /&gt;
|-&lt;br /&gt;
| 809 || [[Internet_Browser|WifiWebAuthApplet]]&lt;br /&gt;
|-&lt;br /&gt;
| 810 || [[Internet_Browser|Whitelisted-applet]]&lt;br /&gt;
|-&lt;br /&gt;
| 811 || [[Internet_Browser|ShopN]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
8XX is for/includes system applets.&lt;br /&gt;
&lt;br /&gt;
== Errors ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Error || Module || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| {web-applets listed above}&lt;br /&gt;
| 2750&lt;br /&gt;
| MP4 parsing failed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Normal error-codes displayed by the system also use the same format as fatal-errors.&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7551</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7551"/>
		<updated>2019-08-28T07:31:02Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add some meanings to the MemoryState.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || [[#svcSignalEvent]] || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || [[#svcClearEvent]] || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R1=info_sub_id_lower32, R2=info_id, R3=handle, R4=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr&lt;br /&gt;
R0=name_ptr, R2=max_sessions, R3=is_light&lt;br /&gt;
|| W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32, R5=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr&lt;br /&gt;
R0=meminfo_ptr, R1=addr_lower32, R2=process_handle, R3=addr_upper32&lt;br /&gt;
|| W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz&lt;br /&gt;
R0=process_handle, R1=main_thread_prio, R2=default_cpuid, R3=main_thread_stacksz_lower32, R4=main_thread_stacksz_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]]&lt;br /&gt;
R1=process_handle, R2=[[#ProcessInfoType]]&lt;br /&gt;
|| W0=result, X1=[[#ProcessState]]&lt;br /&gt;
R0=result, R1=[[#ProcessState]]_lower32, R2=[[#ProcessState]]_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value&lt;br /&gt;
R0=reslimit_handle, R1=[[#LimitableResource]], R2=value_lower32, R3=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args&lt;br /&gt;
R0=smc_sub_id, R1, R2, R3=smc_args&lt;br /&gt;
|| X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
R0,R1,R2,R3=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d, and always in the Heap memory region) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition. The memory allocated counts towards the caller&#039;s process Memory ResourceLimit.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Invalid size passed. It&#039;s either bigger than 4GB, or misaligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD001:&#039;&#039;&#039; Size is bigger than the Heap Region size.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; KMemoryBlockAllocator slab allocator exhausted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The memory region is in an invalid state. Likely because a mapping was made in the heap region.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x10801:&#039;&#039;&#039; Memory resource limit reached.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The memory region was reprotected.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Unaligned address specified.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Unaligned or zero size specified.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The provided memory region does not fall within the userland address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD801:&#039;&#039;&#039; Invalid permission specified. Valid permissions are ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The provided memory region was in an invalid state. The region must have the PermissionChangeAllowed bit set in its [[#MemoryState]], and must not have the IsBorrowed or IsUncached [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; Kernel resource exhausted.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcSignalEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Puts the given event in the signaled state.&lt;br /&gt;
&lt;br /&gt;
Will wake up any thread currently waiting on this event. Can potentially trigger a reschedule.&lt;br /&gt;
&lt;br /&gt;
Any calls to [[#svcWaitSynchronization]] on this handle will return immediately, until the event&#039;s signaled state is reset.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Event is now in signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
== svcClearEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent or ReadableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Takes the given event out of the signaled state.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success, the event is now in the not-signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a ReadableEvent nor a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xFA01:&#039;&#039;&#039; The handle was not in a signaled state.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R5 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R1, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R2 || [[#ProcessInfoType]] || InfoType&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1, R2 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || R1-R3 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || R1-R3 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type || &lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls || Allows using [[#svcWriteDebugProcessMemory]] on segments mapped read-only.&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed || Allows sending this region as an IPC A/B/W buffer with flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]]) ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted || The physical memory blocks backing this region are refcounted.&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] [[#svcCreateCodeMemory|CodeMemoryAllowed]] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7532</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7532"/>
		<updated>2019-08-26T08:13:36Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Linkify&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || [[#svcSignalEvent]] || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || [[#svcClearEvent]] || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R1=info_sub_id_lower32, R2=info_id, R3=handle, R4=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr&lt;br /&gt;
R0=name_ptr, R2=max_sessions, R3=is_light&lt;br /&gt;
|| W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32, R5=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr&lt;br /&gt;
R0=meminfo_ptr, R1=addr_lower32, R2=process_handle, R3=addr_upper32&lt;br /&gt;
|| W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz&lt;br /&gt;
R0=process_handle, R1=main_thread_prio, R2=default_cpuid, R3=main_thread_stacksz_lower32, R4=main_thread_stacksz_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]]&lt;br /&gt;
R1=process_handle, R2=[[#ProcessInfoType]]&lt;br /&gt;
|| W0=result, X1=[[#ProcessState]]&lt;br /&gt;
R0=result, R1=[[#ProcessState]]_lower32, R2=[[#ProcessState]]_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value&lt;br /&gt;
R0=reslimit_handle, R1=[[#LimitableResource]], R2=value_lower32, R3=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args&lt;br /&gt;
R0=smc_sub_id, R1, R2, R3=smc_args&lt;br /&gt;
|| X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
R0,R1,R2,R3=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d, and always in the Heap memory region) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition. The memory allocated counts towards the caller&#039;s process Memory ResourceLimit.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Invalid size passed. It&#039;s either bigger than 4GB, or misaligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD001:&#039;&#039;&#039; Size is bigger than the Heap Region size.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; KMemoryBlockAllocator slab allocator exhausted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The memory region is in an invalid state. Likely because a mapping was made in the heap region.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x10801:&#039;&#039;&#039; Memory resource limit reached.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The memory region was reprotected.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Unaligned address specified.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Unaligned or zero size specified.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The provided memory region does not fall within the userland address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD801:&#039;&#039;&#039; Invalid permission specified. Valid permissions are ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The provided memory region was in an invalid state. The region must have the PermissionChangeAllowed bit set in its [[#MemoryState]], and must not have the IsBorrowed or IsUncached [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; Kernel resource exhausted.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcSignalEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Puts the given event in the signaled state.&lt;br /&gt;
&lt;br /&gt;
Will wake up any thread currently waiting on this event. Can potentially trigger a reschedule.&lt;br /&gt;
&lt;br /&gt;
Any calls to [[#svcWaitSynchronization]] on this handle will return immediately, until the event&#039;s signaled state is reset.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Event is now in signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
== svcClearEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent or ReadableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Takes the given event out of the signaled state.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success, the event is now in the not-signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a ReadableEvent nor a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xFA01:&#039;&#039;&#039; The handle was not in a signaled state.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R5 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R1, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R2 || [[#ProcessInfoType]] || InfoType&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1, R2 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || R1-R3 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || R1-R3 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7531</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7531"/>
		<updated>2019-08-26T08:10:08Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add result code information for svcSetMemoryPermission.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || [[#svcSignalEvent]] || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || [[#svcClearEvent]] || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R1=info_sub_id_lower32, R2=info_id, R3=handle, R4=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr&lt;br /&gt;
R0=name_ptr, R2=max_sessions, R3=is_light&lt;br /&gt;
|| W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32, R5=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr&lt;br /&gt;
R0=meminfo_ptr, R1=addr_lower32, R2=process_handle, R3=addr_upper32&lt;br /&gt;
|| W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz&lt;br /&gt;
R0=process_handle, R1=main_thread_prio, R2=default_cpuid, R3=main_thread_stacksz_lower32, R4=main_thread_stacksz_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]]&lt;br /&gt;
R1=process_handle, R2=[[#ProcessInfoType]]&lt;br /&gt;
|| W0=result, X1=[[#ProcessState]]&lt;br /&gt;
R0=result, R1=[[#ProcessState]]_lower32, R2=[[#ProcessState]]_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value&lt;br /&gt;
R0=reslimit_handle, R1=[[#LimitableResource]], R2=value_lower32, R3=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args&lt;br /&gt;
R0=smc_sub_id, R1, R2, R3=smc_args&lt;br /&gt;
|| X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
R0,R1,R2,R3=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d, and always in the Heap memory region) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition. The memory allocated counts towards the caller&#039;s process Memory ResourceLimit.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Invalid size passed. It&#039;s either bigger than 4GB, or misaligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD001:&#039;&#039;&#039; Size is bigger than the Heap Region size.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; KMemoryBlockAllocator slab allocator exhausted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The memory region is in an invalid state. Likely because a mapping was made in the heap region.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x10801:&#039;&#039;&#039; Memory resource limit reached.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The memory region was reprotected.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Unaligned address specified.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Unaligned or zero size specified.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The provided memory region does not fall within the userland address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD801:&#039;&#039;&#039; Invalid permission specified. Valid permissions are ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The provided memory region was in an invalid state. The region must have the PermissionChangeAllowed state, and must not be Borrowed or Uncached.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; Kernel resource exhausted.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcSignalEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Puts the given event in the signaled state.&lt;br /&gt;
&lt;br /&gt;
Will wake up any thread currently waiting on this event. Can potentially trigger a reschedule.&lt;br /&gt;
&lt;br /&gt;
Any calls to [[#svcWaitSynchronization]] on this handle will return immediately, until the event&#039;s signaled state is reset.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Event is now in signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
== svcClearEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent or ReadableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Takes the given event out of the signaled state.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success, the event is now in the not-signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a ReadableEvent nor a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xFA01:&#039;&#039;&#039; The handle was not in a signaled state.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R5 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R1, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R2 || [[#ProcessInfoType]] || InfoType&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1, R2 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || R1-R3 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || R1-R3 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7530</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7530"/>
		<updated>2019-08-26T07:25:37Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add documentation for Signal/Clear Event.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || [[#svcSignalEvent]] || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || [[#svcClearEvent]] || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R1=info_sub_id_lower32, R2=info_id, R3=handle, R4=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr&lt;br /&gt;
R0=name_ptr, R2=max_sessions, R3=is_light&lt;br /&gt;
|| W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32, R5=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr&lt;br /&gt;
R0=meminfo_ptr, R1=addr_lower32, R2=process_handle, R3=addr_upper32&lt;br /&gt;
|| W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz&lt;br /&gt;
R0=process_handle, R1=main_thread_prio, R2=default_cpuid, R3=main_thread_stacksz_lower32, R4=main_thread_stacksz_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]]&lt;br /&gt;
R1=process_handle, R2=[[#ProcessInfoType]]&lt;br /&gt;
|| W0=result, X1=[[#ProcessState]]&lt;br /&gt;
R0=result, R1=[[#ProcessState]]_lower32, R2=[[#ProcessState]]_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value&lt;br /&gt;
R0=reslimit_handle, R1=[[#LimitableResource]], R2=value_lower32, R3=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args&lt;br /&gt;
R0=smc_sub_id, R1, R2, R3=smc_args&lt;br /&gt;
|| X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
R0,R1,R2,R3=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d, and always in the Heap memory region) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition. The memory allocated counts towards the caller&#039;s process Memory ResourceLimit.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Invalid size passed. It&#039;s either bigger than 4GB, or misaligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD001:&#039;&#039;&#039; Size is bigger than the Heap Region size.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; KMemoryBlockAllocator slab allocator exhausted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The memory region is in an invalid state. Likely because a mapping was made in the heap region.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x10801:&#039;&#039;&#039; Memory resource limit reached.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcSignalEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Puts the given event in the signaled state.&lt;br /&gt;
&lt;br /&gt;
Will wake up any thread currently waiting on this event. Can potentially trigger a reschedule.&lt;br /&gt;
&lt;br /&gt;
Any calls to [[#svcWaitSynchronization]] on this handle will return immediately, until the event&#039;s signaled state is reset.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Event is now in signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
== svcClearEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;WritableEvent or ReadableEvent&amp;gt; || Event&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[#Result]] || Result&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Takes the given event out of the signaled state.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success, the event is now in the not-signaled state.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; Invalid handle. The handle either does not exist, or is not a ReadableEvent nor a WritableEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xFA01:&#039;&#039;&#039; The handle was not in a signaled state.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R5 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R1, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R2 || [[#ProcessInfoType]] || InfoType&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1, R2 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || R1-R3 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || R1-R3 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7523</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7523"/>
		<updated>2019-08-25T15:32:32Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add result code documentation for svcSetHeapSize.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R1=info_sub_id_lower32, R2=info_id, R3=handle, R4=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr&lt;br /&gt;
R0=name_ptr, R2=max_sessions, R3=is_light&lt;br /&gt;
|| W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32, R5=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr&lt;br /&gt;
R0=meminfo_ptr, R1=addr_lower32, R2=process_handle, R3=addr_upper32&lt;br /&gt;
|| W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz&lt;br /&gt;
R0=process_handle, R1=main_thread_prio, R2=default_cpuid, R3=main_thread_stacksz_lower32, R4=main_thread_stacksz_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]]&lt;br /&gt;
R1=process_handle, R2=[[#ProcessInfoType]]&lt;br /&gt;
|| W0=result, X1=[[#ProcessState]]&lt;br /&gt;
R0=result, R1=[[#ProcessState]]_lower32, R2=[[#ProcessState]]_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value&lt;br /&gt;
R0=reslimit_handle, R1=[[#LimitableResource]], R2=value_lower32, R3=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args&lt;br /&gt;
R0=smc_sub_id, R1, R2, R3=smc_args&lt;br /&gt;
|| X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
R0,R1,R2,R3=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d, and always in the Heap memory region) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition. The memory allocated counts towards the caller&#039;s process Memory ResourceLimit.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Invalid size passed. It&#039;s either bigger than 4GB, or misaligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD001:&#039;&#039;&#039; Size is bigger than the Heap Region size.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; KMemoryBlockAllocator slab allocator exhausted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD401:&#039;&#039;&#039; The memory region is in an invalid state. Likely because a mapping was made in the heap region.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x10801:&#039;&#039;&#039; Memory resource limit reached.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R5 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R1, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R2 || [[#ProcessInfoType]] || InfoType&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1, R2 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || R1-R3 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || R1-R3 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7522</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7522"/>
		<updated>2019-08-25T15:07:14Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Oops. I suck at this.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R1=info_sub_id_lower32, R2=info_id, R3=handle, R4=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr&lt;br /&gt;
R0=name_ptr, R2=max_sessions, R3=is_light&lt;br /&gt;
|| W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32, R5=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr&lt;br /&gt;
R0=meminfo_ptr, R1=addr_lower32, R2=process_handle, R3=addr_upper32&lt;br /&gt;
|| W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz&lt;br /&gt;
R0=process_handle, R1=main_thread_prio, R2=default_cpuid, R3=main_thread_stacksz_lower32, R4=main_thread_stacksz_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]]&lt;br /&gt;
R1=process_handle, R2=[[#ProcessInfoType]]&lt;br /&gt;
|| W0=result, X1=[[#ProcessState]]&lt;br /&gt;
R0=result, R1=[[#ProcessState]]_lower32, R2=[[#ProcessState]]_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value&lt;br /&gt;
R0=reslimit_handle, R1=[[#LimitableResource]], R2=value_lower32, R3=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args&lt;br /&gt;
R0=smc_sub_id, R1, R2, R3=smc_args&lt;br /&gt;
|| X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
R0,R1,R2,R3=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R5 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R1, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R2 || [[#ProcessInfoType]] || InfoType&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1, R2 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || R1-R3 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || R1-R3 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7521</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7521"/>
		<updated>2019-08-25T15:06:46Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Finish all the 32-bit ABI. That was fun.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R1=info_sub_id_lower32, R2=info_id, R3=handle, R4=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr&lt;br /&gt;
R0=name_ptr, R2=max_sessions, R3=is_light&lt;br /&gt;
|| W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32, R5=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr&lt;br /&gt;
R0=meminfo_ptr, R1=addr_lower32, R2=process_handle, R3=addr_upper32&lt;br /&gt;
|| W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz&lt;br /&gt;
R0=process_handle, R1=main_thread_prio, R2=default_cpuid, R3=main_thread_stacksz_lower32, R4=main_thread_stacksz_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]]&lt;br /&gt;
R1=process_handle, R2=[[#ProcessInfoType]]&lt;br /&gt;
|| W0=result, X1=[[#ProcessState]]&lt;br /&gt;
R0=result, R1=[[#ProcessState]]_lower32, R2=[[#ProcessState]]_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value&lt;br /&gt;
R0=reslimit_handle, R1=[[#LimitableResource], R2=value_lower32, R3=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args&lt;br /&gt;
R0=smc_sub_id, R1, R2, R3=smc_args&lt;br /&gt;
|| X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
R0,R1,R2,R3=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R5 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R1, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R2 || [[#ProcessInfoType]] || InfoType&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1, R2 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || R1-R3 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || R1-R3 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7520</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7520"/>
		<updated>2019-08-25T15:04:00Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add 32-bit ABI for svcStartProcess and svcGetProcessInfo. Also fix GetProcessInfo, it was missing so much shit.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R1=info_sub_id_lower32, R2=info_id, R3=handle, R4=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr&lt;br /&gt;
R0=name_ptr, R2=max_sessions, R3=is_light&lt;br /&gt;
|| W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32, R5=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr&lt;br /&gt;
R0=meminfo_ptr, R1=addr_lower32, R2=process_handle, R3=addr_upper32&lt;br /&gt;
|| W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz&lt;br /&gt;
R0=process_handle, R1=main_thread_prio, R2=default_cpuid, R3=main_thread_stacksz_lower32, R4=main_thread_stacksz_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]]&lt;br /&gt;
R1=process_handle, R2=[[#ProcessInfoType]]&lt;br /&gt;
|| W0=result, X1=[[#ProcessState]]&lt;br /&gt;
R0=result, R1=[[#ProcessState]]_lower32, R2=[[#ProcessState]]_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R5 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R1, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R2 || [[#ProcessInfoType]] || InfoType&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1, R2 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7519</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7519"/>
		<updated>2019-08-25T14:58:56Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add ABI for svc*ProcessCodeMemory. Nintendo, you&amp;#039;re drunk, go home.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R1=info_sub_id_lower32, R2=info_id, R3=handle, R4=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr&lt;br /&gt;
R0=name_ptr, R2=max_sessions, R3=is_light&lt;br /&gt;
|| W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32, R5=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr&lt;br /&gt;
R0=meminfo_ptr, R1=addr_lower32, R2=process_handle, R3=addr_upper32&lt;br /&gt;
|| W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size&lt;br /&gt;
R0=process_handle, R1=srcaddr_lower32, R2=dstaddr_lower32, R3=dstaddr_upper32, R4=srcaddr_lower32, R5=size_lower32, R6=size_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R5 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R1, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R5, R6 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7518</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7518"/>
		<updated>2019-08-25T14:54:57Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add 32-bit ABI for svc*ProcessMemory&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R1=info_sub_id_lower32, R2=info_id, R3=handle, R4=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr&lt;br /&gt;
R0=name_ptr, R2=max_sessions, R3=is_light&lt;br /&gt;
|| W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32, R5=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size&lt;br /&gt;
R0=dstaddr, R1=process_handle, R2=srcaddr_lower32, R3=srcaddr_upper32, R4=size&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr&lt;br /&gt;
R0=meminfo_ptr, R1=addr_lower32, R2=process_handle, R3=addr_upper32&lt;br /&gt;
|| W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R5 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R1, R3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7517</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7517"/>
		<updated>2019-08-25T14:48:48Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add 32-bit ABI to CreatePort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R1=info_sub_id_lower32, R2=info_id, R3=handle, R4=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr&lt;br /&gt;
R0=name_ptr, R2=max_sessions, R3=is_light&lt;br /&gt;
|| W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7516</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7516"/>
		<updated>2019-08-25T14:46:48Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add svcGetSystemInfo 32-bit ABI&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R1=info_sub_id_lower32, R2=info_id, R3=handle, R4=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7515</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7515"/>
		<updated>2019-08-25T14:44:59Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add svcGetDebugThreadParam 32-bit regs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]]&lt;br /&gt;
R0=thread_id_lower32, R1=thread_id_upper32, R2=debug_handle, R3=[[#DebugThreadParam]]&lt;br /&gt;
|| W0=result, X1=out0, W2=out1&lt;br /&gt;
R0=result, R1=out0_lower32, R2=out0_upper32, R3=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7514</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7514"/>
		<updated>2019-08-25T14:41:38Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: add svcSetHardwareBreakPoint 32-bit regs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle&lt;br /&gt;
R0=HardwareBreakpointId, R1=value_lower32, R2=flags_lower32, R3=flags_upper32, R4=value_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R1, R4 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7513</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7513"/>
		<updated>2019-08-25T14:35:07Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add 32-bit registers for svc*DebugThreadContext&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=ThreadContext*, R1=debug_handle, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]]&lt;br /&gt;
R0=debug_handle, R1=ThreadContext*, R2=thread_id_lower32, R3=thread_id_upper32, R4=[[#ThreadContextFlags]]&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7512</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7512"/>
		<updated>2019-08-25T13:58:22Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add 32-bit registers for svcDebugActiveProcess&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid&lt;br /&gt;
R2=pid_lower32, R3=pid_upper32&lt;br /&gt;
|| W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7511</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7511"/>
		<updated>2019-08-25T13:56:43Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add 32-bit regs to svc*ProcessDataCache.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size&lt;br /&gt;
R0=process_handle, R1=size_lower32, R2=addr_lower32, R3=addr_upper32, R4=size_upper32&lt;br /&gt;
|| W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7510</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7510"/>
		<updated>2019-08-25T13:53:54Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Oops. I suck at this.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7509</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7509"/>
		<updated>2019-08-25T13:53:15Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add 32-regs for svcUnampDeviceAddressSpace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7508</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7508"/>
		<updated>2019-08-25T13:51:22Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add svcMapDeviceAddressSpace regs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || W1=dev_as_handle, W2=proc_handle, X3=dev_map_addr, X4=dev_as_size, X5=dev_as_addr, W6=perm&lt;br /&gt;
R0=dev_map_addr_lower32, R1=dev_as_handle, R2=proc_handle, R3=dev_map_addr_upper32, R4=dev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result, X1=mapped_size&lt;br /&gt;
R0=result, R1=mapped_size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7507</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7507"/>
		<updated>2019-08-25T13:44:03Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add svcMapDeviceAddressSpaceByForce/Aligned&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm&lt;br /&gt;
R0=dev_as_handle, R1=proc_handle, R2=dev_map_addr_lower32, R3=dev_map_addr_upper32, R4=rev_as_size, R5=dev_as_addr_lower32, R6=dev_as_addr_upper32, R7=perm&lt;br /&gt;
|| W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R4 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R5, R6 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R7 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7464</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7464"/>
		<updated>2019-08-18T21:46:47Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: CreateDeviceAddressSpace 32-bit regs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr&lt;br /&gt;
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32&lt;br /&gt;
|| W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0, R1 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7463</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7463"/>
		<updated>2019-08-18T21:44:18Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: 32-bit QueryIoMapping reg (detailed table)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R0 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || R1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7462</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7462"/>
		<updated>2019-08-18T21:43:33Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: 32-bit QueryIoMapping reg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size&lt;br /&gt;
R0=size, R2=physaddr_lower32, R3=physaddr_upper32&lt;br /&gt;
|| W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7461</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7461"/>
		<updated>2019-08-18T21:38:01Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: ReadWriteRegister 32-bit regs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val&lt;br /&gt;
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32&lt;br /&gt;
|| W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size || W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R2, R3 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R0 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R1 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7460</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7460"/>
		<updated>2019-08-18T20:33:24Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Clearly I need some sleep&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val || W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size || W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1|| u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7459</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7459"/>
		<updated>2019-08-18T20:32:46Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Oops again&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id&lt;br /&gt;
|| W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val || W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size || W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1|| u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7458</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7458"/>
		<updated>2019-08-18T20:32:22Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: 32-bit regs for CreateThread. Bad Guy Nintendo is after my sanity.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id&lt;br /&gt;
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val || W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size || W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || R0 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || R4 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1|| u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7456</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7456"/>
		<updated>2019-08-18T20:06:59Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add ControlCodeMemory 32-bit perms (Good guy nintendo allowing 32-bit JITs)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id  || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm&lt;br /&gt;
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val || W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size || W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1|| u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7455</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7455"/>
		<updated>2019-08-18T20:03:58Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add ReplyAndReceiveWithUserBuffer 32-bit regs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id  || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout&lt;br /&gt;
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val || W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size || W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1|| u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7454</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7454"/>
		<updated>2019-08-18T19:57:50Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: 32-bit regs for ReplyAndReceive&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id  || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout&lt;br /&gt;
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val || W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size || W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || R3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1|| u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7453</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7453"/>
		<updated>2019-08-18T19:55:40Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: CreateSession takes a pointer to the name (albeit unused).&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id  || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val || W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size || W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1|| u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7452</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7452"/>
		<updated>2019-08-18T19:54:00Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: 32-bit regs for svcWaitForAddress. Also, commas.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id  || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout&lt;br /&gt;
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=? || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val || W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size || W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1|| u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7451</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7451"/>
		<updated>2019-08-18T19:49:01Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: 32-bit regs for GetResourceLimitLimitValue and GetResourceLimitCurrentValue&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id  || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
R0=result, R1=value_lower32, R2=value_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value X3=timeout ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=? || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val || W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size || W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1|| u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7448</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7448"/>
		<updated>2019-08-18T19:41:38Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Oops, fix previous edit fuckup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id  || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32&lt;br /&gt;
|| W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value X3=timeout ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=? || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val || W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size || W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1|| u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7447</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7447"/>
		<updated>2019-08-18T19:40:49Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Document GetFutureThreadInfo 32-bit registers.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id  || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=timeout_upper32 || W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value X3=timeout ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=? || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val || W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size || W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1|| u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7446</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7446"/>
		<updated>2019-08-18T19:22:42Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add svcGetProcessId and svcGetThreadId 32-bit registers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id  || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
R0=result, R1=pid_lower32, R2=pid_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout || W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value X3=timeout ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=? || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val || W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size || W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1|| u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=7445</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=7445"/>
		<updated>2019-08-18T19:15:47Z</updated>

		<summary type="html">&lt;p&gt;Roblabla: Add svcGetSystemTick 32-bit ABI. Change the detailed 32-bit ABI table format.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id  || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano&lt;br /&gt;
R0=nano_lower32, R1=lower_upper32&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out0, X2=out1&lt;br /&gt;
R0=result, R1=out0, R2=out1_lower32, R3=out1_upper32&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2&lt;br /&gt;
R0=thread_handle, R1=in, R2=in2_lower32, R3=in2_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles, X3=timeout&lt;br /&gt;
R0=timeout_lower32, R1=handles_ptr, R2=num_handles, R3=timeout_upper32&lt;br /&gt;
|| W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || [[#svcCancelSynchronization]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout&lt;br /&gt;
R0=ptr0, R1=ptr, R2=thread_handle, R3=timeout_lower32, R4=timeout_upper32&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || W1=info_id, X2=handle, X3=info_sub_id&lt;br /&gt;
R0=info_sub_id_lower32, R1=info_id, R2=handle, R3=info_sub_id_upper32&lt;br /&gt;
|| W0=result, X1=out&lt;br /&gt;
R0=result, R1=out_lower32, R2=out_upper32&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout || W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value X3=timeout ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value W3=num_to_signal ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=? || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val || W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || [[#svcCreateInterruptEvent]] || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size || W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || [[#svcContinueDebugEvent]] || [1.0.0-2.3.0] W0=debug_handle, W1=[[#ContinueDebugFlagsOld]], X2=thread_id &lt;br /&gt;
[3.0.0+] W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id_list(u64 *), W3=num_tids (max 64, 0 means &amp;quot;all threads&amp;quot;)&lt;br /&gt;
|| W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, X1=thread_id, X2=ThreadContext*, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || [[#svcSetHardwareBreakPoint]] || W0=HardwareBreakpointId, X1=watchpoint_flags/breakpoint_flags, X2=watchpoint_value/debug_handle || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=is_light, X4=name_ptr || W0=result, W1=serverport_handle, W2=clientport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || X0=dstaddr, W1=process_handle, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle, W1=[[#ProcessInfoType]] || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || [[#svcCallSecureMonitor]] || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000 (2MB).&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than or equal to 4GB.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
[1.0.0] This could be used to map into either the Alias Region or the Stack region.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] This can only be used to map into the Stack region.&lt;br /&gt;
&lt;br /&gt;
Code can get the range of the Alias region from [[#svcGetInfo]] id0=2,3, and on 2.0.0+ the range of the Stack region via [[#svcGetInfo]] id0=14, 15 (on 1.0.0, the Stack region had hardcoded limits).&lt;br /&gt;
&lt;br /&gt;
When mapped into the Alias region, the mapped memory will have state 0x482907.&lt;br /&gt;
&lt;br /&gt;
When mapped into the Stack region, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || R0, R1 || s64 || Nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nanoseconds to 0, -1, or -2 indicates a yielding type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Yielding without core migration&lt;br /&gt;
|-&lt;br /&gt;
| -1 || Yielding with core migration&lt;br /&gt;
|-&lt;br /&gt;
| -2 || Yielding to any other thread&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || R2, R3 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || R0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || R1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || R2, R3 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || R1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || R2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || R0, R3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || R1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40.&lt;br /&gt;
&lt;br /&gt;
When zero handles are passed, this will wait forever until either timeout or cancellation occurs.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KDebug:&#039;&#039;&#039; signals when there is a new [[#DebugEventInfo|DebugEvent]] (retrievable via [[#svcGetDebugEvent]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KClientPort:&#039;&#039;&#039; signals when the number of sessions is less than the maximum allowed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KProcess:&#039;&#039;&#039; signals when the process undergoes a state change (retrievable via [[#svcGetProcessInfo]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KReadableEvent:&#039;&#039;&#039; signals when the event&#039;s corresponding KWritableEvent has been signaled via svcSignalEvent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerPort:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KServerSession:&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KThread:&#039;&#039;&#039; signals when the thread has exited.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signaled before the timeout expired, or one of the objects is a Session with a closed remote. Handle index is updated to indicate which object signaled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x7601:&#039;&#039;&#039; Thread termination requested. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe601:&#039;&#039;&#039; Invalid address. Returned when the handles pointer is not a readable address. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signaled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xec01:&#039;&#039;&#039; Interrupted. Returned when another thread uses [[#svcCancelSynchronization]] to cancel this thread. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xee01:&#039;&#039;&#039; Too many handles. Returned when the number of handles passed is &amp;gt; 0x40.&lt;br /&gt;
&lt;br /&gt;
== svcCancelSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the referenced thread is currently in a synchronization call ([[#svcWaitSynchronization]], [[#svcReplyAndReceive]] or [[#svcReplyAndReceiveLight]]), that call will be interrupted and return 0xec01.&lt;br /&gt;
If that thread is not currently executing such a synchronization call, the next call to a synchronization call will return 0xec01.&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t take force-pause (activity/debug pause) into account.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The thread was either interrupted or has had its flag set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. The handle given was either invalid or not a thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument64 || Argument32 || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || R0, R1 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size and CmdPtr must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xcc01:&#039;&#039;&#039; CmdPtr is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xca01:&#039;&#039;&#039; Size is not 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xce01:&#039;&#039;&#039; KSessionRequest allocation failed (unlikely) or pointer buffer size exceeded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Handles does not exist, or handle is not an instance of KClientSession.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || Result || 0 (Success)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the process is attached, report the Break event. Then, if svcContinueDebugEvent didn&#039;t apply IgnoreException on the thread: if TPIDR_EL0 is 0, adjust ELR_EL1 to retry to svc instruction (and set TPIDR_EL0 to 1).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit31 in reason isn&#039;t set, perform crash reporting (see Exception Handling section below), if it doesn&#039;t terminate the process adjust ELR_EL1 as well.&lt;br /&gt;
&lt;br /&gt;
Otherwise just return 0.&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) R0 || u32 || InfoSubIdLower32&lt;br /&gt;
|-&lt;br /&gt;
| (In) R1 || u32 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) R2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) R3 || u32 || InfoSubIdUpper32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R1 || u32 || OutLower32&lt;br /&gt;
|-&lt;br /&gt;
| (Out) R2 || u32 || OutUpper32&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || AliasRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || AliasRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] StackRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] StackRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] PersonalMmHeapSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 21 || 0 || [6.0.0+] TotalMemoryAvailableWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Process || 22 || 0 || [6.0.0+] TotalMemoryUsedWithoutMmHeap&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0-3, -1 || Thread Ticks. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is zero, the TLS should contain a blank message. If this message has a C descriptor, the buffer it points to will be used as the pointer buffer. See [[IPC_Marshalling#IPC_buffers]]. Note that a pointer buffer cannot be specified if ReplyTarget is not zero.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1|| u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcCreateInterruptEvent ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || IrqNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || bool || Flags&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ReadableEvent&amp;gt; || ReadableEventHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create an event handle for the given IRQ number. Waiting on this handle will wait until the IRQ is triggered. The flags argument configures the triggering. If it is false, the IRQ is active HIGH level sensitive, if it is true it is rising-edge sensitive.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Flags was &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF201:&#039;&#039;&#039; IRQ above 0x3FF or outside the [[NPDM#Kernel_Access_Control|IRQ access mask]] was given.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCE01:&#039;&#039;&#039; A SlabHeap was exhausted (too many interrupts created).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF401:&#039;&#039;&#039; IRQ already has an event registered.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xD201:&#039;&#039;&#039; The handle table is full. Try closing some handles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcContinueDebugEvent ==&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. The process has been resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid debug handle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf401:&#039;&#039;&#039; Process has debug events queued or is already running.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u32* || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
CapabilitiesPtr points to an array of [[NPDM#Kernel_Access_Control|kernel capabilities]].&lt;br /&gt;
CapabilitiesNum is a number of capabilities in the CapabilitiesPtr array (number of element, not number of bytes).&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCA01:&#039;&#039;&#039; Attempted to map more code pages than available in address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xCC01:&#039;&#039;&#039; Provided CodeAddr is invalid (make sure it&#039;s in range?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE401:&#039;&#039;&#039; The resource handle passed is invalid.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE601:&#039;&#039;&#039; Attempt to copy procinfo from user-supplied pointer failed. Attempt to copy capabilities_num from user-supplied pointer failed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xE801:&#039;&#039;&#039; Attempted to create a 32-bit process with a 36-bit address space.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xF001:&#039;&#039;&#039; Unused bits are set in mmuflags. Unknown address space type used.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== svcCallSecureMonitor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || [[SMC#ID_0|Function ID]]&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1-X7 || u64 || SMC sub-arguments&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || [[SMC#Errors|SMC Result]] || Result of SMC&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1-X7 || u64 || SMC sub-output&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes in a SMC function ID in X0, and arguments for that SMC function in X1-X7.&lt;br /&gt;
&lt;br /&gt;
Passing an invalid SMC function ID or calling from a core other than core 3 will result in a secure monitor panic.&lt;br /&gt;
&lt;br /&gt;
The kernel parses bits 9-15 in the passed SMC function ID (per the ARM SMC calling convention), and when set uses as an indicator to translate a pointer in the associated register (X1-X7) to a physical address. The kernel will translate any address mapped as R-W, other addresses (R--, R-X, or invalid pointers) will be translated as 0/NULL.&lt;br /&gt;
&lt;br /&gt;
Output is returned raw from the Secure Monitor; X0 will be the untranslated SMC result and X1-X7 will contain other SMC output (or be unchanged, depending on the SMC).&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
== svcSetHardwareBreakPoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || u32 || hardware_breakpoint_id&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || flags&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || value&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets one of the AArch64 hardware breakpoints. The nintendo switch has 6 hardware breakpoints, and 4 hardware watchpoints. The syscall has two behaviors depending on the value of hardware_breakpoint_id:&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id &amp;lt; 0x10, then it sets one of the AArch64 hardware breakpoints. Flags will go to DBGBCRn_EL1, and value to DBGBVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0x7F01E1. Furthermore, the kernel will or it with 0x4004, in order to set various security flags to guarantee the watchpoints only triggers for code in EL0. If the user asks for a Breakpoint Type of ContextIDR match, the kernel shall use the given debug_handle to set DBGBVRn_EL1 to the ContextID of the debugged process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If hardware_breakpoint_id is between 0x10 and 0x20 (exclusive), then it sets one of the AArch64 hardware watchpoints. Flags will go to DBGWCRn_EL1, and the value to DBGWVRn_EL1. The only flags the user is allowed to set are those in the bitmask 0xFF0F1FF9. Furthermore, the kernel will or it with 0x104004. This will set various security flags, and set the watchpoint type to be a Linked Watchpoint. This means that you need to link it to a Linked ContextIDR breakpoint. Check the ARM documentation for more information.&lt;br /&gt;
&lt;br /&gt;
Note that hardware_breakpoint_id 0 to 4 match only to Virtual Address, while hardware_breakpoint_id 5 and 6 match against either Virtual Address, ContextID, or VMID. As such, if you are configuring a breakpoint to link for a watchpoint, make sure you use hardware_breakpoint_id 5 or 6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more documentation for hardware breakpoints, check out the AArch64 documentation for the [http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0488h/way1382455558968.html DBGBCRn_EL1 register] and the [http://infocenter.arm.com/help/topic/com.arm.doc.ddi0488h/way1382455560629.html DBGWCRn_EL1 register]&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || General-purpose registers || If in 64-bit mode, GPRs 0–28 will be read/written. If in 32-bit mode, GPRs 0–12 will be read/written.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || Control registers || Reads/writes the FP, LR, PC, SP, PSTATE, and TPIDR registers.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Floating-point registers || Reads/writes the floating-point vector registers.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || Floating-point control registers || Reads/writes the FPCR and FPSR registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Note&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory || Bytes of memory a process may allocate.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads || Amount of threads a process can create.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events || Amount of events a process can create through svcCreateEvent or svcSendAsyncRequestWithUserBuffer.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories || Amount of TransferMemory a process can create through svcCreateTransferMemory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions || Amount of session a process can create through svcCreateSession, svcConnectToPort or svcConnectToNamedPort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessInfoType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#ProcessState|ProcessInfoType_ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessState_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessState_CreatedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessState_Started ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessState_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessState_StartedAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessState_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessState_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessState_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_DynamicPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugThreadParam_SchedulingStatus&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_PreferredCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugThreadParam_CurrentCpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_AffinityMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dynamic priority: output in out2&lt;br /&gt;
&lt;br /&gt;
Scheduling status: out1 contains bit0: is debug-suspended, bit1: is user-suspended (svcSetThreadActivity 1 or svcSetProcessActivity 1).&lt;br /&gt;
Out2 contains {suspended, idle, running, terminating} =&amp;gt; {5, 0, 1, 4}&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_PreferredCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_CurrentCpuCore: output in out2&lt;br /&gt;
&lt;br /&gt;
DebugThreadParam_AffinityMask: output in out1&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || Flags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsApplication&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] UseSecureMemory&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit11 || [7.0.0+] OptimizeMemoryAllocation (Only allowed in combination with IsApplication).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle or zero&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] SystemResourceNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] (maybe lower?) a zero ResourceLimitHandle defaults to sysmodule limits and 0x12300000 bytes of memory.&lt;br /&gt;
&lt;br /&gt;
The PersonalMmHeap are allocated as follows:&lt;br /&gt;
* For the application, normal insecure pool is used. Carveout 5 is used to provide protection.&lt;br /&gt;
* For the applet, a pre-allocated secure pool segment of size 0x400000 is used.&lt;br /&gt;
* For sysmodules, secure pool is allocated.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Name || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed || Used by MapMemory, as an async IPC user buffer, &lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcLocked || True when IpcRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceShared || True when DeviceRefCount &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 11 || NonDeviceIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 12 || NonSecureIpcSendAllowed&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_Alias || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_Ipc]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_Stack || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_NonSecureIpc]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_NonDeviceIpc]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ArbitrationType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || WaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || DecrementAndWaitIfLessThan&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || WaitIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SignalType ==&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Signal&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || SignalAndIncrementIfEqual&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || SignalAndModifyBasedOnWaitingThreadCountIfEqual&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlagsOld ==&lt;br /&gt;
[1.0.0-2.3.0]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: ResumeAllThreads or debug-suspended-thread-id needed)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
[3.0.0+]&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || IgnoreException (note: doesn&#039;t need to be set in the same call than Resume)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || DontCatchExceptions&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || Resume&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 || IgnoreOtherThreadsExceptions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
IgnoreExceptionsOfOthers is like IgnoreException but acts on all threads that aren&#039;t in the input list. The affected threads are resumed.&lt;br /&gt;
&lt;br /&gt;
Only one of of Resume and IgnoreOtherThreadsExceptions can be set at a time.&lt;br /&gt;
&lt;br /&gt;
If the input number of threads is 0, this means &amp;quot;all threads&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
The below table is for the Aarch64 version of the system call. For A32, all u64 fields but title/process/thread id are actually u32, making the structure 0x28-byte-big (0x40 for a64).&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32|| Type (0=PausedThread, 1=RunningThread, 2=ExitedProcess, 3=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u32 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugEvent_ExitProcess&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_ExitThread&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_Trap (*)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc (**)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Exception_SError [not in 1.0.0]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Undefined instructions, software breakpoints, some other traps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Data aborts, FP traps, and everything else that doesn&#039;t belong to any of the above.&lt;br /&gt;
&lt;br /&gt;
Trap specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
First of all, a function that might be called by synchronous exception handler and that is called by the SError handler fetches the exception info, adjusts PC, panics on exceptions taken from EL1, then dispatches the exception.&lt;br /&gt;
&lt;br /&gt;
The dispatcher has two mutually exclusive exception reporting methods:&lt;br /&gt;
* by storing information at the start of the process&#039;s TLS memregion (TPIDRRO_EL0) and jumping back to the crt0&lt;br /&gt;
* by using KDebug&lt;br /&gt;
&lt;br /&gt;
KDebug dispatching is used when at least one of the following conditions are met:&lt;br /&gt;
* SMC ConfigItem KernelMemConfig bit 1 is NOT set (it isn&#039;t on retail), unless: this is a software or hardware breakpoint, or a watchpoint, or [4.0.0+?] the process is attached and this is a Google PNaCl trap instruction (see LLVM source)&lt;br /&gt;
* FAR doesn&#039;t point to a valid address in mapped-readable CodeStatic memory (i.e. this is the case for NRO and JIT memory) or this is one of the following exceptions (it particular, that doesn&#039;t include FP exceptions occurring in CodeStatic memory):&lt;br /&gt;
** Uncategorized&lt;br /&gt;
** IllegalState&lt;br /&gt;
** SupervisorCallA32&lt;br /&gt;
** SupervisorCallA64&lt;br /&gt;
** PCAlignment&lt;br /&gt;
** SPAlignment&lt;br /&gt;
** SError&lt;br /&gt;
** BreakpointLowerEl&lt;br /&gt;
** SoftwareStepLowerEl (note: no way set single-step flag; not parsed)&lt;br /&gt;
** WatchpointLowerEl&lt;br /&gt;
** SoftwareBreakpointA32 (note: not parsed)&lt;br /&gt;
** SoftwareBreakpointA64 (note: not parsed)&lt;br /&gt;
    &lt;br /&gt;
In all other cases the userland-handled exception path is taken.&lt;br /&gt;
&lt;br /&gt;
KDebug path:&lt;br /&gt;
&lt;br /&gt;
If the process is attached, the exception is reported to the KDebug. If the thread was continued using flag IgnoreExceptions, it returns from the exception as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
If the latter is not the case, or if the process isn&#039;t attached, proceed to [2.0.0+] crash reporting (or in [1.0.0] just terminate the process): &lt;br /&gt;
if EnableDebug is set, and depending on the process state (more than one crash per process isn&#039;t permitted) it may signal itself with ProcessState_Crashed so that PM asks NS to start creport so that creport attaches to it and reports the crashes. Otherwise, just terminate.&lt;br /&gt;
&lt;br /&gt;
Userland reporting path and svcReturnFromException:&lt;br /&gt;
&lt;br /&gt;
TLS region start (A64):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x148 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x78 || ExceptionFrameA64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA64:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x48 (8*9) || GPRs 0..8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 || 0x8 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 0x8 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || 0x8 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || 0x4 || pstate &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 0x8 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TLS region start (A32):&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x178 || Exception stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x148 || 0x44 || ExceptionFrameA32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ExceptionFrameA32:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x20 (8*4) || GPRs 0..7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x4 || sp&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x4 || lr&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 0x4 || pc (elr_el1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 0x4 || tpidr_el0 = 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || 0x4 || cpsr &amp;amp; 0xFF0FFE20&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || 0x4 || afsr0&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 0x4 || afsr1&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x4 || esr&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 || 0x4 || far&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In that case, after storing the regs in the TLS, the exception handler returns to the application&#039;s crt0 (entrypoint), with X0=&amp;lt;error description code&amp;gt; (see below) and X1=SP=frame=&amp;lt;stack top&amp;gt; (see above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Desc. code || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || Instruction abort&lt;br /&gt;
|-&lt;br /&gt;
| 0x102 || Misaligned PC&lt;br /&gt;
|-&lt;br /&gt;
| 0x103 || Misaligned SP&lt;br /&gt;
|-&lt;br /&gt;
| 0x106 || SError [not in 1.0.0?]&lt;br /&gt;
|-&lt;br /&gt;
| 0x301 || Bad SVC&lt;br /&gt;
|-&lt;br /&gt;
| 0x104 || Uncategorized, CP15RTTrap, CP15RRTTrap, CP14RTTrap, CP14RRTTrap, IllegalState, SystemRegisterTrap&lt;br /&gt;
|-&lt;br /&gt;
| 0x101 || None of the above, EC &amp;lt;= 0x34 and not a breakpoint&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(During normal app boot the process is invoked with X0=0 and X1=main_thread_handle. The crt0 of retail apps determines whether to boot normally or handle an exception if X0 is set to 0 or not)&lt;br /&gt;
&lt;br /&gt;
The application is supposed to promptly update the contents of elr_el1 to a user handler (and any other regs it sees fit) and call svcReturnFromException (error code) to call that handler. The latter is then expected to promptly abort the program.&lt;br /&gt;
&lt;br /&gt;
svcReturnFromException updates the contents of the kernel stack frame with what the user provided in the TLS structure, sets TPIDR_EL0 to 1, then:&lt;br /&gt;
* if the provided error code is 0, gracefully pivots and returns from exception&lt;br /&gt;
* if it is not, replays the exception and pass it to the KDebug (see above). One can pass 0x10001 to prevent process termination. If the process is attached, this also prevents crash-collection/termination (different from the exception handler behavior)&lt;br /&gt;
&lt;br /&gt;
If an exception occurs from the above user handler, the entire exception handling process will repeat with the new exception.&lt;br /&gt;
&lt;br /&gt;
Note that if a thread that wasn&#039;t faulting calls svcReturnFromException, it signals an &amp;quot;invalid syscall&amp;quot; exception&lt;br /&gt;
&lt;br /&gt;
Note that [[SMC|IsDebugMode]] is not used during exception-handling, except for enabling printing a message to UART-A. This UART code causes a system-hang on retail (likely due to a loop that doesn&#039;t exit). This printing doesn&#039;t seem to run when the process is attached for debugging?&lt;/div&gt;</summary>
		<author><name>Roblabla</name></author>
	</entry>
</feed>