<?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=OgniK</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=OgniK"/>
	<link rel="alternate" type="text/html" href="https://switchbrew.org/wiki/Special:Contributions/OgniK"/>
	<updated>2026-05-02T11:28:17Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Shared_Database_services&amp;diff=4503</id>
		<title>Shared Database services</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Shared_Database_services&amp;diff=4503"/>
		<updated>2018-04-22T21:07:14Z</updated>

		<summary type="html">&lt;p&gt;OgniK: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= pl:u =&lt;br /&gt;
This is &amp;quot;nn::pl::detail::ISharedFontManager&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#RequestLoad]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#GetLoadState]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [[#GetSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [[#GetSharedMemoryAddressOffset]]&lt;br /&gt;
|-&lt;br /&gt;
| 4 || [[#GetSharedMemoryNativeHandle]]&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [[#GetSharedFontInOrderOfPriority]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RequestLoad ==&lt;br /&gt;
Takes a [[#SharedFontType]] (uint32), no output.&lt;br /&gt;
&lt;br /&gt;
== GetLoadState ==&lt;br /&gt;
Takes a [[#SharedFontType]] (uint32), returns the [[#LoadState]] (uint32).&lt;br /&gt;
&lt;br /&gt;
=== LoadState ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || Loading&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || Loaded&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GetSize ==&lt;br /&gt;
Takes a [[#SharedFontType]] (uint32), returns the Font Size (uint32).&lt;br /&gt;
&lt;br /&gt;
== GetSharedMemoryAddressOffset ==&lt;br /&gt;
Takes a [[#SharedFontType]] (uint32), returns the offset (uint32) to the Font Address.&lt;br /&gt;
&lt;br /&gt;
== GetSharedMemoryNativeHandle ==&lt;br /&gt;
No input, returns an output SharedMemory handle.&lt;br /&gt;
&lt;br /&gt;
User-processes map this SharedMemory with size=0x1100000 and permissions=R--.&lt;br /&gt;
&lt;br /&gt;
Font data is TTF, located at the offset returned by [[#GetSharedMemoryAddressOffset]].&lt;br /&gt;
&lt;br /&gt;
== GetSharedFontInOrderOfPriority ==&lt;br /&gt;
Takes an input u64 [[Settings_services#LanguageCode|LanguageCode]] and 3 type-0x6 output buffers, returns an output u8 and u32. The u8 is a bool to specify if the fonts are loaded or not and the u32 is the font count.&lt;br /&gt;
The first buffer contains a list of [[#SharedFontType|Shared font types]], the second buffer contains the font offsets and the final buffer contains the font sizes.&lt;br /&gt;
The buffers are an array of u32s which specify information about a specific font. Buffer1[n] is related to Buffer2[n] and Buffer3[n].&lt;br /&gt;
Example: Font index 0s offset is at Buffer2[0], size is at Buffer3[0].&lt;br /&gt;
The fonts are relative to the shared memory created by [[#GetSharedMemoryNativeHandle]]&lt;br /&gt;
&lt;br /&gt;
== SharedFontType ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || Japan, US and Europe (Standard)&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || Chinese Simplified&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || Extended Chinese Simplified&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 || Chinese Traditional&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || Korean (Hangul)&lt;br /&gt;
|-&lt;br /&gt;
| 0x05 || Nintendo Extended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= mii:u, mii:e =&lt;br /&gt;
This is &amp;quot;nn::mii::detail::IStaticService&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || GetDatabaseService&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IDatabaseService ==&lt;br /&gt;
This is &amp;quot;nn::mii::detail::IDatabaseService&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsUpdated&lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsFullDatabase&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GetCount&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Get&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Get1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || UpdateLatest&lt;br /&gt;
|-&lt;br /&gt;
| 6 || BuildRandom&lt;br /&gt;
|-&lt;br /&gt;
| 7 || BuildDefault&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Get2&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Get3&lt;br /&gt;
|-&lt;br /&gt;
| 10 || UpdateLatest1&lt;br /&gt;
|-&lt;br /&gt;
| 11 || FindIndex&lt;br /&gt;
|-&lt;br /&gt;
| 12 || Move&lt;br /&gt;
|-&lt;br /&gt;
| 13 || AddOrReplace&lt;br /&gt;
|-&lt;br /&gt;
| 14 || Delete&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DestroyFile&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeleteFile&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Format&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Import&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Export&lt;br /&gt;
|-&lt;br /&gt;
| 20 || IsBrokenDatabaseWithClearFlag&lt;br /&gt;
|-&lt;br /&gt;
| 21 || GetIndex&lt;br /&gt;
|-&lt;br /&gt;
| 22 || [5.0.0+] SetInterfaceVersion&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [5.0.0+] Convert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= miiimg =&lt;br /&gt;
This is &amp;quot;nn::mii::detail::IImageDatabaseService&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Initialize&lt;br /&gt;
|-&lt;br /&gt;
| 10 || Reload&lt;br /&gt;
|-&lt;br /&gt;
| 11 || GetCount&lt;br /&gt;
|-&lt;br /&gt;
| 12 || IsEmpty&lt;br /&gt;
|-&lt;br /&gt;
| 13 || IsFull&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GetAttribute&lt;br /&gt;
|-&lt;br /&gt;
| 15 || LoadImage&lt;br /&gt;
|-&lt;br /&gt;
| 16 || AddOrUpdateImage&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeleteImages&lt;br /&gt;
|-&lt;br /&gt;
| 100 || DeleteFile&lt;br /&gt;
|-&lt;br /&gt;
| 101 || DestroyFile&lt;br /&gt;
|-&lt;br /&gt;
| 102 || ImportFile&lt;br /&gt;
|-&lt;br /&gt;
| 103 || ExportFile&lt;br /&gt;
|-&lt;br /&gt;
| 104 || ForceInitialize&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Shared_Database_services&amp;diff=4502</id>
		<title>Shared Database services</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Shared_Database_services&amp;diff=4502"/>
		<updated>2018-04-22T20:59:59Z</updated>

		<summary type="html">&lt;p&gt;OgniK: spelling error&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= pl:u =&lt;br /&gt;
This is &amp;quot;nn::pl::detail::ISharedFontManager&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#RequestLoad]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#GetLoadState]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [[#GetSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [[#GetSharedMemoryAddressOffset]]&lt;br /&gt;
|-&lt;br /&gt;
| 4 || [[#GetSharedMemoryNativeHandle]]&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [[#GetSharedFontInOrderOfPriority]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RequestLoad ==&lt;br /&gt;
Takes a [[#SharedFontType]] (uint32), no output.&lt;br /&gt;
&lt;br /&gt;
== GetLoadState ==&lt;br /&gt;
Takes a [[#SharedFontType]] (uint32), returns the [[#LoadState]] (uint32).&lt;br /&gt;
&lt;br /&gt;
=== LoadState ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || Loading&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || Loaded&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GetSize ==&lt;br /&gt;
Takes a [[#SharedFontType]] (uint32), returns the Font Size (uint32).&lt;br /&gt;
&lt;br /&gt;
== GetSharedMemoryAddressOffset ==&lt;br /&gt;
Takes a [[#SharedFontType]] (uint32), returns the offset (uint32) to the Font Address.&lt;br /&gt;
&lt;br /&gt;
== GetSharedMemoryNativeHandle ==&lt;br /&gt;
No input, returns an output SharedMemory handle.&lt;br /&gt;
&lt;br /&gt;
User-processes map this SharedMemory with size=0x1100000 and permissions=R--.&lt;br /&gt;
&lt;br /&gt;
Font data is TTF, located at the offset returned by [[#GetSharedMemoryAddressOffset]].&lt;br /&gt;
&lt;br /&gt;
== GetSharedFontInOrderOfPriority ==&lt;br /&gt;
Takes an input u64 [[Settings_services#LanguageCode|LanguageCode]] and 3 type-0x6 output buffers, returns an output u8 and u32. The u8 is a bool to specify if the fonts are loaded or not and the u32 is the font count.&lt;br /&gt;
The first buffer contains the font indexes, the second buffer contains the font offsets and the final buffer contains the font sizes.&lt;br /&gt;
The buffers are an array of u32s which specify information about a specific font. Buffer1[n] is related to Buffer2[n] and Buffer3[n].&lt;br /&gt;
Example: Font index 0s offset is at Buffer2[0], size is at Buffer3[0].&lt;br /&gt;
&lt;br /&gt;
== SharedFontType ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || Japan, US and Europe (Standard)&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || Chinese Simplified&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || Extended Chinese Simplified&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 || Chinese Traditional&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || Korean (Hangul)&lt;br /&gt;
|-&lt;br /&gt;
| 0x05 || Nintendo Extended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= mii:u, mii:e =&lt;br /&gt;
This is &amp;quot;nn::mii::detail::IStaticService&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || GetDatabaseService&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IDatabaseService ==&lt;br /&gt;
This is &amp;quot;nn::mii::detail::IDatabaseService&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsUpdated&lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsFullDatabase&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GetCount&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Get&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Get1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || UpdateLatest&lt;br /&gt;
|-&lt;br /&gt;
| 6 || BuildRandom&lt;br /&gt;
|-&lt;br /&gt;
| 7 || BuildDefault&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Get2&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Get3&lt;br /&gt;
|-&lt;br /&gt;
| 10 || UpdateLatest1&lt;br /&gt;
|-&lt;br /&gt;
| 11 || FindIndex&lt;br /&gt;
|-&lt;br /&gt;
| 12 || Move&lt;br /&gt;
|-&lt;br /&gt;
| 13 || AddOrReplace&lt;br /&gt;
|-&lt;br /&gt;
| 14 || Delete&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DestroyFile&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeleteFile&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Format&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Import&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Export&lt;br /&gt;
|-&lt;br /&gt;
| 20 || IsBrokenDatabaseWithClearFlag&lt;br /&gt;
|-&lt;br /&gt;
| 21 || GetIndex&lt;br /&gt;
|-&lt;br /&gt;
| 22 || [5.0.0+] SetInterfaceVersion&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [5.0.0+] Convert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= miiimg =&lt;br /&gt;
This is &amp;quot;nn::mii::detail::IImageDatabaseService&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Initialize&lt;br /&gt;
|-&lt;br /&gt;
| 10 || Reload&lt;br /&gt;
|-&lt;br /&gt;
| 11 || GetCount&lt;br /&gt;
|-&lt;br /&gt;
| 12 || IsEmpty&lt;br /&gt;
|-&lt;br /&gt;
| 13 || IsFull&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GetAttribute&lt;br /&gt;
|-&lt;br /&gt;
| 15 || LoadImage&lt;br /&gt;
|-&lt;br /&gt;
| 16 || AddOrUpdateImage&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeleteImages&lt;br /&gt;
|-&lt;br /&gt;
| 100 || DeleteFile&lt;br /&gt;
|-&lt;br /&gt;
| 101 || DestroyFile&lt;br /&gt;
|-&lt;br /&gt;
| 102 || ImportFile&lt;br /&gt;
|-&lt;br /&gt;
| 103 || ExportFile&lt;br /&gt;
|-&lt;br /&gt;
| 104 || ForceInitialize&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Shared_Database_services&amp;diff=4501</id>
		<title>Shared Database services</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Shared_Database_services&amp;diff=4501"/>
		<updated>2018-04-22T20:56:11Z</updated>

		<summary type="html">&lt;p&gt;OgniK: /* GetSharedFontInOrderOfPriority */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= pl:u =&lt;br /&gt;
This is &amp;quot;nn::pl::detail::ISharedFontManager&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#RequestLoad]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#GetLoadState]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [[#GetSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [[#GetSharedMemoryAddressOffset]]&lt;br /&gt;
|-&lt;br /&gt;
| 4 || [[#GetSharedMemoryNativeHandle]]&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [[#GetSharedFontInOrderOfPriority]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RequestLoad ==&lt;br /&gt;
Takes a [[#SharedFontType]] (uint32), no output.&lt;br /&gt;
&lt;br /&gt;
== GetLoadState ==&lt;br /&gt;
Takes a [[#SharedFontType]] (uint32), returns the [[#LoadState]] (uint32).&lt;br /&gt;
&lt;br /&gt;
=== LoadState ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || Loading&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || Loaded&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GetSize ==&lt;br /&gt;
Takes a [[#SharedFontType]] (uint32), returns the Font Size (uint32).&lt;br /&gt;
&lt;br /&gt;
== GetSharedMemoryAddressOffset ==&lt;br /&gt;
Takes a [[#SharedFontType]] (uint32), returns the offset (uint32) to the Font Address.&lt;br /&gt;
&lt;br /&gt;
== GetSharedMemoryNativeHandle ==&lt;br /&gt;
No input, returns an output SharedMemory handle.&lt;br /&gt;
&lt;br /&gt;
User-processes map this SharedMemory with size=0x1100000 and permissions=R--.&lt;br /&gt;
&lt;br /&gt;
Font data is TTF, located at the offset returned by [[#GetSharedMemoryAddressOffset]].&lt;br /&gt;
&lt;br /&gt;
== GetSharedFontInOrderOfPriority ==&lt;br /&gt;
Takes an input u64 [[Settings_services#LanguageCode|LanguageCode]] and 3 type-0x6 output buffers, returns an output u8 and u32. The u8 is a bool to specify if the fonts are loaded or not and the u32 is the font count.&lt;br /&gt;
The first buffer the font indexes, the second buffer contains the font offsets and the final buffer contains the font sizes.&lt;br /&gt;
The buffers are arrays of u32 which give information about a specific font. Buffer1[n] is related to Buffer2[n] and Buffer3[n].&lt;br /&gt;
Example: Font index 0s offset is at Buffer2[0], size is at Buffer3[0].&lt;br /&gt;
&lt;br /&gt;
== SharedFontType ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || Japan, US and Europe (Standard)&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || Chinese Simplified&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || Extended Chinese Simplified&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 || Chinese Traditional&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || Korean (Hangul)&lt;br /&gt;
|-&lt;br /&gt;
| 0x05 || Nintendo Extended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= mii:u, mii:e =&lt;br /&gt;
This is &amp;quot;nn::mii::detail::IStaticService&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || GetDatabaseService&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IDatabaseService ==&lt;br /&gt;
This is &amp;quot;nn::mii::detail::IDatabaseService&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsUpdated&lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsFullDatabase&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GetCount&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Get&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Get1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || UpdateLatest&lt;br /&gt;
|-&lt;br /&gt;
| 6 || BuildRandom&lt;br /&gt;
|-&lt;br /&gt;
| 7 || BuildDefault&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Get2&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Get3&lt;br /&gt;
|-&lt;br /&gt;
| 10 || UpdateLatest1&lt;br /&gt;
|-&lt;br /&gt;
| 11 || FindIndex&lt;br /&gt;
|-&lt;br /&gt;
| 12 || Move&lt;br /&gt;
|-&lt;br /&gt;
| 13 || AddOrReplace&lt;br /&gt;
|-&lt;br /&gt;
| 14 || Delete&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DestroyFile&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeleteFile&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Format&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Import&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Export&lt;br /&gt;
|-&lt;br /&gt;
| 20 || IsBrokenDatabaseWithClearFlag&lt;br /&gt;
|-&lt;br /&gt;
| 21 || GetIndex&lt;br /&gt;
|-&lt;br /&gt;
| 22 || [5.0.0+] SetInterfaceVersion&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [5.0.0+] Convert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= miiimg =&lt;br /&gt;
This is &amp;quot;nn::mii::detail::IImageDatabaseService&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Initialize&lt;br /&gt;
|-&lt;br /&gt;
| 10 || Reload&lt;br /&gt;
|-&lt;br /&gt;
| 11 || GetCount&lt;br /&gt;
|-&lt;br /&gt;
| 12 || IsEmpty&lt;br /&gt;
|-&lt;br /&gt;
| 13 || IsFull&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GetAttribute&lt;br /&gt;
|-&lt;br /&gt;
| 15 || LoadImage&lt;br /&gt;
|-&lt;br /&gt;
| 16 || AddOrUpdateImage&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeleteImages&lt;br /&gt;
|-&lt;br /&gt;
| 100 || DeleteFile&lt;br /&gt;
|-&lt;br /&gt;
| 101 || DestroyFile&lt;br /&gt;
|-&lt;br /&gt;
| 102 || ImportFile&lt;br /&gt;
|-&lt;br /&gt;
| 103 || ExportFile&lt;br /&gt;
|-&lt;br /&gt;
| 104 || ForceInitialize&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=NV_services&amp;diff=4492</id>
		<title>NV services</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=NV_services&amp;diff=4492"/>
		<updated>2018-04-19T22:55:01Z</updated>

		<summary type="html">&lt;p&gt;OgniK: /* NVMAP_IOC_ALLOC */ Observed in yuzu.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Switch uses a customized NVIDIA driver.&lt;br /&gt;
&lt;br /&gt;
= nvdrv, nvdrv:a, nvdrv:s, nvdrv:t =&lt;br /&gt;
This is &amp;quot;nns::nvdrv::INvDrvServices&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Main NVIDIA driver service.&lt;br /&gt;
&lt;br /&gt;
Each service is used by:&lt;br /&gt;
* &amp;quot;nvdrv&amp;quot;: regular applications&lt;br /&gt;
* &amp;quot;nvdrv:a&amp;quot;: applets&lt;br /&gt;
* &amp;quot;nvdrv:s&amp;quot;: sysmodules&lt;br /&gt;
* &amp;quot;nvdrv:t&amp;quot;: factory titles&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#Open]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#Ioctl]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [[#Close]]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [[#Initialize]]&lt;br /&gt;
|-&lt;br /&gt;
| 4 || [[#QueryEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [[#MapSharedMem]]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || [[#GetStatus]]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || [[#ForceSetClientPID]]&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#SetClientPID]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || [[#DumpGraphicsMemoryInfo]]&lt;br /&gt;
|-&lt;br /&gt;
| 10 || [3.0.0+] [[#InitializeDevtools]]&lt;br /&gt;
|-&lt;br /&gt;
| 11 || [3.0.0+] [[#Ioctl2]]&lt;br /&gt;
|-&lt;br /&gt;
| 12 || [3.0.0+] [[#Ioctl3]]&lt;br /&gt;
|-&lt;br /&gt;
| 13 || [3.0.0+]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Open ==&lt;br /&gt;
Takes a type-0x5 input buffer for the device-path. Returns the output 32bit &#039;&#039;&#039;fd&#039;&#039;&#039; and the u32 &#039;&#039;&#039;error_code&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Ioctl ==&lt;br /&gt;
Takes a 32bit &#039;&#039;&#039;fd&#039;&#039;&#039;, an u32 &#039;&#039;&#039;ioctl_cmd&#039;&#039;&#039;, a type-0x21 input buffer, and a type-0x22 output buffer. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
The addr/size for send/recv buffers are only set when the associated direction bit is set in the ioctl cmd (addr/size = 0 otherwise).&lt;br /&gt;
&lt;br /&gt;
== Close ==&lt;br /&gt;
Takes a 32bit &#039;&#039;&#039;fd&#039;&#039;&#039;. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Initialize ==&lt;br /&gt;
Takes two copy-handles (&#039;&#039;&#039;current_process&#039;&#039;&#039; and &#039;&#039;&#039;transfer_memory&#039;&#039;&#039;) and an input u32 (&#039;&#039;&#039;transfer_memory_size&#039;&#039;&#039;). Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Webkit applet creates the transfer-memory with perm = 0 and size 0x300000.&lt;br /&gt;
&lt;br /&gt;
== QueryEvent ==&lt;br /&gt;
Takes two input u32s (&#039;&#039;&#039;fd&#039;&#039;&#039; and &#039;&#039;&#039;event_id&#039;&#039;&#039;), with the second word immediately after the first one. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;) and a copy-handle (&#039;&#039;&#039;event_handle&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
QueryEvent is only supported on (and implemented differently on):&lt;br /&gt;
* /dev/nvhost-gpu&lt;br /&gt;
** 1: SmException_BptIntReport&lt;br /&gt;
** 2: SmException_BptPauseReport&lt;br /&gt;
** 3: ErrorNotifierEvent&lt;br /&gt;
* /dev/nvhost-ctrl: Used to get events for SyncPts.&lt;br /&gt;
** If bit31-28 is 1, then lower 16-bits contain event_slot, bit27-16 contain syncpt_number. &lt;br /&gt;
** If bit31-28 is 0, then lower 4-bits contain event_slot, bit31-4 contains syncpt_number.&lt;br /&gt;
* /dev/nvhost-ctrl-gpu&lt;br /&gt;
** 1: Returns error_event_handle.&lt;br /&gt;
** 2: Returns unknown event.&lt;br /&gt;
* /dev/nvhost-dbg-gpu&lt;br /&gt;
** Ignores event_id.&lt;br /&gt;
&lt;br /&gt;
== MapSharedMem ==&lt;br /&gt;
Takes a copy-handle (&#039;&#039;&#039;transfer_memory&#039;&#039;&#039;) and two input u32s (&#039;&#039;&#039;fd&#039;&#039;&#039; and &#039;&#039;&#039;nvmap_handle&#039;&#039;&#039;). Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== GetStatus ==&lt;br /&gt;
Takes no input. Returns 0x10-bytes and an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== ForceSetClientPID ==&lt;br /&gt;
Takes an input u64 which must [[IPC_Marshalling|match]] the user-process PID ([[AM_services|AppletResourceUserId]]). Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== SetClientPID ==&lt;br /&gt;
Takes a PID-descriptor and an u64 which must [[IPC_Marshalling|match]] the user-process PID ([[AM_services|AppletResourceUserId]]). Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== DumpGraphicsMemoryInfo ==&lt;br /&gt;
No input or output. Does nothing.&lt;br /&gt;
&lt;br /&gt;
== InitializeDevtools ==&lt;br /&gt;
Takes a copy-handle and an input u32. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Ioctl2 ==&lt;br /&gt;
Takes a type-0x21 buffer, a type-0x22 buffer, a type-0x21 buffer, and two input u32s. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Ioctl3 ==&lt;br /&gt;
Same input/output as Ioctl2, except cmdhdr_word1 is 0x100B instead of 0xC0B.&lt;br /&gt;
&lt;br /&gt;
== Cmd13 ==&lt;br /&gt;
Takes an input u64. No output.&lt;br /&gt;
&lt;br /&gt;
Official user-processes starting with 3.0.0 now use this at the end of nvdrv service init with value 0x1.&lt;br /&gt;
&lt;br /&gt;
= Ioctls =&lt;br /&gt;
The ioctl number is generated with the following primitive (see Linux kernel):&lt;br /&gt;
&lt;br /&gt;
 #define _IOC(inout, group, num, len) \&lt;br /&gt;
    (inout | ((len &amp;amp; IOCPARM_MASK) &amp;lt;&amp;lt; 16) | ((group) &amp;lt;&amp;lt; 8) | (num))&lt;br /&gt;
&lt;br /&gt;
The following table contains known ioctls.&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080014 || Inout || 8 || [[#NVHOST_IOCTL_CTRL_SYNCPT_READ]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040015 || In || 4 || [[#NVHOST_IOCTL_CTRL_SYNCPT_INCR]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC00C0016 || Inout || 12 || [[#NVHOST_IOCTL_CTRL_SYNCPT_WAIT]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080017 || In || 8 || [[#NVHOST_IOCTL_CTRL_MODULE_MUTEX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0180018 || Inout || 24 || [[#NVHOST_IOCTL_CTRL_MODULE_REGRDWR]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0100019 || Inout || 16 || [[#NVHOST_IOCTL_CTRL_SYNCPT_WAITEX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC008001A || Inout || 8 || [[#NVHOST_IOCTL_CTRL_SYNCPT_READ_MAX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC183001B || Inout || 387 || [[#NVHOST_IOCTL_CTRL_GET_CONFIG]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004001C || Inout || 4 || [[#NVHOST_IOCTL_CTRL_EVENT_SIGNAL]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010001D || Inout || 16 || [[#NVHOST_IOCTL_CTRL_EVENT_WAIT]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010001E || Inout || 16 || [[#NVHOST_IOCTL_CTRL_EVENT_WAIT_ASYNC]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004001F || Inout || 4 || [[#NVHOST_IOCTL_CTRL_EVENT_REGISTER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0040020 || Inout || 4 || [[#NVHOST_IOCTL_CTRL_EVENT_UNREGISTER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080021 || In || 8 || [[#NVHOST_IOCTL_CTRL_EVENT_KILL]] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_READ ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 id;&lt;br /&gt;
    __out u32 value;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_INCR ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_WAIT ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
    __in u32 thresh;&lt;br /&gt;
    __in s32 timeout;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_MODULE_MUTEX ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
    __in u32 lock;        // (0==unlock; 1==lock)&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_MODULE_REGRDWR ===&lt;br /&gt;
Identical to Linux driver. Uses 32-bit version and doesn&#039;t work.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
    __in u32 num_offsets;&lt;br /&gt;
    __in u32 block_size;&lt;br /&gt;
    __in u32 offsets;&lt;br /&gt;
    __in u32 values;&lt;br /&gt;
    __in u32 write;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_WAITEX ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 id;&lt;br /&gt;
    __in  u32 thresh;&lt;br /&gt;
    __in  s32 timeout;&lt;br /&gt;
    __out u32 value;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_READ_MAX ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 id;&lt;br /&gt;
    __out u32 value;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_GET_CONFIG ===&lt;br /&gt;
Gets configured settings. Not available in production mode.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in char domain_str[0x41];       // &amp;quot;nv&amp;quot;&lt;br /&gt;
    __in char param_str[0x41];&lt;br /&gt;
    __out char config_str[0x101];&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_SIGNAL ===&lt;br /&gt;
Signals an user event. Exclusive to the Switch.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 user_event_id;      // ranges from 0x00 to 0x3F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_WAIT ===&lt;br /&gt;
Waits on an event. If waiting fails, returns error code 0x05 (Timeout) and sets &#039;&#039;&#039;value&#039;&#039;&#039; to ((&#039;&#039;&#039;syncpt_id&#039;&#039;&#039; &amp;lt;&amp;lt; 0x10) | 0x10000000).&lt;br /&gt;
&lt;br /&gt;
Depending on &#039;&#039;&#039;threshold&#039;&#039;&#039;, an &#039;&#039;&#039;user_event_id&#039;&#039;&#039; may be returned for using with other event ioctls.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u32 syncpt_id;&lt;br /&gt;
    __in    u32 threshold;&lt;br /&gt;
    __in    s32 timeout;&lt;br /&gt;
    __inout u32 value;           // in=user_event_id (ignored); out=syncpt_value or user_event_id&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_WAIT_ASYNC ===&lt;br /&gt;
Waits on an event (async version). If waiting fails, returns error code 0x0B (BadValue).&lt;br /&gt;
&lt;br /&gt;
Depending on &#039;&#039;&#039;threshold&#039;&#039;&#039;, an &#039;&#039;&#039;user_event_id&#039;&#039;&#039; may be returned for using with other event ioctls.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u32 syncpt_id;&lt;br /&gt;
    __in    u32 threshold;&lt;br /&gt;
    __in    u32 timeout;&lt;br /&gt;
    __inout u32 value;           // in=user_event_id (ignored); out=syncpt_value or user_event_id&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_REGISTER ===&lt;br /&gt;
Registers an user event. Exclusive to the Switch. &lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 user_event_id;      // ranges from 0x00 to 0x3F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_UNREGISTER ===&lt;br /&gt;
Unregisters an user event. Exclusive to the Switch. &lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 user_event_id;      // ranges from 0x00 to 0x3F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_KILL ===&lt;br /&gt;
Kills user events. Exclusive to the Switch. &lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 user_events;       // 64-bit bitfield where each bit represents one event&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
== /dev/nvmap ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080101 || Inout || 8 || [[#NVMAP_IOC_CREATE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000102 || - || 0 || NVMAP_IOC_CLAIM || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080103 || Inout || 8 || [[#NVMAP_IOC_FROM_ID]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0200104 || Inout || 32 || [[#NVMAP_IOC_ALLOC]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0180105 || Inout || 24 || [[#NVMAP_IOC_FREE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0280106 || Inout || 40 || NVMAP_IOC_MMAP || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0280107 || Inout || 40 || NVMAP_IOC_WRITE || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0280108 || Inout || 40 || NVMAP_IOC_READ || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC00C0109 || Inout || 12 || [[#NVMAP_IOC_PARAM]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010010A || Inout || 16 || NVMAP_IOC_PIN_MULT || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010010B || Inout || 16 || NVMAP_IOC_UNPIN_MULT || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC008010C || Inout || 8 || NVMAP_IOC_CACHE || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004010D || Inout || 4 || || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC008010E || Inout || 8 || [[#NVMAP_IOC_GET_ID]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004010F || Inout || 4 || || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040110 || In || 4 || || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000111 || - || 0 || || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100112 || In || 16 || NVMAP_IOC_EXPORT_FOR_ARUID ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100113 || In || 16 || NVMAP_IOC_IS_OWNED_BY_ARUID ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100114 || In || 16 || NVMAP_IOC_REMOVE_EXPORT_FOR_ARUID ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_CREATE ===&lt;br /&gt;
Creates an nvmap object. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 size;&lt;br /&gt;
    __out u32 handle;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_FROM_ID ===&lt;br /&gt;
Get handle to an existing nvmap object. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 id;&lt;br /&gt;
    __out u32 handle;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_ALLOC ===&lt;br /&gt;
Allocate memory for the nvmap object. Nintendo extended this one with 16 bytes, and changed it from in to inout.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 handle;&lt;br /&gt;
    __in u32 heapmask;&lt;br /&gt;
    __in u32 flags;    // (0=read-only, 1=read-write)&lt;br /&gt;
    __in u32 align;&lt;br /&gt;
    __in u8  kind;&lt;br /&gt;
    u8       pad[7];&lt;br /&gt;
    __inout u64 addr;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_FREE ===&lt;br /&gt;
This one is completely custom. Partly because the Linux driver passed the handle as the ioctl &amp;quot;arg-ptr&amp;quot;, and HIPC can&#039;t handle that voodoo.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 handle;&lt;br /&gt;
    u32       pad;&lt;br /&gt;
    __out u64 refcount;&lt;br /&gt;
    __out u32 size;&lt;br /&gt;
    __out u32 flags;    // 1=NOT_FREED_YET&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_PARAM ===&lt;br /&gt;
Returns info about a nvmap object. Identical to Linux driver, but extended with further params.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 handle;&lt;br /&gt;
    __in  u32 param;  // 1=SIZE, 2=ALIGNMENT, 3=BASE (returns error), 4=HEAP (always 0x40000000), 5=KIND, 6=COMPR (unused)&lt;br /&gt;
    __out u32 result;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_GET_ID ===&lt;br /&gt;
Returns an id for a nvmap object. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u32 id; //~0 indicates error&lt;br /&gt;
    __in  u32 handle;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
== /dev/nvdisp-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x80040212 || Out || 4 || TEGRA_DC_EXT_CONTROL_GET_NUM_OUTPUTS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0140213 || Inout || 20 || TEGRA_DC_EXT_CONTROL_GET_OUTPUT_PROPERTIES ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC1100214 || Inout || 272 || TEGRA_DC_EXT_CONTROL_GET_OUTPUT_EDID ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0040216 || Inout || 4 || TEGRA_DC_EXT_CONTROL_SET_EVENT0 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0040217 || Inout || 4 || TEGRA_DC_EXT_CONTROL_SET_EVENT1 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0100218 || Inout || 16 || TEGRA_DC_EXT_CONTROL_SET_EVENT2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0100219 || Inout || 16 || TEGRA_DC_EXT_CONTROL_SET_EVENT3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0040220 || Inout || 4 || TEGRA_DC_EXT_CONTROL_SET_EVENT4 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvdisp-disp0, /dev/nvdisp-disp1 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040201 || In || 4 || TEGRA_DC_EXT_GET_WINDOW ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040202 || In || 4 || TEGRA_DC_EXT_PUT_WINDOW ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC4C80203 || In || 1224 || TEGRA_DC_EXT_FLIP ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80380204 || Out || 56 || TEGRA_DC_EXT_GET_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40380205 || Out || 56 || TEGRA_DC_EXT_SET_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x430C0206 || In || 780 || TEGRA_DC_EXT_SET_LUT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010207 || In || 1 || TEGRA_DC_EXT_ENABLE_DISABLE_CRC ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80040208 || Out || 4 || TEGRA_DC_EXT_GET_CRC ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80040209 || Out || 4 || TEGRA_DC_EXT_GET_HEAD_STATUS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC038020A || Inout || 56 || TEGRA_DC_EXT_VALIDATE_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4018020B || In || 24 || TEGRA_DC_EXT_SET_CSC ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004020C || Inout || 4 || TEGRA_DC_EXT_GET_VBLANK_SYNCPT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8040020D || Out || 64 || TEGRA_DC_EXT_GET_UNDERFLOWS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC99A020E || Inout || 2458 || TEGRA_DC_EXT_SET_CMU ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004020F || Inout || 4 || TEGRA_DC_EXT_DPMS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80600210 || Out || 96 || TEGRA_DC_EXT_GET_AVI_INFOFRAME ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40600211 || In || 96 || TEGRA_DC_EXT_SET_AVI_INFOFRAME ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xEBFC0215 || Inout || 11260 || TEGRA_DC_EXT_GET_MODE_DB ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC003021A || Inout || 3 || TEGRA_DC_EXT_PANEL_GET_VENDOR_ID ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x803C021B || Out || 60 || TEGRA_DC_EXT_GET_MODE2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x403C021C || In || 60 || TEGRA_DC_EXT_SET_MODE2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC03C021D || Inout || 60 || TEGRA_DC_EXT_VALIDATE_MODE2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xEF20021E || Inout || 12064 || TEGRA_DC_EXT_GET_MODE_DB2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004021F || Inout || 4 || TEGRA_DC_EXT_GET_WINMASK ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvcec-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010300 || In || 1 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010301 || In || 1 || NVCEC_CTRL_ENABLE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x804C0302 || Out || 76 || NVCEC_CTRL_GET_PADDR ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040303 || In || 4 || NVCEC_CTRL_SET_LADDR ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC04C0304 || Inout || 76 || NVCEC_CTRL_WRITE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC04C0305 || Inout || 76 || NVCEC_CTRL_READ ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x804C0306 || Out || 76 || NVCEC_CTRL_GET_CONNECTION_STATUS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x804C0307 || Out || 76 || NVCEC_CTRL_GET_WRITE_STATUS ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhdcp_up-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC4880401 || Inout || 1160 || TEGRAIO_NVHDCP_READ_M ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC4880402 || Inout || 1160 || TEGRAIO_NVHDCP_READ_S ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010403 || In || 1 || TEGRAIO_NVHDCP_ON_OFF ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvdcutil-disp0, /dev/nvdcutil-disp1 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010501 || In || 1 || NVDCUTIL_SW_HOTPLUG_IN_OUT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010502 || In || 1 || NVDCUTIL_VIRTUAL_EDID_ON_OFF ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x42040503 || In || 1056 || NVDCUTIL_VIRTUAL_EDID_SET_DATA ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x803C0504 || Out || 60 || NVDCUTIL_GET_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010505 || In || 1 || NVDCUTIL_TELEMETRY_TEST_ON_OFF ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvsched-ctrl ==&lt;br /&gt;
This is a customized scheduler device.&lt;br /&gt;
&lt;br /&gt;
The way this device is exposed and configured is exclusive to the Switch, since other sources don&#039;t have an actual interface for the scheduler.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000601 || - || 0 || [[#NVSCHED_CTRL_ENABLE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000602 || - || 0 || [[#NVSCHED_CTRL_DISABLE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40180603 || In || 24 || [[#NVSCHED_CTRL_ADD_APPLICATION]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40180604 || In || 24 || [[#NVSCHED_CTRL_UPDATE_APPLICATION]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080605 || In || 8 || [[#NVSCHED_CTRL_REMOVE_APPLICATION]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80080606 || Out || 8 || [[#NVSCHED_CTRL_GET_ID]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80080607 || Out || 8 || [[#NVSCHED_CTRL_ADD_RUNLIST]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40180608 || In || 24 || [[#NVSCHED_CTRL_UPDATE_RUNLIST]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100609 || In || 16 || [[#NVSCHED_CTRL_LINK_RUNLIST]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4010060A || In || 16 || [[#NVSCHED_CTRL_UNLINK_RUNLIST]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008060B || In || 8 || [[#NVSCHED_CTRL_REMOVE_RUNLIST]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8001060C || Out || 1 || [[#NVSCHED_CTRL_HAS_OVERRUN_EVENT]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8010060D || Out || 16 || [[#NVSCHED_CTRL_GET_NEXT_OVERRUN_EVENT]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x400C060E || In || 12 || [[#NVSCHED_CTRL_PUT_CONDUCTOR_FLIP_FENCE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008060F || In || 8 || [[#NVSCHED_CTRL_DETACH_APPLICATION]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100610 || In || 16 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100611 || In || 16 || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_ENABLE ===&lt;br /&gt;
Enables the scheduler.&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_DISABLE ===&lt;br /&gt;
Disables the scheduler.&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_ADD_APPLICATION ===&lt;br /&gt;
Adds a new application to the scheduler.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 application_id;&lt;br /&gt;
    __in u64 priority;&lt;br /&gt;
    __in u64 timeslice;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_UPDATE_APPLICATION ===&lt;br /&gt;
Updates the application parameters in the scheduler.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 application_id;&lt;br /&gt;
    __in u64 priority;&lt;br /&gt;
    __in u64 timeslice;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_REMOVE_APPLICATION ===&lt;br /&gt;
Removes the application from the scheduler.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 application_id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_GET_ID ===&lt;br /&gt;
Returns the ID of the last scheduled object.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u64 id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_ADD_RUNLIST ===&lt;br /&gt;
Creates a new runlist and returns it&#039;s ID.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u64 runlist_id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_UPDATE_RUNLIST ===&lt;br /&gt;
Updates the runlist parameters in the scheduler.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 runlist_id;&lt;br /&gt;
    __in u64 priority;&lt;br /&gt;
    __in u64 timeslice;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_LINK_RUNLIST ===&lt;br /&gt;
Links a runlist to a given application in the scheduler.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 runlist_id;&lt;br /&gt;
    __in u64 application_id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_UNLINK_RUNLIST ===&lt;br /&gt;
Unlinks a runlist from a given application in the scheduler.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 runlist_id;&lt;br /&gt;
    __in u64 application_id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_REMOVE_RUNLIST ===&lt;br /&gt;
Removes the runlist from the scheduler.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 runlist_id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_HAS_OVERRUN_EVENT ===&lt;br /&gt;
Returns a boolean to tell if the scheduler has an overrun event or not.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u8 has_overrun;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_GET_NEXT_OVERRUN_EVENT ===&lt;br /&gt;
Returns the overrun event&#039;s data from the scheduler.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u64 runlist_id;&lt;br /&gt;
    __out u64 debt;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_PUT_CONDUCTOR_FLIP_FENCE ===&lt;br /&gt;
Installs a fence swap event?&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 fence_id;&lt;br /&gt;
    __in u32 fence_value;&lt;br /&gt;
    __in u32 swap_interval;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_DETACH_APPLICATION ===&lt;br /&gt;
Places the given application in detached state.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 application_id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
== /dev/nverpt-ctrl ==&lt;br /&gt;
Added in firmware version 3.0.0.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC1280701 || Inout || 296 || NVERPT_TELEMETRY_SUBMIT_DATA ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xCF580702 || Inout || 3928 || NVERPT_TELEMETRY_SUBMIT_DATA_EX ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-as-gpu ==&lt;br /&gt;
Each fd opened to this device creates an address space. An address space is then later bound with a channel.&lt;br /&gt;
&lt;br /&gt;
Once a nvgpu channel has been bound to an address space it cannot be unbound. There is no support for allowing an nvgpu channel to change from one address space to another (or from one to none).&lt;br /&gt;
                                                                                                                              &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044101 || In || 4 || [[#NVGPU_AS_IOCTL_BIND_CHANNEL]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0184102 || Inout || 24 || [[#NVGPU_AS_IOCTL_ALLOC_SPACE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0104103 || Inout || 16 || [[#NVGPU_AS_IOCTL_FREE_SPACE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0184104 || Inout || 24 || [[#NVGPU_AS_IOCTL_MAP_BUFFER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0084105 || Inout || 8 || [[#NVGPU_AS_IOCTL_UNMAP_BUFFER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0284106 || Inout || 40 || [[#NVGPU_AS_IOCTL_MAP_BUFFER_EX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40104107 || In || 16 || [[#NVGPU_AS_IOCTL_INITIALIZE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0404108 || Inout || 64 || [[#NVGPU_AS_IOCTL_GET_VA_REGIONS]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40284109 || In || 40 || [[#NVGPU_AS_IOCTL_INITIALIZE_EX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??4114 || Inout || Variable || [[#NVGPU_AS_IOCTL_REMAP]] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_BIND_CHANNEL ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 fd;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_ALLOC_SPACE ===&lt;br /&gt;
This one reserves pages in the device address space.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 pages;&lt;br /&gt;
    __in u32 page_size;&lt;br /&gt;
    __in u32 flags;&lt;br /&gt;
    u32      pad;&lt;br /&gt;
    union {&lt;br /&gt;
      __out u64 offset;&lt;br /&gt;
      __in  u64 align;&lt;br /&gt;
    };&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_FREE_SPACE ===&lt;br /&gt;
This one frees pages from the device address space.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 offset;&lt;br /&gt;
    __in u32 pages;&lt;br /&gt;
    __in u32 page_size;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_MAP_BUFFER ===&lt;br /&gt;
Map a memory region in the device address space. Identical to Linux driver pretty much.&lt;br /&gt;
&lt;br /&gt;
On success, the mapped memory region is locked by having [[SVC#MemoryState]] bit34 set.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u32 flags;        // bit0: fixed_offset, bit2: cacheable&lt;br /&gt;
    u32         pad;&lt;br /&gt;
    __in    u32 nvmap_handle;&lt;br /&gt;
    __inout u32 page_size;    // 0 means don&#039;t care&lt;br /&gt;
    union {&lt;br /&gt;
      __out u64 offset;&lt;br /&gt;
      __in  u64 align;&lt;br /&gt;
    };&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_MAP_BUFFER_EX ===&lt;br /&gt;
Map a memory region in the device address space. Identical to Linux driver pretty much.&lt;br /&gt;
&lt;br /&gt;
Unaligned size will cause a [[#Panic]].&lt;br /&gt;
&lt;br /&gt;
On success, the mapped memory region is locked by having [[SVC#MemoryState]] bit34 set.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u32 flags;          // bit0: fixed_offset, bit2: cacheable&lt;br /&gt;
    __in    u32 kind;           // -1 is default&lt;br /&gt;
    __in    u32 nvmap_handle;&lt;br /&gt;
    __inout u32 page_size;      // 0 means don&#039;t care&lt;br /&gt;
    __in    u64 buffer_offset;&lt;br /&gt;
    __in    u64 mapping_size;&lt;br /&gt;
    __inout   u64 offset;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_UNMAP_BUFFER ===&lt;br /&gt;
Unmap a memory region from the device address space.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __in u64 offset;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_INITIALIZE ===&lt;br /&gt;
Nintendo&#039;s custom implementation of NVGPU_GPU_IOCTL_ALLOC_AS (unavailable).&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 big_page_size;   // depends on GPU&#039;s available_big_page_sizes; 0=default&lt;br /&gt;
    __in s32 as_fd;           // ignored; passes 0&lt;br /&gt;
    __in u32 flags;           // ignored; passes 0&lt;br /&gt;
    __in u32 reserved;        // ignored; passes 0&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_GET_VA_REGIONS ===&lt;br /&gt;
Nintendo modified to get rid of pointer in struct.&lt;br /&gt;
&lt;br /&gt;
  struct va_region {&lt;br /&gt;
    u64 offset;&lt;br /&gt;
    u32 page_size;&lt;br /&gt;
    u32 pad;&lt;br /&gt;
    u64 pages;&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  struct {&lt;br /&gt;
    u64         not_used;   // (contained output user ptr on linux, ignored)&lt;br /&gt;
    __inout u32 bufsize;    // forced to 2*sizeof(struct va_region)&lt;br /&gt;
    u32         pad;&lt;br /&gt;
    __out struct va_region regions[2];&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_INITIALIZE_EX ===&lt;br /&gt;
Nintendo&#039;s custom implementation of NVGPU_GPU_IOCTL_ALLOC_AS (unavailable) with extra params.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 big_page_size;   // depends on GPU&#039;s available_big_page_sizes; 0=default&lt;br /&gt;
    __in s32 as_fd;           // ignored; passes 0&lt;br /&gt;
    __in u32 flags;           // passes 0&lt;br /&gt;
    __in u32 reserved;        // ignored; passes 0&lt;br /&gt;
    __in u64 unk0;&lt;br /&gt;
    __in u64 unk1;&lt;br /&gt;
    __in u64 unk2;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_REMAP ===&lt;br /&gt;
Nintendo&#039;s custom implementation of address space remapping.&lt;br /&gt;
&lt;br /&gt;
  struct remap_entry {&lt;br /&gt;
    __in u16 flags;        // 0 or 4&lt;br /&gt;
    __in u16 kind;           &lt;br /&gt;
    __in u32 nvmap_handle;&lt;br /&gt;
    __in u32 padding;&lt;br /&gt;
    __in u32 offset;       // (alloc_space_offset &amp;gt;&amp;gt; 0x10)&lt;br /&gt;
    __in u32 pages;        // alloc_space_pages&lt;br /&gt;
  };&lt;br /&gt;
 &lt;br /&gt;
 struct {&lt;br /&gt;
    __in struct remap_entry entries[];&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-dbg-gpu ==&lt;br /&gt;
Returns [[#Errors|NotSupported]] on Open unless nn::settings::detail::GetDebugModeFlag is set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084401 || In || 8 || NVGPU_DBG_GPU_IOCTL_BIND_CHANNEL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??4402 || Inout || Variable || NVGPU_DBG_GPU_IOCTL_REG_OPS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084403 || In || 8 || NVGPU_DBG_GPU_IOCTL_EVENTS_CTRL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044404 || In || 4 || NVGPU_DBG_GPU_IOCTL_POWERGATE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044405 || In || 4 || NVGPU_DBG_GPU_IOCTL_SMPC_CTXSW_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044406 || In || 4 || NVGPU_DBG_GPU_IOCTL_SUSPEND_RESUME_SM ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0184407 || Inout || 24 || NVGPU_DBG_GPU_IOCTL_PERFBUF_MAP ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084408 || In || 8 || NVGPU_DBG_GPU_IOCTL_PERFBUF_UNMAP ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084409 || In || 8 || NVGPU_DBG_GPU_IOCTL_PC_SAMPLING ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008440A || In || 8 || NVGPU_DBG_GPU_IOCTL_TIMEOUT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8008440B || Out || 8 || NVGPU_DBG_GPU_IOCTL_GET_TIMEOUT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8004440C || Out || 4 || NVGPU_DBG_GPU_IOCTL_GET_GR_CONTEXT_SIZE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000440D || None || 0 || NVGPU_DBG_GPU_IOCTL_GET_GR_CONTEXT || Uses Ioctl3.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-prof-gpu ==&lt;br /&gt;
Returns [[#Errors|NotSupported]] on Open unless nn::settings::detail::GetDebugModeFlag is set.&lt;br /&gt;
&lt;br /&gt;
This device is identical to [[#/dev/nvhost-dbg-gpu|/dev/nvhost-dbg-gpu]].&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-ctrl-gpu ==&lt;br /&gt;
This device is for global (context independent) operations on the gpu.  &lt;br /&gt;
                                                                                                                                               &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x80044701 || Out || 4 || [[#NVGPU_GPU_IOCTL_ZCULL_GET_CTX_SIZE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80284702 || Out || 40 || [[#NVGPU_GPU_IOCTL_ZCULL_GET_INFO]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x402C4703 || In || 44 || [[#NVGPU_GPU_IOCTL_ZBC_SET_TABLE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0344704 || Inout || 52 || [[#NVGPU_GPU_IOCTL_ZBC_QUERY_TABLE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0B04705 || Inout || 176 || [[#NVGPU_GPU_IOCTL_GET_CHARACTERISTICS]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0184706 || Inout || 24 || NVGPU_GPU_IOCTL_GET_TPC_MASKS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084707 || In || 8 || [[#NVGPU_GPU_IOCTL_FLUSH_L2]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008470D || In || 8 || NVGPU_GPU_IOCTL_INVAL_ICACHE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008470E || In || 8 || NVGPU_GPU_IOCTL_SET_MMUDEBUG_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4010470F || In || 16 || NVGPU_GPU_IOCTL_SET_SM_DEBUG_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0084710 || Inout || 8 || NVGPU_GPU_IOCTL_WAIT_FOR_PAUSE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80084711 || Out || 8 || NVGPU_GPU_IOCTL_GET_TPC_EXCEPTION_EN_STATUS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80084712 || Out || 8 || NVGPU_GPU_IOCTL_NUM_VSMS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0044713 || Inout || 4 || NVGPU_GPU_IOCTL_VSMS_MAPPING ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80084714 || Out || 8 || [[#NVGPU_GPU_IOCTL_ZBC_GET_ACTIVE_SLOT_MASK]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80044715 || Out || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8018471A || Out || 24 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC008471B || Inout || 8 || NVGPU_GPU_IOCTL_GET_ERROR_CHANNEL_USER_DATA ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010471C || Inout || 16 || NVGPU_GPU_IOCTL_GET_GPU_TIME ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC108471D || Inout || 264 || NVGPU_GPU_IOCTL_GET_CPU_TIME_CORRELATION_INFO ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZCULL_GET_CTX_SIZE ===&lt;br /&gt;
Returns the GPU&#039;s ZCULL context size. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __out u32 size;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZCULL_GET_INFO ===&lt;br /&gt;
Returns GPU&#039;s ZCULL information. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __out u32 width_align_pixels;&lt;br /&gt;
    __out u32 height_align_pixels;&lt;br /&gt;
    __out u32 pixel_squares_by_aliquots;&lt;br /&gt;
    __out u32 aliquot_total;&lt;br /&gt;
    __out u32 region_byte_multiplier;&lt;br /&gt;
    __out u32 region_header_size;&lt;br /&gt;
    __out u32 subregion_header_size;&lt;br /&gt;
    __out u32 subregion_width_align_pixels;&lt;br /&gt;
    __out u32 subregion_height_align_pixels;&lt;br /&gt;
    __out u32 subregion_count;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZBC_SET_TABLE ===&lt;br /&gt;
Sets the active ZBC table. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __in u32 color_ds[4];&lt;br /&gt;
    __in u32 color_l2[4];&lt;br /&gt;
    __in u32 depth;&lt;br /&gt;
    __in u32 format;&lt;br /&gt;
    __in u32 type;         // 1=color, 2=depth&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZBC_QUERY_TABLE ===&lt;br /&gt;
Queries the active ZBC table. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __out u32 color_ds[4];&lt;br /&gt;
    __out u32 color_l2[4];&lt;br /&gt;
    __out u32 depth;&lt;br /&gt;
    __out u32 ref_cnt;&lt;br /&gt;
    __out u32 format;&lt;br /&gt;
    __out u32 type;&lt;br /&gt;
    __inout u32 index_size;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_GET_CHARACTERISTICS ===&lt;br /&gt;
Returns the GPU characteristics. Modified to return inline data instead of using a pointer.&lt;br /&gt;
&lt;br /&gt;
  struct gpu_characteristics {&lt;br /&gt;
    u32 arch;                           // 0x120 (NVGPU_GPU_ARCH_GM200)&lt;br /&gt;
    u32 impl;                           // 0xB (NVGPU_GPU_IMPL_GM20B)&lt;br /&gt;
    u32 rev;                            // 0xA1 (Revision A1)&lt;br /&gt;
    u32 num_gpc;                        // 0x1&lt;br /&gt;
    u64 l2_cache_size;                  // 0x40000&lt;br /&gt;
    u64 on_board_video_memory_size;     // 0x0 (not used)&lt;br /&gt;
    u32 num_tpc_per_gpc;                // 0x2&lt;br /&gt;
    u32 bus_type;                       // 0x20 (NVGPU_GPU_BUS_TYPE_AXI)&lt;br /&gt;
    u32 big_page_size;                  // 0x20000&lt;br /&gt;
    u32 compression_page_size;          // 0x20000&lt;br /&gt;
    u32 pde_coverage_bit_count;         // 0x1B&lt;br /&gt;
    u32 available_big_page_sizes;       // 0x30000&lt;br /&gt;
    u32 gpc_mask;                       // 0x1&lt;br /&gt;
    u32 sm_arch_sm_version;             // 0x503 (Maxwell Generation 5.0.3?)&lt;br /&gt;
    u32 sm_arch_spa_version;            // 0x503 (Maxwell Generation 5.0.3?)&lt;br /&gt;
    u32 sm_arch_warp_count;             // 0x80&lt;br /&gt;
    u32 gpu_va_bit_count;               // 0x28&lt;br /&gt;
    u32 reserved;                       // NULL&lt;br /&gt;
    u64 flags;                          // 0x55&lt;br /&gt;
    u32 twod_class;                     // 0x902D (FERMI_TWOD_A)&lt;br /&gt;
    u32 threed_class;                   // 0xB197 (MAXWELL_B)&lt;br /&gt;
    u32 compute_class;                  // 0xB1C0 (MAXWELL_COMPUTE_B)&lt;br /&gt;
    u32 gpfifo_class;                   // 0xB06F (MAXWELL_CHANNEL_GPFIFO_A)&lt;br /&gt;
    u32 inline_to_memory_class;         // 0xA140 (KEPLER_INLINE_TO_MEMORY_B)&lt;br /&gt;
    u32 dma_copy_class;                 // 0xB0B5 (MAXWELL_DMA_COPY_A)&lt;br /&gt;
    u32 max_fbps_count;                 // 0x1&lt;br /&gt;
    u32 fbp_en_mask;                    // 0x0 (disabled)&lt;br /&gt;
    u32 max_ltc_per_fbp;                // 0x2&lt;br /&gt;
    u32 max_lts_per_ltc;                // 0x1&lt;br /&gt;
    u32 max_tex_per_tpc;                // 0x0 (not supported)&lt;br /&gt;
    u32 max_gpc_count;                  // 0x1&lt;br /&gt;
    u32 rop_l2_en_mask_0;               // 0x21D70 (fuse_status_opt_rop_l2_fbp_r)&lt;br /&gt;
    u32 rop_l2_en_mask_1;               // 0x0&lt;br /&gt;
    u64 chipname;                       // 0x6230326D67 (&amp;quot;gm20b&amp;quot;)&lt;br /&gt;
    u64 gr_compbit_store_base_hw;       // 0x0 (not supported)&lt;br /&gt;
  };&lt;br /&gt;
 &lt;br /&gt;
  struct {&lt;br /&gt;
    __inout u64 gpu_characteristics_buf_size;   // must not be NULL, but gets overwritten with 0xA0=max_size&lt;br /&gt;
    __in    u64 gpu_characteristics_buf_addr;   // ignored, but must not be NULL&lt;br /&gt;
    __out struct gpu_characteristics gc;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_FLUSH_L2 ===&lt;br /&gt;
Flushes the GPU L2 cache.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 flush;          // l2_flush | l2_invalidate &amp;lt;&amp;lt; 1 | fb_flush &amp;lt;&amp;lt; 2&lt;br /&gt;
    u32      reserved;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZBC_GET_ACTIVE_SLOT_MASK ===&lt;br /&gt;
Returns the mask value for a ZBC slot.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u32 slot;       // always 0x07&lt;br /&gt;
    __out u32 mask;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
== Channels ==&lt;br /&gt;
Channels are a concept for  NVIDIA hardware blocks that share a common interface.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Path || Name&lt;br /&gt;
|-&lt;br /&gt;
| /dev/nvhost-gpu ||&lt;br /&gt;
|-&lt;br /&gt;
| /dev/nvhost-vic || Video Image Compositor&lt;br /&gt;
|-&lt;br /&gt;
| /dev/nvhost-nvdec || Video Decoder&lt;br /&gt;
|-&lt;br /&gt;
| /dev/nvhost-nvjpg || JPEG Decoder&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Channel Ioctls ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??0001 || Variable || NVHOST_IOCTL_CHANNEL_SUBMIT || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080002 || 8 || NVHOST_IOCTL_CHANNEL_GET_SYNCPOINT || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080003 || 8 || NVHOST_IOCTL_CHANNEL_GET_WAITBASE || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080004 || 8 || NVHOST_IOCTL_CHANNEL_SET_TIMEOUT_EX || Seen on 1.0.0. Stubbed; does a debug print and returns 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040007 || 4 || NVHOST_IOCTL_CHANNEL_SET_SUBMIT_TIMEOUT || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080008 || 8 || NVHOST_IOCTL_CHANNEL_SET_CLK_RATE || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??0009 || Variable || NVHOST_IOCTL_CHANNEL_MAP_BUFFER || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??000A || Variable || NVHOST_IOCTL_CHANNEL_UNMAP_BUFFER || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000013 || 0 || || Seen on 1.0.0. This one sets a u32, and bool based on input.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080014 || || NVHOST_IOCTL_CHANNEL_GET_CLK_RATE || Seen on 1.0.0.&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40044801 || 4 || [[#NVGPU_IOCTL_CHANNEL_SET_NVMAP_FD]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044803 || 4 || NVGPU_IOCTL_CHANNEL_SET_TIMEOUT || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084805 || 8 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40184806 || || NVGPU_IOCTL_CHANNEL_WAIT || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0044807 || 4 || NVGPU_IOCTL_CHANNEL_CYCLE_STATS || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??4808 || Variable || [[#NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0104809 || 16 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_OBJ_CTX]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008480A || || NVHOST_IOCTL_CHANNEL_FREE_OBJ_CTX || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010480B || 16 || [[#NVGPU_IOCTL_CHANNEL_ZCULL_BIND]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC018480C || 24 || [[#NVGPU_IOCTL_CHANNEL_SET_ERROR_NOTIFIER]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4004480D || 4 || [[#NVGPU_IOCTL_CHANNEL_SET_PRIORITY]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000480E || 0 || [[#NVGPU_IOCTL_CHANNEL_ENABLE]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000480F || 0 || [[#NVGPU_IOCTL_CHANNEL_DISABLE]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00004810 || 0 || [[#NVGPU_IOCTL_CHANNEL_PREEMPT]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00004811 || 0 || [[#NVGPU_IOCTL_CHANNEL_FORCE_RESET]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084812 || 8 || [[#NVGPU_IOCTL_CHANNEL_EVENT_ID_CONTROL]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0104813 || 16 || NVGPU_IOCTL_CHANNEL_CYCLE_STATS_SNAPSHOT || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80804816 || 128 || NVGPU_IOCTL_CHANNEL_GET_ERROR_INFO || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0104817 || 16 || [[#NVGPU_IOCTL_CHANNEL_GET_ERROR_NOTIFICATION]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40204818 || 32 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??4819 || Variable || [[#NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO_RETRY]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC020481A || 32 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX2]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC018481B || 24 ||  || Uses Ioctl2.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC018481C || 24 ||  || Uses Ioctl2.&lt;br /&gt;
|-&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40084714 || 8 || NVGPU_IOCTL_CHANNEL_SET_USER_DATA || Sets an unknown user context address. Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80084715 || 8 || NVGPU_IOCTL_CHANNEL_GET_USER_DATA || Gets an unknown user context address. Seen on 1.0.0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SET_NVMAP_FD ===&lt;br /&gt;
Binds a nvmap object to this channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
This ioctl is a no-op in the Linux driver, not sure about Switch?&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 nvmap_fd;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO ===&lt;br /&gt;
Allocates gpfifo entries. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 num_entries;&lt;br /&gt;
    __in u32 flags;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO ===&lt;br /&gt;
Submits a gpfifo object. Modified to take inline entry objects instead of a pointer.&lt;br /&gt;
&lt;br /&gt;
  struct fence {&lt;br /&gt;
    u32 syncpt_id;&lt;br /&gt;
    u32 syncpt_value;&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  struct gpfifo_entry {&lt;br /&gt;
    u64 entry;                            // gpu_iova | (unk_2bits &amp;lt;&amp;lt; 40) | (size &amp;lt;&amp;lt; 42) | (unk_flag &amp;lt;&amp;lt; 63)&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u64 gpfifo;                      // (ignored) pointer to gpfifo fence structs&lt;br /&gt;
    __in    u32 num_entries;                 // number of fence objects being submitted&lt;br /&gt;
    __in    u32 flags;&lt;br /&gt;
    __inout struct fence fence_out;         // returned new fence object for others to wait on&lt;br /&gt;
    __in    struct gpfifo_entry entries[];  // depends on num_entries&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ALLOC_OBJ_CTX ===&lt;br /&gt;
Allocates a graphics context object. Modified to ignore object&#039;s ID.&lt;br /&gt;
&lt;br /&gt;
You can only have one object context allocated at a time. You must have bound an address space before using this.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 class_num;    // 0x902D=2d, 0xB197=3d, 0xB1C0=compute, 0xA140=kepler, 0xB0B5=DMA, 0xB06F=channel_gpfifo&lt;br /&gt;
    __in  u32 flags;        // bit0: LOCKBOOST_ZERO&lt;br /&gt;
    __out u64 obj_id;       // (ignored) used for FREE_OBJ_CTX ioctl, which is not supported&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ZCULL_BIND ===&lt;br /&gt;
Binds a ZCULL context to the channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __in u64 gpu_va;&lt;br /&gt;
    __in u32 mode;         // 0=global, 1=no_ctxsw, 2=separate_buffer, 3=part_of_regular_buf&lt;br /&gt;
    __in u32 padding;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SET_ERROR_NOTIFIER ===&lt;br /&gt;
Initializes the error notifier for this channel. Unlike for the Linux kernel, the Switch driver cannot write to an arbitrary userspace buffer. Thus new ioctls have been introduced to fetch the error information rather than using a shared memory buffer.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 offset;  // ignored&lt;br /&gt;
    __in u64 size;    // ignored&lt;br /&gt;
    __in u32 mem;     // must be non-zero to initialize, zero to de-initialize&lt;br /&gt;
    __in u32 padding; // ignored&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SET_PRIORITY ===&lt;br /&gt;
Change channel&#039;s priority. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 priority;    // 0x32 is low, 0x64 is medium and 0x96 is high&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ENABLE ===&lt;br /&gt;
Enables the current channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_DISABLE ===&lt;br /&gt;
Disables the current channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_PREEMPT ===&lt;br /&gt;
Clears the FIFO pipe for this channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_FORCE_RESET ===&lt;br /&gt;
Forces the channel to reset. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_EVENT_ID_CONTROL ===&lt;br /&gt;
Controls event notifications.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 cmd;    // 0=disable, 1=enable, 2=clear&lt;br /&gt;
    __in u32 id;     // same id&#039;s as for [[#QueryEvent]]&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_GET_ERROR_NOTIFICATION ===&lt;br /&gt;
Returns the current error notification caught by the error notifier. Exclusive to the Switch.&lt;br /&gt;
&lt;br /&gt;
Despite being marked as inout this is all output.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u64 timestamp;    // fetched straight from armGetSystemTick&lt;br /&gt;
    __out u32 info32;       // error code&lt;br /&gt;
    __out u16 info16;       // additional error info&lt;br /&gt;
    __out u16 status;       // always 0xFFFF&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX ===&lt;br /&gt;
Allocates gpfifo entries with additional parameters. Exclusive to the Switch.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 num_entries;&lt;br /&gt;
    __in u32 flags;&lt;br /&gt;
    __in u32 unk0;            // 1 works&lt;br /&gt;
    __in u32 unk1;&lt;br /&gt;
    __in u32 unk2;&lt;br /&gt;
    __in u32 unk3;&lt;br /&gt;
    __in u32 unk4;&lt;br /&gt;
    __in u32 unk5;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO_RETRY ===&lt;br /&gt;
Submits a gpfifo object (async version). Exclusive to the Switch.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    u64 __gpfifo;                     // in (pointer to gpfifo fence structs; ignored)&lt;br /&gt;
    u32 __num_entries;                // in (number of fence objects being submitted)&lt;br /&gt;
    u32 __flags;                      // in&lt;br /&gt;
    struct fence        __fence_out;  // out (returned new fence object for others to wait on)&lt;br /&gt;
    struct gpfifo_entry __entries[];  // in (depends on __num_entries)&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX2 ===&lt;br /&gt;
Allocates gpfifo entries with additional parameters and returns a fence. Exclusive to the Switch.&lt;br /&gt;
 &lt;br /&gt;
  struct {&lt;br /&gt;
    u32 __num_entries;         // in&lt;br /&gt;
    u32 __flags;               // in&lt;br /&gt;
    u32 __unk0;                // in (1 works)&lt;br /&gt;
    struct fence __fence_out;  // out&lt;br /&gt;
    u32 __unk1;                // in&lt;br /&gt;
    u32 __unk2;                // in&lt;br /&gt;
    u32 __unk3;                // in&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
= nvmemp =&lt;br /&gt;
NVIDIA memory profiler (this service is not available on retail units). &lt;br /&gt;
/dev/nvhost-ctrl sends the ioctl NVHOST_IOCTL_CTRL_GET_CONFIG to check the config &amp;quot;nv!NV_MEMORY_PROFILER&amp;quot;. If config_str returns &amp;quot;1&amp;quot;, the applications attempts to talk to use nvmemp.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Cmd0&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Cmd1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= nvdrvdbg =&lt;br /&gt;
This is &amp;quot;nns::nvdrv::INvDrvDebugFSServices&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#OpenLog]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#CloseLog]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [[#ReadLog]]&lt;br /&gt;
|-&lt;br /&gt;
| 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== OpenLog ==&lt;br /&gt;
Takes process handle. Returns an fd.&lt;br /&gt;
&lt;br /&gt;
== CloseLog ==&lt;br /&gt;
Takes fd and closes it.&lt;br /&gt;
&lt;br /&gt;
== ReadLog ==&lt;br /&gt;
Takes fd and reads log into a type-6 buffer.&lt;br /&gt;
&lt;br /&gt;
= nvgem:c =&lt;br /&gt;
This is &amp;quot;nv::gemcontrol::INvGemControl&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= nvgem:cd =&lt;br /&gt;
This is &amp;quot;nv::gemcoredump::INvGemCoreDump&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Errors =&lt;br /&gt;
Most nvidia driver commands return an error code apart from the normal return code.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Success&lt;br /&gt;
|-&lt;br /&gt;
| 1 || NotImplemented&lt;br /&gt;
|-&lt;br /&gt;
| 2 || NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 3 || NotInitialized&lt;br /&gt;
|-&lt;br /&gt;
| 4 || BadParameter&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| 6 || InsufficientMemory&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ReadOnlyAttribute&lt;br /&gt;
|-&lt;br /&gt;
| 8 || InvalidState&lt;br /&gt;
|-&lt;br /&gt;
| 9 || InvalidAddress&lt;br /&gt;
|-&lt;br /&gt;
| 0xA || InvalidSize&lt;br /&gt;
|-&lt;br /&gt;
| 0xB || BadValue&lt;br /&gt;
|-&lt;br /&gt;
| 0xD || AlreadyAllocated&lt;br /&gt;
|-&lt;br /&gt;
| 0xE || Busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xF || ResourceError&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || CountMismatch&lt;br /&gt;
|-&lt;br /&gt;
| 0x1000 || SharedMemoryTooSmall&lt;br /&gt;
|-&lt;br /&gt;
| 0x30003 || FileOperationFailed&lt;br /&gt;
|-&lt;br /&gt;
| 0x30004 || DirOperationFailed&lt;br /&gt;
|-&lt;br /&gt;
| 0x3000F || IoctlFailed                        &lt;br /&gt;
|-&lt;br /&gt;
| 0x30010 || AccessDenied&lt;br /&gt;
|-&lt;br /&gt;
| 0x30013 || FileNotFound&lt;br /&gt;
|-&lt;br /&gt;
| 0xA000E || ModuleNotPresent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Panic =&lt;br /&gt;
In some cases, a panic may occur. NV forces a crash by doing:&lt;br /&gt;
 (void *)0 = 0xCAFE;&lt;br /&gt;
End result is that the system hangs with a white-screen.&lt;br /&gt;
&lt;br /&gt;
== Gpfifo Panic ==&lt;br /&gt;
When the gpfifo data in the gpu_va buffers specified by the submitted gpfifo entries is invalid(?), eventually the user-process will be force-terminated after using the submit-gpfifo ioctl. It&#039;s unknown how exactly this is done.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=NIM_services&amp;diff=4431</id>
		<title>NIM services</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=NIM_services&amp;diff=4431"/>
		<updated>2018-04-09T01:34:09Z</updated>

		<summary type="html">&lt;p&gt;OgniK: /* nim */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= nim =&lt;br /&gt;
This is &amp;quot;nn::nim::detail::INetworkInstallManager&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 1 || &lt;br /&gt;
|-&lt;br /&gt;
| 2 || &lt;br /&gt;
|-&lt;br /&gt;
| 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| 11 ||&lt;br /&gt;
|-&lt;br /&gt;
| 12 ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 ||&lt;br /&gt;
|-&lt;br /&gt;
| 15 ||&lt;br /&gt;
|-&lt;br /&gt;
| 16 ||&lt;br /&gt;
|-&lt;br /&gt;
| 17 ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 ||&lt;br /&gt;
|-&lt;br /&gt;
| 21 ||&lt;br /&gt;
|-&lt;br /&gt;
| 22 ||&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 26 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 27 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 28 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 29 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 30 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 31 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 32 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 33 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 34 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 35 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 36 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 37 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 38 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 39 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 40 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 41 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 42 || [3.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 43 || [3.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 44 || [3.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 45 || [3.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 46 || [3.0.0+]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Cmd1 ==&lt;br /&gt;
Takes a 0x10-byte input struct, from the output of cmd2.&lt;br /&gt;
&lt;br /&gt;
== Cmd2 ==&lt;br /&gt;
Takes a type-0x6 output buffer, for an array of 0x10-byte entries. Returns an u32 for total output entries.&lt;br /&gt;
&lt;br /&gt;
Doesn&#039;t return anything on a v2.1 system where sysupdate domains are blocked.&lt;br /&gt;
&lt;br /&gt;
= nim:shp =&lt;br /&gt;
This is &amp;quot;nn::nim::detail::IShopServiceManager&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || RequestDeviceAuthenticationToken&lt;br /&gt;
|-&lt;br /&gt;
| 1 || RequestCachedDeviceAuthenticationToken&lt;br /&gt;
|-&lt;br /&gt;
| 100 || RequestRegisterDeviceAccount&lt;br /&gt;
|-&lt;br /&gt;
| 101 || RequestUnregisterDeviceAccount&lt;br /&gt;
|-&lt;br /&gt;
| 102 || RequestDeviceAccountStatus&lt;br /&gt;
|-&lt;br /&gt;
| 103 || GetDeviceAccountInfo&lt;br /&gt;
|-&lt;br /&gt;
| 104 || RequestDeviceRegistrationInfo&lt;br /&gt;
|-&lt;br /&gt;
| 105 || RequestTransferDeviceAccount&lt;br /&gt;
|-&lt;br /&gt;
| 106 || RequestSyncRegistration&lt;br /&gt;
|-&lt;br /&gt;
| 107 || IsOwnDeviceId&lt;br /&gt;
|-&lt;br /&gt;
| 200 || RequestRegisterNotificationToken&lt;br /&gt;
|-&lt;br /&gt;
| 300 || RequestUnlinkDevice&lt;br /&gt;
|-&lt;br /&gt;
| 301 || RequestUnlinkDeviceIntegrated&lt;br /&gt;
|-&lt;br /&gt;
| 302 || RequestLinkDevice&lt;br /&gt;
|-&lt;br /&gt;
| 303 || HasDeviceLink&lt;br /&gt;
|-&lt;br /&gt;
| 304 || RequestUnlinkDeviceAll&lt;br /&gt;
|-&lt;br /&gt;
| 305 || RequestCreateVirtualAccount&lt;br /&gt;
|-&lt;br /&gt;
| 306 || RequestDeviceLinkStatus&lt;br /&gt;
|-&lt;br /&gt;
| 400 || GetAccountByVirtualAccount&lt;br /&gt;
|-&lt;br /&gt;
| 500 || RequestSyncTicket&lt;br /&gt;
|-&lt;br /&gt;
| 501 || RequestDownloadTicket&lt;br /&gt;
|-&lt;br /&gt;
| 502 || [4.0.0+] RequestDownloadTicketForPrepurchasedContents&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ntc =&lt;br /&gt;
This is &amp;quot;nn::ntc::detail::service::IStaticService&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || OpenEnsureNetworkClockAvailabilityService&lt;br /&gt;
|-&lt;br /&gt;
| 100 || SuspendAutonomicTimeCorrection&lt;br /&gt;
|-&lt;br /&gt;
| 101 || ResumeAutonomicTimeCorrection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Network-time-sync uses the &amp;quot;&amp;lt;...&amp;gt;/time&amp;quot; HTTPS URL listed in the below Network section. This just returns an UTC Unix time string.&lt;br /&gt;
&lt;br /&gt;
== IEnsureNetworkClockAvailabilityService ==&lt;br /&gt;
This is &amp;quot;nn::ntc::detail::service::IEnsureNetworkClockAvailabilityService&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || StartTask&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GetFinishNotificationEvent&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GetResult&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Cancel&lt;br /&gt;
|-&lt;br /&gt;
| 4 || IsProcessing&lt;br /&gt;
|-&lt;br /&gt;
| 5 || GetServerTime&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Network =&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://sun.hac.%%.d4c.nintendo.net/v1/system_update_meta?device_id=%016llx&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://aqua.hac.%%.d4c.nintendo.net/required_system_update_meta?device_id=%016llx&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://%s.hac.%%.d4c.nintendo.net/t/%c/%016llx/%u?device_id=%016llx&amp;lt;/nowiki&amp;gt; Returns content like the below URL. This is the content for [[NCA]]-type0. See below for %c. %016llx is titleID, %u is title-version.&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://%s.hac.%%.d4c.nintendo.net/c/%c/%s&amp;lt;/nowiki&amp;gt; Used for downloading content. First %s is atumn or atum. %c is one of: &#039;c&#039;, &#039;a&#039;, or &#039;s&#039;. %s is just the hex-string NcaId. The server also returns two HTTP headers: &amp;quot;X-Nintendo-Content-Hash: {entire lowercase hex-string of the content SHA256 hash}&amp;quot; and &amp;quot;X-Nintendo-Content-ID: {lowercase hex-string for NcaId}&amp;quot;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://superfly.hac.%%.d4c.nintendo.net/v1/t/%016llx/dv&amp;lt;/nowiki&amp;gt; %016llx is titleID, only for eShop titles it appears. Returns .json title-info.&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://superfly.hac.%%.d4c.nintendo.net/v1/a/%016llx/dv&amp;lt;/nowiki&amp;gt; %016llx is titleID, only for eShop titles it appears. Output is similar to above URL.&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://aauth-%.ndas.srv.nintendo.net/v1/time&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://beach.hac.%.eshop.nintendo.net/v1/rom_cards?application_id=%016llx&amp;amp;rom_card_cert=%s&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://beach.hac.%.eshop.nintendo.net/v1/rom_cards/register?application_id=%016llx&amp;amp;rom_card_cert=%s&amp;amp;expected_gold_point=%d&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://beach.hac.%.eshop.nintendo.net/v1/my/devices/hac/link?lang=en&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://beach.hac.%.eshop.nintendo.net/v1/my/virtual_account?lang=en&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://tagaya.hac.%.eshop.nintendo.net/tagaya/hac_versionlist&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* ...&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;&amp;quot;https://dauth-%.ndas.srv.nintendo.net/v1/device_auth_token&amp;quot;&amp;lt;/nowiki&amp;gt; CURLOPT_POSTFIELDS is set to the output from: snprintf(..., &amp;quot;system_version=%08x&amp;amp;client_id=%s&amp;quot;, &amp;lt;byte-swapped first 3 bytes from [[System_Version_Title]] loaded via [[Settings_services|settings]] cmd&amp;gt;, &amp;quot;&amp;lt;hard-coded hex string&amp;gt;&amp;quot;);&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://ecs-%.hac.shop.nintendo.net/ecs/services/rest/AccountGetETickets&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://ecs-%.hac.shop.nintendo.net/ecs/services/rest/GetAccountStatus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://ias-%.hac.shop.nintendo.net/ias/services/rest/Register&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://ias-%.hac.shop.nintendo.net/ias/services/rest/GetChallenge&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://ias-%.hac.shop.nintendo.net/ias/services/rest/Unregister&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://ias-%.hac.shop.nintendo.net/ias/services/rest/GetRegistrationInfo&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://ias-%.hac.shop.nintendo.net/ias/services/rest/CompleteETicketSync&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://ias-%.hac.shop.nintendo.net/ias/services/rest/AccountTransfer&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://ias-%.hac.shop.nintendo.net/ias/services/rest/SyncRegistration&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [5.0.0]+ &amp;lt;nowiki&amp;gt;https://pearljam.hac.%.eshop.nintendo.net/sugar&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* [5.0.0]+ &amp;lt;nowiki&amp;gt;https://pearljam.hac.%.eshop.nintendo.net/civil&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These are not accessible without the required TLS client cert+privk, minus the time URL which can be accessed without any client cert+privk at all.&lt;br /&gt;
&lt;br /&gt;
The returned content data from CDN, for both system-titles and eShop-titles, is identical to the data readable by [[Content_Manager_services#ReadEntryRaw]].&lt;br /&gt;
&lt;br /&gt;
While atumn seems to be for system-titles, and atum for eShop titles, the latter titles are accessible fine with atumn(with &amp;quot;/t/&amp;quot; for NCA-type0 at least).&lt;br /&gt;
&lt;br /&gt;
&#039;a&#039; is used when an input u8 is not 0x3, otherwise &#039;s&#039; is used. This is [[Content_Manager_services#Title_Types|title-type]]? A seperate function using the &amp;quot;.../c/&amp;quot; URL is hard-coded to use &#039;c&#039;. This appears to match &#039;s&#039; usage attempts: the only URL that returned actual data with &#039;s&#039; was with titleID 0100000000000816.&lt;br /&gt;
&lt;br /&gt;
As of June 30, 2017, accessing old content via the atumn &amp;quot;/c/&amp;quot; and &amp;quot;/t/&amp;quot; URLs works fine.&lt;br /&gt;
&lt;br /&gt;
Going by strings in NIM, it appears SOAP isn&#039;t used anymore. ecs appears to use REST API?&lt;br /&gt;
&lt;br /&gt;
== User-Agent ==&lt;br /&gt;
NIM generates two User-Agent strings:&lt;br /&gt;
  snprintf(..., &amp;quot;User-Agent: NintendoSDK Firmware/%s-%u (platform:%s; did:%016llx; eid:%s)&amp;quot;, &amp;lt;string at [[System_Version_Title|sysver]]+0x68&amp;gt;, {u32 from [[System_Version_Title|sysver]]+4}, &amp;quot;NX&amp;quot;, DeviceId, {[[NSD_services|NSD]] cmd11 output});&lt;br /&gt;
  snprintf(..., &amp;quot;User-Agent: NintendoSDK Firmware/%s-%u (platform:%s; eid:%s)&amp;quot;, &amp;lt;string at [[System_Version_Title|sysver]]+0x68&amp;gt;, {u32 from [[System_Version_Title|sysver]]+4}, &amp;quot;NX&amp;quot;, DeviceId, {[[NSD_services|NSD]] cmd11 output});&lt;br /&gt;
&lt;br /&gt;
Where the 64bit DeviceId is parsed from the 0x10-bytes at outbuf+0xC6 from [[Settings_services|set:cal]] GetDeviceCert(DeviceCert_certname+2, aka where the hex string for the DeviceId is).&lt;br /&gt;
&lt;br /&gt;
== sun ==&lt;br /&gt;
NIM sends a HTTP GET with the sun URL listed above to get the title-listing of the latest system-titles, as .json. The deviceid in the URL is the same one in the above User-Agent section. HTTP header &amp;quot;Accept:application/json&amp;quot; is sent in the request.&lt;br /&gt;
&lt;br /&gt;
The response is json with a &amp;quot;system_update_metas&amp;quot; block, containing &amp;quot;title_id&amp;quot; and &amp;quot;title_version&amp;quot; entries. The actual server response only contains 1 title.&lt;br /&gt;
&lt;br /&gt;
Example, from 2.0 system:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;timestamp&amp;quot;:REDACTED-TIMESTSAMP,&amp;quot;system_update_metas&amp;quot;:[{&amp;quot;title_id&amp;quot;:&amp;quot;0100000000000816&amp;quot;,&amp;quot;title_version&amp;quot;:201327002}]}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== aqua ==&lt;br /&gt;
The following response is json from accessing the above aqua URL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&lt;br /&gt;
&amp;quot;contents_delivery_required_title_id&amp;quot;: &amp;quot;0100000000000816&amp;quot;,&lt;br /&gt;
&amp;quot;contents_delivery_required_title_version&amp;quot;: 0&lt;br /&gt;
}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A while after [[3.0.0]] release, the above title-version was changed to the one for v3.0(&amp;quot;Last-Modified: Thu, 29 Jun 2017 00:00:04 GMT&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=NPDM&amp;diff=3932</id>
		<title>NPDM</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=NPDM&amp;diff=3932"/>
		<updated>2018-03-02T05:38:31Z</updated>

		<summary type="html">&lt;p&gt;OgniK: /* ACI0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the Switch equivalent of 3DS [https://www.3dbrew.org/wiki/NCCH/Extended_Header exheader]. This is the file with extension &amp;quot;.npdm&amp;quot; in {Switch ExeFS}. The size of this file varies.&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x80&lt;br /&gt;
| META&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| &amp;lt;Varies&amp;gt;&lt;br /&gt;
| ACID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;See META&amp;gt;&lt;br /&gt;
| &amp;lt;See META&amp;gt;&lt;br /&gt;
| ACI0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= META =&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x4&lt;br /&gt;
| Magic &amp;quot;META&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0x1&lt;br /&gt;
| Flags, bit0: 64-bit instructions, bits1-3: address space width (1=64-bit, 2=32-bit). Needs to be &amp;lt;= 0xF&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0x1&lt;br /&gt;
| MainThreadPrio&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0x1&lt;br /&gt;
| DefaultCpuId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x4&lt;br /&gt;
| ProcessCategory (0: regular title, 1: kernel built-in). Should be 0 here.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0x4&lt;br /&gt;
| MainStackSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| ?&lt;br /&gt;
| Title name&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#ACI0]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#ACI0]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x78&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#ACID]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#ACID]] size&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ACID =&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x100&lt;br /&gt;
| RSA-2048 signature, seems to verify the data starting at 0x100 with the size field from 0x204.&lt;br /&gt;
|-&lt;br /&gt;
| 0x100&lt;br /&gt;
| 0x100&lt;br /&gt;
| RSA-2048 public key, seems to be used for the second [[NCA_Format|NCA]] signature.&lt;br /&gt;
|-&lt;br /&gt;
| 0x200&lt;br /&gt;
| 0x4&lt;br /&gt;
| Magic &amp;quot;ACID&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x204&lt;br /&gt;
| 0x4&lt;br /&gt;
| s32 Size field used with the above signature(?).&lt;br /&gt;
|-&lt;br /&gt;
| 0x208&lt;br /&gt;
| 0x4&lt;br /&gt;
| Zeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x20C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Flags. Bit0 must be 1 on retail, on devunit 0 is also allowed. Bit1 is unknown, set 1 for ARMS?&lt;br /&gt;
|-&lt;br /&gt;
| 0x210&lt;br /&gt;
| 0x8&lt;br /&gt;
| TitleIdRange_Min&lt;br /&gt;
|-&lt;br /&gt;
| 0x218&lt;br /&gt;
| 0x8&lt;br /&gt;
| TitleIdRange_Max&lt;br /&gt;
|-&lt;br /&gt;
| 0x220&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#FS Access Control]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x224&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#FS Access Control]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x228&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Service Access Control]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x22C&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Service Access Control]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x230&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Kernel Access Control]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x234&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Kernel Access Control]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x238&lt;br /&gt;
| 0x8&lt;br /&gt;
| Padding&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ACI0 =&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x4&lt;br /&gt;
| Magic &amp;quot;ACI0&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xC&lt;br /&gt;
| Zeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x8&lt;br /&gt;
| Title id&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x8&lt;br /&gt;
| Lowest allowed title id? Always 0?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#FS Access Header]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#FS Access Header]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Service Access Control]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Service Access Control]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Kernel Access Control]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Kernel Access Control]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 0x8&lt;br /&gt;
| Padding&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= FS Access Header =&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Version? Always 1. Must be non-zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x3&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x8&lt;br /&gt;
| Permissions bitmask&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0x4&lt;br /&gt;
| Usually 0x1C&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x4&lt;br /&gt;
| Usually 0x0&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x4&lt;br /&gt;
| Usually 0x1C&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x4&lt;br /&gt;
| Usually 0x0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= FS Access Control =&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Version? Always 1. Must be non-zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x3&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x8&lt;br /&gt;
| Permissions bitmask&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0x20&lt;br /&gt;
| Usually all zeroes for applications&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Filesystem_services#Permissions|Permissions]] bitmask:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| MountContent* is accessible when set.&lt;br /&gt;
|-&lt;br /&gt;
| 34&lt;br /&gt;
| Enables access to [[Filesystem_services|Bis]] partitionID 27 and 28?&lt;br /&gt;
|-&lt;br /&gt;
| 63&lt;br /&gt;
| Enables access to everything: all [[Filesystem_services#Permissions|permission-types]] which check a bitmask have this bit set.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For bit62 in permissions, see [[SPL_services#GetConfig|here]].&lt;br /&gt;
&lt;br /&gt;
Web-applets permissions:&lt;br /&gt;
* &amp;quot;LibAppletWeb&amp;quot; and &amp;quot;LibAppletOff&amp;quot; have same access control: bit0 and bit3 set, and bit62 set.&lt;br /&gt;
* Rest of the web-applets: Same as above except bit0 isn&#039;t set.&lt;br /&gt;
&lt;br /&gt;
= Service Access Control =&lt;br /&gt;
This is a list of [[Services_API|service]]-name strings which the title has access to, with the following structure:&lt;br /&gt;
  +0: control_byte&lt;br /&gt;
  +1: {service-name without nul-terminator}&lt;br /&gt;
&lt;br /&gt;
Bitmask 0x0F in control_byte is the {length of the service-name without nul-terminator} - 1.&lt;br /&gt;
&lt;br /&gt;
Bitmask 0x80 in control_byte means service is allowed to be registered.&lt;br /&gt;
&lt;br /&gt;
The service string can contain a wildcard &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character.&lt;br /&gt;
&lt;br /&gt;
= Kernel Access Control =&lt;br /&gt;
On Switch, descriptors are identified by pattern 01..11 in low bits.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pattern of lower bits&lt;br /&gt;
! Lowest clear bitmask/bit&lt;br /&gt;
! Type&lt;br /&gt;
! Fields&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxxxxxxxxxxxx0111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit3&lt;br /&gt;
| KernelFlags&lt;br /&gt;
| Bit31-24: Highest allowed cpu id, bit23-16: Lowest allowed cpu id, bit15-10: Highest allowed thread prio, bit9-4: Lowest allowed thread prio&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxxxxxxxxxxx01111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit4&lt;br /&gt;
| SyscallMask&lt;br /&gt;
| Bits 29-31: Syscall mask table index; Bits 5-28: Mask&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxxxxxxxxx0111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit6&lt;br /&gt;
| MapIoOrNormalRange&lt;br /&gt;
| Bits 7-30: Alternating start page and number of pages, bit31: Alternating read-only flag then MemoryAttribute 0x2001/0x42002 selector flag&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxxxxxxxx01111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit7&lt;br /&gt;
| MapNormalPage (RW)&lt;br /&gt;
| Bits 8-31: Page&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxxxx011111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit11&lt;br /&gt;
| InterruptPair&lt;br /&gt;
| Bits 12-21: Irq0, bits 20-31: Irq1, 0x3FF means empty.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxx01111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit13&lt;br /&gt;
| ApplicationType&lt;br /&gt;
| Bit16-14: ApplicationType (0=sysmodule, 1=application, 2=applet), bit16 ignored. Parsed by [[Process Manager services]]. Defaults to 0 if descriptor doesn&#039;t exist. Can only run 1 application at a time.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bx011111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit14&lt;br /&gt;
| KernelReleaseVersion&lt;br /&gt;
| Bits 15-X: Version. The raw descriptor is compared with 0x80000, when less than an error is returned. This is equivalent to comparing the bits starting at bit15 with 0x10. This enforces a minimum required version, not a maximum.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0b0111111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit15&lt;br /&gt;
| HandleTableSize&lt;br /&gt;
| Bit25-16: Number of handles the table shall fit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0b1111111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit16&lt;br /&gt;
| DebugFlags&lt;br /&gt;
| Bit17: can be debugged, bit18: can debug others&lt;br /&gt;
|-&lt;br /&gt;
| All ones&lt;br /&gt;
| &lt;br /&gt;
| Ignored&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Mapping restrictions ==&lt;br /&gt;
The physaddr range 0x80060000-0x2000000000 is not allowed to be mapped as IO.&lt;br /&gt;
The physaddr range 0x80000000-0x2000000000 is not allowed to be mapped as Normal.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The range for IO was changed into 0x80060000-0x81D3FFFF.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] A blacklist was added for IO and Normal mappings:&lt;br /&gt;
* 0x50040000-0x50060000 (ARM, Interrupt Controller)&lt;br /&gt;
* 0x6000F000 (Exception Vectors)&lt;br /&gt;
* 0x6001DC00-0x6001E000 (IPATCH)&lt;br /&gt;
* 0x7000E000 (RTC/PMC)&lt;br /&gt;
* 0x70019000 (MC)&lt;br /&gt;
* 0x7001C000 (MC0)&lt;br /&gt;
* 0x7001D000 (MC1)&lt;br /&gt;
&lt;br /&gt;
== Kernel versions ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Firmware || Kernel Version || Minimum Allowed&lt;br /&gt;
|-&lt;br /&gt;
| 1.0.0 || 5.0.0 || 3.0.0&lt;br /&gt;
|-&lt;br /&gt;
| 2.0.0 || 6.1.0 || 3.0.0&lt;br /&gt;
|-&lt;br /&gt;
| 3.0.0 || 7.4.0 || 3.0.0&lt;br /&gt;
|-&lt;br /&gt;
| 3.0.2 || 7.4.0 || 3.0.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bit31-19: Major version&lt;br /&gt;
Bit18-15: Minor version&lt;br /&gt;
Bit14-0: Zeroes&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Loader_services&amp;diff=3931</id>
		<title>Loader services</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Loader_services&amp;diff=3931"/>
		<updated>2018-03-02T02:36:22Z</updated>

		<summary type="html">&lt;p&gt;OgniK: ClearLaunchQueue &amp;amp; ClearDebugLaunchQueue both call the same functions without any differences/checks?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ldr:dmnt =&lt;br /&gt;
This is &amp;quot;nn::ldr::detail::IDebugMonitorInterface&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || AddProcessToDebugLaunchQueue&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ClearDebugLaunchQueue&lt;br /&gt;
|-&lt;br /&gt;
| 2 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== AddProcessToDebugLaunchQueue ==&lt;br /&gt;
Same as [[Loader_services#AddProcessToLaunchQueue|AddProcessToLaunchQueue]] but for processes marked as debug.&lt;br /&gt;
&lt;br /&gt;
== ClearDebugLaunchQueue ==&lt;br /&gt;
Same as [[Loader_services#ClearLaunchQueue|ClearLaunchQueue]].&lt;br /&gt;
&lt;br /&gt;
= ldr:pm =&lt;br /&gt;
This is &amp;quot;nn::ldr::detail::IProcessManagerInterface&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CreateProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#GetProgramInfo]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [[#RegisterTitle]]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [[#UnregisterTitle]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GetProgramInfo ==&lt;br /&gt;
Takes a TitleId + StorageId, parses the NPDM, and writes output to a C descriptor buffer as follows:&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| MainThreadPrio. Arg1 to svcStartProcess&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| DefaultCpuId. Arg2 to svcStartProcess&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x1&lt;br /&gt;
| ApplicationType, see [[Process Manager services|here]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x1&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| MainThreadStackSize. Arg3 to svcStartProcess&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| TitleIdRange_Min&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x4&lt;br /&gt;
| ACID [[NPDM#Service Access Control|Service Access Control]] list size&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x4&lt;br /&gt;
| ACI0 [[NPDM#Service Access Control|Service Access Control]] list size&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x4&lt;br /&gt;
| ACID [[NPDM#FS Access Control|FS Access Control]] buffer size&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0x4&lt;br /&gt;
| ACI0 [[NPDM#FS Access Control|FS Access Control]] buffer size&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| &amp;lt;Varies&amp;gt;&lt;br /&gt;
| ACID [[NPDM#Service Access Control|Service Access Control]] list&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Varies&amp;gt;&lt;br /&gt;
| &amp;lt;Varies&amp;gt;&lt;br /&gt;
| ACI0 [[NPDM#Service Access Control|Service Access Control]] list&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Varies&amp;gt;&lt;br /&gt;
| &amp;lt;Varies&amp;gt;&lt;br /&gt;
| ACID [[NPDM#FS Access Control|FS Access Control]] buffer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Varies&amp;gt;&lt;br /&gt;
| &amp;lt;Varies&amp;gt;&lt;br /&gt;
| ACI0 [[NPDM#FS Access Control|FS Access Control]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RegisterTitle ==&lt;br /&gt;
Takes a TitleId + StorageId, returns an index.&lt;br /&gt;
&lt;br /&gt;
== UnregisterTitle ==&lt;br /&gt;
Takes the index from [[#RegisterTitle]].&lt;br /&gt;
&lt;br /&gt;
= ldr:shel =&lt;br /&gt;
This is &amp;quot;nn::ldr::detail::IShellInterface&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#AddProcessToLaunchQueue]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#ClearLaunchQueue]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== AddProcessToLaunchQueue ==&lt;br /&gt;
Takes a type-0x19 input buffer with launch arguments (as string), an u32 (size of arguments string), and an input title-id.&lt;br /&gt;
&lt;br /&gt;
Loads a process for the specified title-id and passes along the supplied arguments.&lt;br /&gt;
Loaded processes are kept in a queue waiting for PM to launch them. The maximum number of waiting processes in this list is 10.&lt;br /&gt;
&lt;br /&gt;
== ClearLaunchQueue ==&lt;br /&gt;
Clears the loaded processes waiting queue.&lt;br /&gt;
&lt;br /&gt;
= ldr:ro =&lt;br /&gt;
[1.0.0-2.3.0] This is &amp;quot;nn::ldr::detail::IRoInterface&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[3.0.0+] This is &amp;quot;nn::ro::detail::IRoInterface&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#LoadNro]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || UnloadNro&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [[#LoadNrr]] &lt;br /&gt;
|-&lt;br /&gt;
| 3 || UnloadNrr&lt;br /&gt;
|-&lt;br /&gt;
| 4 || [[#Initialize]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== LoadNro ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Word || Value&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0x00000004&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x80000012&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 0x00000001&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0-1 || Pid&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0 || &amp;quot;SCFI&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x00000000&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Nro heap address&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Nro size&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Bss backing heap address&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Bss size&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== LoadNrr ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Word || Value&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0x00000004&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8000000E&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 0x00000001&lt;br /&gt;
|-&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0-1 || Pid&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0 || &amp;quot;SFCI&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x00000002&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Nrr address&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Nrr size&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Initialize ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Word || Value&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0x00000004&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8000000A&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 0x00000003&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0-1 || Pid&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Process handle (0xFFFF8001)&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0 || &amp;quot;SFCI&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x00000004&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Always 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Loader_services&amp;diff=3930</id>
		<title>Loader services</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Loader_services&amp;diff=3930"/>
		<updated>2018-03-02T01:34:42Z</updated>

		<summary type="html">&lt;p&gt;OgniK: /* GetProgramInfo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ldr:dmnt =&lt;br /&gt;
This is &amp;quot;nn::ldr::detail::IDebugMonitorInterface&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || AddProcessToDebugLaunchQueue&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ClearDebugLaunchQueue&lt;br /&gt;
|-&lt;br /&gt;
| 2 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== AddProcessToDebugLaunchQueue ==&lt;br /&gt;
Same as [[Loader_services#AddProcessToLaunchQueue|AddProcessToLaunchQueue]] but for processes marked as debug.&lt;br /&gt;
&lt;br /&gt;
== ClearDebugLaunchQueue ==&lt;br /&gt;
Same as [[Loader_services#ClearLaunchQueue|ClearLaunchQueue]] but for processes marked as debug.&lt;br /&gt;
&lt;br /&gt;
= ldr:pm =&lt;br /&gt;
This is &amp;quot;nn::ldr::detail::IProcessManagerInterface&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CreateProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#GetProgramInfo]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [[#RegisterTitle]]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [[#UnregisterTitle]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GetProgramInfo ==&lt;br /&gt;
Takes a TitleId + StorageId, parses the NPDM, and writes output to a C descriptor buffer as follows:&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| MainThreadPrio. Arg1 to svcStartProcess&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| DefaultCpuId. Arg2 to svcStartProcess&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x1&lt;br /&gt;
| ApplicationType, see [[Process Manager services|here]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x1&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| MainThreadStackSize. Arg3 to svcStartProcess&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| TitleIdRange_Min&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x4&lt;br /&gt;
| ACID [[NPDM#Service Access Control|Service Access Control]] list size&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x4&lt;br /&gt;
| ACI0 [[NPDM#Service Access Control|Service Access Control]] list size&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x4&lt;br /&gt;
| ACID [[NPDM#FS Access Control|FS Access Control]] buffer size&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0x4&lt;br /&gt;
| ACI0 [[NPDM#FS Access Control|FS Access Control]] buffer size&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| &amp;lt;Varies&amp;gt;&lt;br /&gt;
| ACID [[NPDM#Service Access Control|Service Access Control]] list&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Varies&amp;gt;&lt;br /&gt;
| &amp;lt;Varies&amp;gt;&lt;br /&gt;
| ACI0 [[NPDM#Service Access Control|Service Access Control]] list&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Varies&amp;gt;&lt;br /&gt;
| &amp;lt;Varies&amp;gt;&lt;br /&gt;
| ACID [[NPDM#FS Access Control|FS Access Control]] buffer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;Varies&amp;gt;&lt;br /&gt;
| &amp;lt;Varies&amp;gt;&lt;br /&gt;
| ACI0 [[NPDM#FS Access Control|FS Access Control]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RegisterTitle ==&lt;br /&gt;
Takes a TitleId + StorageId, returns an index.&lt;br /&gt;
&lt;br /&gt;
== UnregisterTitle ==&lt;br /&gt;
Takes the index from [[#RegisterTitle]].&lt;br /&gt;
&lt;br /&gt;
= ldr:shel =&lt;br /&gt;
This is &amp;quot;nn::ldr::detail::IShellInterface&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#AddProcessToLaunchQueue]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#ClearLaunchQueue]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== AddProcessToLaunchQueue ==&lt;br /&gt;
Takes a type-0x19 input buffer with launch arguments (as string), an u32 (size of arguments string), and an input title-id.&lt;br /&gt;
&lt;br /&gt;
Loads a process for the specified title-id and passes along the supplied arguments.&lt;br /&gt;
Loaded processes are kept in a queue waiting for PM to launch them. The maximum number of waiting processes in this list is 10.&lt;br /&gt;
&lt;br /&gt;
== ClearLaunchQueue ==&lt;br /&gt;
Clears the loaded processes waiting queue.&lt;br /&gt;
&lt;br /&gt;
= ldr:ro =&lt;br /&gt;
[1.0.0-2.3.0] This is &amp;quot;nn::ldr::detail::IRoInterface&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[3.0.0+] This is &amp;quot;nn::ro::detail::IRoInterface&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#LoadNro]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || UnloadNro&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [[#LoadNrr]] &lt;br /&gt;
|-&lt;br /&gt;
| 3 || UnloadNrr&lt;br /&gt;
|-&lt;br /&gt;
| 4 || [[#Initialize]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== LoadNro ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Word || Value&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0x00000004&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x80000012&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 0x00000001&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0-1 || Pid&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0 || &amp;quot;SCFI&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x00000000&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Nro heap address&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Nro size&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Bss backing heap address&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Bss size&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== LoadNrr ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Word || Value&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0x00000004&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8000000E&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 0x00000001&lt;br /&gt;
|-&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0-1 || Pid&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0 || &amp;quot;SFCI&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x00000002&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Nrr address&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Nrr size&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Initialize ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Word || Value&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0x00000004&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x8000000A&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 0x00000003&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0-1 || Pid&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Process handle (0xFFFF8001)&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0 || &amp;quot;SFCI&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x00000004&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Always 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=NPDM&amp;diff=3929</id>
		<title>NPDM</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=NPDM&amp;diff=3929"/>
		<updated>2018-03-02T01:21:23Z</updated>

		<summary type="html">&lt;p&gt;OgniK: Consistency fixes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the Switch equivalent of 3DS [https://www.3dbrew.org/wiki/NCCH/Extended_Header exheader]. This is the file with extension &amp;quot;.npdm&amp;quot; in {Switch ExeFS}. The size of this file varies.&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x80&lt;br /&gt;
| META&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| &amp;lt;Varies&amp;gt;&lt;br /&gt;
| ACID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;See META&amp;gt;&lt;br /&gt;
| &amp;lt;See META&amp;gt;&lt;br /&gt;
| ACI0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= META =&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x4&lt;br /&gt;
| Magic &amp;quot;META&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0x1&lt;br /&gt;
| Flags, bit0: 64-bit instructions, bits1-3: address space width (1=64-bit, 2=32-bit). Needs to be &amp;lt;= 0xF&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0x1&lt;br /&gt;
| MainThreadPrio&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0x1&lt;br /&gt;
| DefaultCpuId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x4&lt;br /&gt;
| ProcessCategory (0: regular title, 1: kernel built-in). Should be 0 here.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0x4&lt;br /&gt;
| MainStackSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| ?&lt;br /&gt;
| Title name&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#ACI0]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#ACI0]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x78&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#ACID]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#ACID]] size&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ACID =&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x100&lt;br /&gt;
| RSA-2048 signature, seems to verify the data starting at 0x100 with the size field from 0x204.&lt;br /&gt;
|-&lt;br /&gt;
| 0x100&lt;br /&gt;
| 0x100&lt;br /&gt;
| RSA-2048 public key, seems to be used for the second [[NCA_Format|NCA]] signature.&lt;br /&gt;
|-&lt;br /&gt;
| 0x200&lt;br /&gt;
| 0x4&lt;br /&gt;
| Magic &amp;quot;ACID&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x204&lt;br /&gt;
| 0x4&lt;br /&gt;
| s32 Size field used with the above signature(?).&lt;br /&gt;
|-&lt;br /&gt;
| 0x208&lt;br /&gt;
| 0x4&lt;br /&gt;
| Zeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x20C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Flags. Bit0 must be 1 on retail, on devunit 0 is also allowed. Bit1 is unknown, set 1 for ARMS?&lt;br /&gt;
|-&lt;br /&gt;
| 0x210&lt;br /&gt;
| 0x8&lt;br /&gt;
| TitleIdRange_Min&lt;br /&gt;
|-&lt;br /&gt;
| 0x218&lt;br /&gt;
| 0x8&lt;br /&gt;
| TitleIdRange_Max&lt;br /&gt;
|-&lt;br /&gt;
| 0x220&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#FS Access Control]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x224&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#FS Access Control]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x228&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Service Access Control]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x22C&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Service Access Control]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x230&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Kernel Access Control]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x234&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Kernel Access Control]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x238&lt;br /&gt;
| 0x8&lt;br /&gt;
| Padding&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ACI0 =&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x4&lt;br /&gt;
| Magic &amp;quot;ACI0&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xC&lt;br /&gt;
| Zeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x8&lt;br /&gt;
| Title id&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x8&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#FS Access Header]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#FS Access Header]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Service Access Control]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Service Access Control]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Kernel Access Control]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Kernel Access Control]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 0x8&lt;br /&gt;
| Padding&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= FS Access Header =&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Version? Always 1. Must be non-zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x3&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x8&lt;br /&gt;
| Permissions bitmask&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0x4&lt;br /&gt;
| Usually 0x1C&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x4&lt;br /&gt;
| Usually 0x0&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x4&lt;br /&gt;
| Usually 0x1C&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x4&lt;br /&gt;
| Usually 0x0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= FS Access Control =&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Version? Always 1. Must be non-zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x3&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x8&lt;br /&gt;
| Permissions bitmask&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0x20&lt;br /&gt;
| Usually all zeroes for applications&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Filesystem_services#Permissions|Permissions]] bitmask:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| MountContent* is accessible when set.&lt;br /&gt;
|-&lt;br /&gt;
| 34&lt;br /&gt;
| Enables access to [[Filesystem_services|Bis]] partitionID 27 and 28?&lt;br /&gt;
|-&lt;br /&gt;
| 63&lt;br /&gt;
| Enables access to everything: all [[Filesystem_services#Permissions|permission-types]] which check a bitmask have this bit set.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For bit62 in permissions, see [[SPL_services#GetConfig|here]].&lt;br /&gt;
&lt;br /&gt;
Web-applets permissions:&lt;br /&gt;
* &amp;quot;LibAppletWeb&amp;quot; and &amp;quot;LibAppletOff&amp;quot; have same access control: bit0 and bit3 set, and bit62 set.&lt;br /&gt;
* Rest of the web-applets: Same as above except bit0 isn&#039;t set.&lt;br /&gt;
&lt;br /&gt;
= Service Access Control =&lt;br /&gt;
This is a list of [[Services_API|service]]-name strings which the title has access to, with the following structure:&lt;br /&gt;
  +0: control_byte&lt;br /&gt;
  +1: {service-name without nul-terminator}&lt;br /&gt;
&lt;br /&gt;
Bitmask 0x0F in control_byte is the {length of the service-name without nul-terminator} - 1.&lt;br /&gt;
&lt;br /&gt;
Bitmask 0x80 in control_byte means service is allowed to be registered.&lt;br /&gt;
&lt;br /&gt;
The service string can contain a wildcard &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character.&lt;br /&gt;
&lt;br /&gt;
= Kernel Access Control =&lt;br /&gt;
On Switch, descriptors are identified by pattern 01..11 in low bits.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pattern of lower bits&lt;br /&gt;
! Lowest clear bitmask/bit&lt;br /&gt;
! Type&lt;br /&gt;
! Fields&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxxxxxxxxxxxx0111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit3&lt;br /&gt;
| KernelFlags&lt;br /&gt;
| Bit31-24: Highest allowed cpu id, bit23-16: Lowest allowed cpu id, bit15-10: Highest allowed thread prio, bit9-4: Lowest allowed thread prio&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxxxxxxxxxxx01111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit4&lt;br /&gt;
| SyscallMask&lt;br /&gt;
| Bits 29-31: Syscall mask table index; Bits 5-28: Mask&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxxxxxxxxx0111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit6&lt;br /&gt;
| MapIoOrNormalRange&lt;br /&gt;
| Bits 7-30: Alternating start page and number of pages, bit31: Alternating read-only flag then MemoryAttribute 0x2001/0x42002 selector flag&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxxxxxxxx01111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit7&lt;br /&gt;
| MapNormalPage (RW)&lt;br /&gt;
| Bits 8-31: Page&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxxxx011111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit11&lt;br /&gt;
| InterruptPair&lt;br /&gt;
| Bits 12-21: Irq0, bits 20-31: Irq1, 0x3FF means empty.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxx01111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit13&lt;br /&gt;
| ApplicationType&lt;br /&gt;
| Bit16-14: ApplicationType (0=sysmodule, 1=application, 2=applet), bit16 ignored. Parsed by [[Process Manager services]]. Defaults to 0 if descriptor doesn&#039;t exist. Can only run 1 application at a time.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bx011111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit14&lt;br /&gt;
| KernelReleaseVersion&lt;br /&gt;
| Bits 15-X: Version. The raw descriptor is compared with 0x80000, when less than an error is returned. This is equivalent to comparing the bits starting at bit15 with 0x10. This enforces a minimum required version, not a maximum.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0b0111111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit15&lt;br /&gt;
| HandleTableSize&lt;br /&gt;
| Bit25-16: Number of handles the table shall fit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0b1111111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit16&lt;br /&gt;
| DebugFlags&lt;br /&gt;
| Bit17: can be debugged, bit18: can debug others&lt;br /&gt;
|-&lt;br /&gt;
| All ones&lt;br /&gt;
| &lt;br /&gt;
| Ignored&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Mapping restrictions ==&lt;br /&gt;
The physaddr range 0x80060000-0x2000000000 is not allowed to be mapped as IO.&lt;br /&gt;
The physaddr range 0x80000000-0x2000000000 is not allowed to be mapped as Normal.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The range for IO was changed into 0x80060000-0x81D3FFFF.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] A blacklist was added for IO and Normal mappings:&lt;br /&gt;
* 0x50040000-0x50060000 (ARM, Interrupt Controller)&lt;br /&gt;
* 0x6000F000 (Exception Vectors)&lt;br /&gt;
* 0x6001DC00-0x6001E000 (IPATCH)&lt;br /&gt;
* 0x7000E000 (RTC/PMC)&lt;br /&gt;
* 0x70019000 (MC)&lt;br /&gt;
* 0x7001C000 (MC0)&lt;br /&gt;
* 0x7001D000 (MC1)&lt;br /&gt;
&lt;br /&gt;
== Kernel versions ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Firmware || Kernel Version || Minimum Allowed&lt;br /&gt;
|-&lt;br /&gt;
| 1.0.0 || 5.0.0 || 3.0.0&lt;br /&gt;
|-&lt;br /&gt;
| 2.0.0 || 6.1.0 || 3.0.0&lt;br /&gt;
|-&lt;br /&gt;
| 3.0.0 || 7.4.0 || 3.0.0&lt;br /&gt;
|-&lt;br /&gt;
| 3.0.2 || 7.4.0 || 3.0.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bit31-19: Major version&lt;br /&gt;
Bit18-15: Minor version&lt;br /&gt;
Bit14-0: Zeroes&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Error_codes&amp;diff=3928</id>
		<title>Error codes</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Error_codes&amp;diff=3928"/>
		<updated>2018-03-02T00:26:59Z</updated>

		<summary type="html">&lt;p&gt;OgniK: /* Error codes */&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 || NVIDIA, TransferMemory&lt;br /&gt;
|-&lt;br /&gt;
| 5 || NCM&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DD&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;
| 18 || HTC&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;
| 26 || SPL&lt;br /&gt;
|-&lt;br /&gt;
| 100 || ETHC&lt;br /&gt;
|-&lt;br /&gt;
| 101 || I2C&lt;br /&gt;
|-&lt;br /&gt;
| 105 || Settings&lt;br /&gt;
|-&lt;br /&gt;
| 110 || NIFM&lt;br /&gt;
|-&lt;br /&gt;
| 111 || HwOpus&lt;br /&gt;
|-&lt;br /&gt;
| 114 || Display&lt;br /&gt;
|-&lt;br /&gt;
| 116 || NTC&lt;br /&gt;
|-&lt;br /&gt;
| 117 || FGM&lt;br /&gt;
|-&lt;br /&gt;
| 120 || PCIE&lt;br /&gt;
|-&lt;br /&gt;
| 121 || Friends&lt;br /&gt;
|-&lt;br /&gt;
| 123 || SSL&lt;br /&gt;
|-&lt;br /&gt;
| 124 || Account&lt;br /&gt;
|-&lt;br /&gt;
| 126 || Mii&lt;br /&gt;
|-&lt;br /&gt;
| 128 || AM&lt;br /&gt;
|-&lt;br /&gt;
| 129 || Play Report&lt;br /&gt;
|-&lt;br /&gt;
| 133 || PCV&lt;br /&gt;
|-&lt;br /&gt;
| 134 || OMM&lt;br /&gt;
|-&lt;br /&gt;
| 137 || NIM&lt;br /&gt;
|-&lt;br /&gt;
| 138 || PSC&lt;br /&gt;
|-&lt;br /&gt;
| 140 || USB&lt;br /&gt;
|-&lt;br /&gt;
| 141 || NSD&lt;br /&gt;
|-&lt;br /&gt;
| 143 || BTM&lt;br /&gt;
|-&lt;br /&gt;
| 147 || ERPT&lt;br /&gt;
|-&lt;br /&gt;
| 148 || APM&lt;br /&gt;
|-&lt;br /&gt;
| 153 || Audio&lt;br /&gt;
|-&lt;br /&gt;
| 154 || NPNS&lt;br /&gt;
|-&lt;br /&gt;
| 157 || ARP&lt;br /&gt;
|-&lt;br /&gt;
| 158 || BOOT&lt;br /&gt;
|-&lt;br /&gt;
| 161 || NFC&lt;br /&gt;
|-&lt;br /&gt;
| 162 || Userland assert&lt;br /&gt;
|-&lt;br /&gt;
| 168 || Userland crash&lt;br /&gt;
|-&lt;br /&gt;
| 203 || HID&lt;br /&gt;
|-&lt;br /&gt;
| 206 || Capture&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;
| 651 || TC&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;
= Error codes =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Description || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C01 || 14 || Invalid kernel capability descriptor&lt;br /&gt;
|-&lt;br /&gt;
| 0x4201 || 33 || [[SPL_services#GetConfig|IsDebugMode]] isn&#039;t set.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCA01 || 101 || Invalid size&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC01 || 102 || Invalid address&lt;br /&gt;
|-&lt;br /&gt;
| 0xCE01 || 103 || Slabheap full&lt;br /&gt;
|-&lt;br /&gt;
| 0xD001 || 104 || Memory full&lt;br /&gt;
|-&lt;br /&gt;
| 0xD201 || 105 || Handle-table full.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD401 || 106 || Invalid memory state / invalid memory permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD801 || 108 || Invalid memory permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 0xDC01 || 110 || Invalid memory range&lt;br /&gt;
|-&lt;br /&gt;
| 0xE001 || 112 || Invalid thread priority.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE201 || 113 || Invalid processor id.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE401 || 114 || Invalid handle.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE601 || 115 || Syscall copy from user failed.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE801 || 116 || Invalid combination&lt;br /&gt;
|-&lt;br /&gt;
| 0xEA01 || 117 || Time out. Also when you give 0 handles to svcWaitSynchronizationN.&lt;br /&gt;
|-&lt;br /&gt;
| 0xEC01 || 118 || Canceled/interrupted [?]&lt;br /&gt;
|-&lt;br /&gt;
| 0xEE01 || 119 || Exceeding maximum&lt;br /&gt;
|-&lt;br /&gt;
| 0xF001 || 120 || Invalid enum&lt;br /&gt;
|-&lt;br /&gt;
| 0xF201 || 121 || No such entry&lt;br /&gt;
|-&lt;br /&gt;
| 0xF401 || 122 || Irq/DeviceAddressSpace/{...} already registered&lt;br /&gt;
|-&lt;br /&gt;
| 0xF601 || 123 || Port remote dead&lt;br /&gt;
|-&lt;br /&gt;
| 0xF801 || 124 || [Usermode] Unhandled interrupt&lt;br /&gt;
|-&lt;br /&gt;
| 0xFA01 || 125 || Wrong memory permission?&lt;br /&gt;
|-&lt;br /&gt;
| 0xFC01 || 126 || Reserved value&lt;br /&gt;
|-&lt;br /&gt;
| 0xFE01 || 127 || Invalid hardware breakpoint&lt;br /&gt;
|-&lt;br /&gt;
| 0x10001 || 128 || [Usermode] Fatal exception&lt;br /&gt;
|-&lt;br /&gt;
| 0x10201 || 129 || Last thread didn&#039;t belong to your process&lt;br /&gt;
|-&lt;br /&gt;
| 0x10601 || 131 || Port max sessions exceeded&lt;br /&gt;
|-&lt;br /&gt;
| 0x10801 || 132 || Resource limit exceeded&lt;br /&gt;
|-&lt;br /&gt;
| 0x20801 || 260 || Command buffer too small&lt;br /&gt;
|-&lt;br /&gt;
| 0x41001 || 520 || Process not being debugged&lt;br /&gt;
|-&lt;br /&gt;
| 0xE02 || 7 || Savedata [[Filesystem_services|already]] mounted&lt;br /&gt;
|-&lt;br /&gt;
| 0x7802 || 60 || The specified [[NCA]]-type doesn&#039;t exist for this title.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D202 || 1001 || Process does not have RomFs &lt;br /&gt;
|-&lt;br /&gt;
| 0x7D402 || 1002 || Title-id not found / savedata not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0xFA202 || 2001 || SD card not inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x13B002 || 2520 || Gamecard not inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x13DA02 || 2541 || Version check failed when mounting gamecard sysupdate partition?&lt;br /&gt;
|-&lt;br /&gt;
| 0x171402 || 2954 || Invalid gamecard handle.&lt;br /&gt;
|-&lt;br /&gt;
| 0x196002 || 3248 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x196202 || 3249 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A4A02 || 3365 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x235202 || 4521 || Invalid NCA Key index&lt;br /&gt;
|-&lt;br /&gt;
| 0x235E02 || 4527 || NCA-path used with the wrong titleID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x250E02 || 4743 || [[NAX0|Corrupted]] NAX0 header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x251002 || 4744 || Invalid [[NAX0]] magicnum.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE202 || 6001 || Invalid input&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE602 || 6003 || Path too long&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F5A02 || 6061 || Offset outside storage&lt;br /&gt;
|-&lt;br /&gt;
| 0x313802 || 6300 || Operation not supported&lt;br /&gt;
|-&lt;br /&gt;
| 0x320002 || 6400 || Permission denied&lt;br /&gt;
|-&lt;br /&gt;
| 0x326602 || 6451 || Missing titlekey(?) required to mount content&lt;br /&gt;
|-&lt;br /&gt;
| 0x3EA03 || 501 || Invalid handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x3EE03 || 503 || Invalid memory mirror&lt;br /&gt;
|-&lt;br /&gt;
| 0xA05 || 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 || 7 || TitleId not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x1805 || 12 || Invalid StorageId&lt;br /&gt;
|-&lt;br /&gt;
| 0xDC05 || 110 || Gamecard not inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x17C05 || 190 || Gamecard not initialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F405 || 250 || Sdcard not inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x20805 || 260 || Storage not mounted&lt;br /&gt;
|-&lt;br /&gt;
| 0x806 || 4 || Converted from error 0xD401.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1006 || 8 || Converted from error 0xE401.&lt;br /&gt;
|-&lt;br /&gt;
| 0x408 || 2 || Not initialized.&lt;br /&gt;
|-&lt;br /&gt;
| 0x608 || 3 || Invalid control StorageID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x808 || 4 || Storage not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA08 || 5 || Access denied.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE08 || 7 || Title is not registered.&lt;br /&gt;
|-&lt;br /&gt;
| 0x209 || 1 || Args too long.&lt;br /&gt;
|-&lt;br /&gt;
| 0x409 || 2 || Maximum processes loaded.&lt;br /&gt;
|-&lt;br /&gt;
| 0x609 || 3 || NPDM too big.&lt;br /&gt;
|-&lt;br /&gt;
| 0x19009 || || Invalid access control sizes in NPDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x809 || 4 || Invalid NPDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA09 || 5 || Invalid files.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE09 || 7 || Already registered.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1009 || 8 || Title not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1209 || 9 || Title-id in ACI0 doesn&#039;t match range in ACID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6609 || 51 || Invalid memory state/permission&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A09 || 53 || Invalid NRR&lt;br /&gt;
|-&lt;br /&gt;
| 0xA209 || 81 || Unaligned NRR address&lt;br /&gt;
|-&lt;br /&gt;
| 0xA409 || 82 || Bad NRR size&lt;br /&gt;
|-&lt;br /&gt;
| 0xAA09 || 85 || Bad NRR address&lt;br /&gt;
|-&lt;br /&gt;
| 0xAE09 || 87 || Bad initialization&lt;br /&gt;
|-&lt;br /&gt;
| 0xC809 || 100 || Unknown ACI0 descriptor&lt;br /&gt;
|-&lt;br /&gt;
| 0xCE09 || 103 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;KernelFlags&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xD009 || 104 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;SyscallMask&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xD409 || 106 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;MapIoOrNormalRange&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xD609 || 107 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;MapNormalPage&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xDE09 || 111 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;InterruptPair&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xE209 || 113 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;ApplicationType&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xE409 || 114 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;KernelReleaseVersion&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xE609 || 115 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;HandleTableSize&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xE809 || 116 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;DebugFlags&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A80A || 212 || Bad magic (expected &#039;SFCO&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x20B || 1 || Size too big to fit to marshal.&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A0B || 141 || Went past maximum during marshalling.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1900B || 200 || Session doesn&#039;t support domains.&lt;br /&gt;
|-&lt;br /&gt;
| 0x25A0B || 301 || Remote process is dead.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D60B || 491 || IPC Query 1 failed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20F || 1 || Pid not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x60F || 3 || Process has no pending events&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0F || 5 || Application already running&lt;br /&gt;
|-&lt;br /&gt;
| 0x410 || 2 || Title-id not found&lt;br /&gt;
|-&lt;br /&gt;
| 0xF010 || 120 || Gamecard sysupdate not required&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F610 || 251 || Unexpected StorageId&lt;br /&gt;
|-&lt;br /&gt;
| 0x415 || 2 || Not initialized.&lt;br /&gt;
|-&lt;br /&gt;
| 0x615 || 3 || Max sessions&lt;br /&gt;
|-&lt;br /&gt;
| 0xC15 || 6 || Invalid name (all zeroes)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1015 || 8 || Permission denied&lt;br /&gt;
|-&lt;br /&gt;
| 0x416 || 2 || Address space is full&lt;br /&gt;
|-&lt;br /&gt;
| 0x616 || 3 || NRO already loaded&lt;br /&gt;
|-&lt;br /&gt;
| 0x816 || 4 || Invalid NRO header values&lt;br /&gt;
|-&lt;br /&gt;
| 0xC16 || 6 || Bad NRR magic&lt;br /&gt;
|-&lt;br /&gt;
| 0x1016 || 8 || Reached max NRR count&lt;br /&gt;
|-&lt;br /&gt;
| 0x1216 || 9 || Unable to verify NRO hash or NRR signature&lt;br /&gt;
|-&lt;br /&gt;
| 0x80216 || 1025 || Address not page-aligned&lt;br /&gt;
|-&lt;br /&gt;
| 0x80416 || 1026 || Incorrect NRO size&lt;br /&gt;
|-&lt;br /&gt;
| 0x80816 || 1028 || NRO not loaded&lt;br /&gt;
|-&lt;br /&gt;
| 0x80A16 || 1029 || NRR not loaded&lt;br /&gt;
|-&lt;br /&gt;
| 0x80C16 || 1030 || Already initialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x80E16 || 1031 || Not initialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x41A || 2 || Argument is invalid&lt;br /&gt;
|-&lt;br /&gt;
| 0xC81A || 100 || Incorrect buffer size&lt;br /&gt;
|-&lt;br /&gt;
| 0xCA1A || 101 || Unknown TZ error&lt;br /&gt;
|-&lt;br /&gt;
| 0xD01A || 104 || All AES engines busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xD21A || 105 || Invalid AES engine-id&lt;br /&gt;
|-&lt;br /&gt;
| 0x272 || 1 || Generic error&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC74 || 102 || Time not set&lt;br /&gt;
|-&lt;br /&gt;
| 0x287C || 20 || Argument is NULL&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C7C || 22 || Argument is invalid&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C7C || 30 || Bad input buffer size&lt;br /&gt;
|-&lt;br /&gt;
| 0x407C || 32 || Invalid input buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x668C || 51 || USB data-transfer in progress&lt;br /&gt;
|-&lt;br /&gt;
| 0x299 || 1 || Invalid audio device&lt;br /&gt;
|-&lt;br /&gt;
| 0x499 || 2 || Invalid buffer address&lt;br /&gt;
|-&lt;br /&gt;
| 0x699 || 3 || Invalid sample rate&lt;br /&gt;
|-&lt;br /&gt;
| 0x1499 || 10 || Invalid channel count&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0899 || 1540 || Audio output was already started&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C9D || 30 || Address is NULL&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E9D || 31 || PID is NULL&lt;br /&gt;
|-&lt;br /&gt;
| 0x549D || 42 || Already bound&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC9D || 102 || Invalid PID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3CF089 || 7800 || Unknown/invalid libcurl error.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E8289-0x3F4089 || 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;
| 0x35B || 1 || Failed to init SM.&lt;br /&gt;
|-&lt;br /&gt;
| 0x55B || 2 || Failed to init FS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95B || 4 || Failed to read NRO header.&lt;br /&gt;
|-&lt;br /&gt;
| 0xB5B || 5 || Invalid NRO magic.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD5B || 6 || Invalid NRO segments.&lt;br /&gt;
|-&lt;br /&gt;
| 0xF5B || 7 || Failed to read NRO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x135B || 9 || Failed to allocate heap.&lt;br /&gt;
|-&lt;br /&gt;
| 0x275B || 19 || Failed to map code memory (.text).&lt;br /&gt;
|-&lt;br /&gt;
| 0x295B || 20 || Failed to map code memory (.rodata).&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B5B || 21 || Failed to map code memory (.data+.bss).&lt;br /&gt;
|-&lt;br /&gt;
| 0x315B || 24 || Failed to unmap code memory (.text).&lt;br /&gt;
|-&lt;br /&gt;
| 0x335B || 25 || Failed to unmap code memory (.rodata).&lt;br /&gt;
|-&lt;br /&gt;
| 0x355B || 26 || Failed to unmap code memory (.data+.bss).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FS Error Codes ==&lt;br /&gt;
&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;
! Error Code || Description || Message&lt;br /&gt;
|-&lt;br /&gt;
| 0x7802 || 60 || Error: Specified mount name already exists.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD401 || 106 || Error: Passed buffer is not usable for fs library.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D202 || 1001 || Error: Specified partition is not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D402 || 1002 || Error: Specified target is not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0xFA002 - 0x138602 || 2000 - 2499 || Error: Failed to access SD card.&lt;br /&gt;
|-&lt;br /&gt;
| 0x136802 - 0x176E02 || 2500 - 2999 || Error: Failed to access game card.&lt;br /&gt;
|-&lt;br /&gt;
| 0x177202 || 3001 || Error: Specified operation is not implemented.&lt;br /&gt;
|-&lt;br /&gt;
| 0x177A02 || 3005 || Error: Specified value is out of range.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B5802 - 0x1F3E02 || 3500 - 3999 || Error: Failed to access MMC.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F4202 - 0x219602 || 4001 - 4299 || Error: ROM is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x219A02 - 0x232602 || 4301 - 4499 || Error: Save data is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x232A02 - 0x23EE02 || 4501 - 4599 || Error: NCA is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23F202 - 0x243E02 || 4601 - 4639 || Error: Integrity verification failed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x244202 - 0x246602 || 4641 - 4659 || Error: Partition FS is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x246A02 - 0x248E02 || 4661 - 4679 || Error: Built-in-storage is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x249202 - 0x24B602 || 4681 - 4699 || Error: FAT FS is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24BA02 - 0x24DE02 || 4701 - 4719 || Error: HOST FS is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F4002 - 0x270E02 || 4000, 4300, 4500, 4600, 4640, 4660, 4680, 4700, 4720-4999 || Error: Data is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x271002 - 0x2EDE02 || 5000-5999 || Error: Unexpected failure occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE402 - 0x2F1A02 || 6002-6029 || Error: Invalid path was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F5A02 || 6061 || Error: Invalid offset was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F5C02 || 6062 || Error: Invalid size was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F5E02 || 6063 || Error: Null pointer argument was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE002 || 6000 || Error: Precondition violation.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE202 - 0x306E02 || 6001-6199 || Error: Invalid argument was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x307202 || 6201 || Error: OpenMode_AllowAppend is required for implicit extension of file size by WriteFile().&lt;br /&gt;
|-&lt;br /&gt;
| 0x307002 - 0x313602 || 6200, 6202 - 6299 || Error: Invalid operation for the open mode.&lt;br /&gt;
|-&lt;br /&gt;
| 0x313802 - 0x31FE02 || 6300-6399 || Error: Unsupported operation.&lt;br /&gt;
|-&lt;br /&gt;
| 0x320002 - 0x32C602 || 6400-6499 || Error: Permission denied.&lt;br /&gt;
|-&lt;br /&gt;
| 0x346402 || 6706 || Error: Enough journal space is not left.&lt;br /&gt;
|-&lt;br /&gt;
| 0x346A02 || 6709 || Error: The open count of files and directories reached the limitation.&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 affect 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;
{| 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;
Normal error-codes displayed by the system also use the same format as fatal-errors.&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=NPDM&amp;diff=3820</id>
		<title>NPDM</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=NPDM&amp;diff=3820"/>
		<updated>2018-02-21T05:06:26Z</updated>

		<summary type="html">&lt;p&gt;OgniK: /* META */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the Switch equivalent of 3DS [https://www.3dbrew.org/wiki/NCCH/Extended_Header exheader]. This is the file with extension &amp;quot;.npdm&amp;quot; in {Switch ExeFS}. The size of this file varies.&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x80&lt;br /&gt;
| META&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| &amp;lt;Varies&amp;gt;&lt;br /&gt;
| ACID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;See META&amp;gt;&lt;br /&gt;
| &amp;lt;See META&amp;gt;&lt;br /&gt;
| ACI0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= META =&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x4&lt;br /&gt;
| Magic &amp;quot;META&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 1&lt;br /&gt;
| Needs to be &amp;lt;= 0xF&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| 1&lt;br /&gt;
| MainThreadPrio&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| 1&lt;br /&gt;
| DefaultCpuId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| ProcessCategory (0: regular title, 1: kernel built-in). Should be 0 here.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| MainStackSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| ?&lt;br /&gt;
| Title name&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#ACI0]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#ACI0]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x78&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#ACID]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#ACID]] size&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ACID =&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0x100&lt;br /&gt;
| RSA-2048 signature, seems to verify the data starting at 0x100 with the size field from 0x204.&lt;br /&gt;
|-&lt;br /&gt;
| 0x100&lt;br /&gt;
| 0x100&lt;br /&gt;
| RSA-2048 public key, seems to be used for the second [[NCA_Format|NCA]] signature.&lt;br /&gt;
|-&lt;br /&gt;
| 0x200&lt;br /&gt;
| 0x4&lt;br /&gt;
| Magic &amp;quot;ACID&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x204&lt;br /&gt;
| 0x4&lt;br /&gt;
| s32 Size field used with the above signature(?).&lt;br /&gt;
|-&lt;br /&gt;
| 0x208&lt;br /&gt;
| 0x4&lt;br /&gt;
| Zeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x20C&lt;br /&gt;
| 0x4&lt;br /&gt;
| Retail flag. Must be 1 on retail, on devunit 0 is also allowed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x210&lt;br /&gt;
| 0x8&lt;br /&gt;
| TitleIdRange_Min&lt;br /&gt;
|-&lt;br /&gt;
| 0x218&lt;br /&gt;
| 0x8&lt;br /&gt;
| TitleIdRange_Max&lt;br /&gt;
|-&lt;br /&gt;
| 0x220&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#FS Access Control]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x224&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#FS Access Control]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x228&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Service Access Control]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x22C&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Service Access Control]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x230&lt;br /&gt;
| 4&lt;br /&gt;
| [[#Kernel Access Control]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x234&lt;br /&gt;
| 4&lt;br /&gt;
| [[#Kernel Access Control]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x238&lt;br /&gt;
| 0x8&lt;br /&gt;
| Padding&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ACI0 =&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x4&lt;br /&gt;
| Magic &amp;quot;ACI0&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0xC&lt;br /&gt;
| Zeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x8&lt;br /&gt;
| Title id&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x8&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#FS Access Header]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#FS Access Header]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Service Access Control]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 0x4&lt;br /&gt;
| [[#Service Access Control]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| [[#Kernel Access Control]] offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| [[#Kernel Access Control]] size&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 0x8&lt;br /&gt;
| Padding&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= FS Access Header =&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Version? Always 1. Must be non-zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x3&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x8&lt;br /&gt;
| Permissions bitmask&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0x4&lt;br /&gt;
| Usually 0x1C&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x4&lt;br /&gt;
| Usually 0x0&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x4&lt;br /&gt;
| Usually 0x1C&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x4&lt;br /&gt;
| Usually 0x0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= FS Access Control =&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x1&lt;br /&gt;
| Version? Always 1. Must be non-zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x3&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x8&lt;br /&gt;
| Permissions bitmask&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0x20&lt;br /&gt;
| Usually all zeroes for applications&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Filesystem_services#Permissions|Permissions]] bitmask:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| MountContent* is accessible when set.&lt;br /&gt;
|-&lt;br /&gt;
| 34&lt;br /&gt;
| Enables access to [[Filesystem_services|Bis]] partitionID 27 and 28?&lt;br /&gt;
|-&lt;br /&gt;
| 63&lt;br /&gt;
| Enables access to everything: all [[Filesystem_services#Permissions|permission-types]] which check a bitmask have this bit set.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For bit62 in permissions, see [[SPL_services#GetConfig|here]].&lt;br /&gt;
&lt;br /&gt;
Web-applets permissions:&lt;br /&gt;
* &amp;quot;LibAppletWeb&amp;quot; and &amp;quot;LibAppletOff&amp;quot; have same access control: bit0 and bit3 set, and bit62 set.&lt;br /&gt;
* Rest of the web-applets: Same as above except bit0 isn&#039;t set.&lt;br /&gt;
&lt;br /&gt;
= Service Access Control =&lt;br /&gt;
This is a list of [[Services_API|service]]-name strings which the title has access to, with the following structure:&lt;br /&gt;
  +0: control_byte&lt;br /&gt;
  +1: {service-name without nul-terminator}&lt;br /&gt;
&lt;br /&gt;
Bitmask 0x0F in control_byte is the {length of the service-name without nul-terminator} - 1.&lt;br /&gt;
&lt;br /&gt;
Bitmask 0x80 in control_byte means service is allowed to be registered.&lt;br /&gt;
&lt;br /&gt;
The service string can contain a wildcard &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character.&lt;br /&gt;
&lt;br /&gt;
= Kernel Access Control =&lt;br /&gt;
On Switch, descriptors are identified by pattern 01..11 in low bits.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pattern of lower bits&lt;br /&gt;
! Lowest clear bitmask/bit&lt;br /&gt;
! Type&lt;br /&gt;
! Fields&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxxxxxxxxxxxx0111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit3&lt;br /&gt;
| KernelFlags&lt;br /&gt;
| Bit31-24: Highest allowed cpu id, bit23-16: Lowest allowed cpu id, bit15-10: Highest allowed thread prio, bit9-4: Lowest allowed thread prio&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxxxxxxxxxxx01111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit4&lt;br /&gt;
| SyscallMask&lt;br /&gt;
| Bits 29-31: Syscall mask table index; Bits 5-28: Mask&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxxxxxxxxx0111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit6&lt;br /&gt;
| MapIoOrNormalRange&lt;br /&gt;
| Bits 7-30: Alternating start page and number of pages, bit31: Alternating read-only flag then MemoryAttribute 0x2001/0x42002 selector flag&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxxxxxxxx01111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit7&lt;br /&gt;
| MapNormalPage (RW)&lt;br /&gt;
| Bits 8-31: Page&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxxxx011111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit11&lt;br /&gt;
| InterruptPair&lt;br /&gt;
| Bits 12-21: Irq0, bits 20-31: Irq1, 0x3FF means empty.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxx01111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit13&lt;br /&gt;
| ApplicationType&lt;br /&gt;
| Bit16-14: ApplicationType (0=sysmodule, 1=application, 2=applet), bit16 ignored. Parsed by [[Process Manager services]]. Defaults to 0 if descriptor doesn&#039;t exist. Can only run 1 application at a time.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bx011111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit14&lt;br /&gt;
| KernelReleaseVersion&lt;br /&gt;
| Bits 15-X: Version. The raw descriptor is compared with 0x80000, when less than an error is returned. This is equivalent to comparing the bits starting at bit15 with 0x10. This enforces a minimum required version, not a maximum.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0b0111111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit15&lt;br /&gt;
| HandleTableSize&lt;br /&gt;
| Bit25-16: Number of handles the table shall fit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0b1111111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bit16&lt;br /&gt;
| DebugFlags&lt;br /&gt;
| Bit17: can be debugged, bit18: can debug others&lt;br /&gt;
|-&lt;br /&gt;
| All ones&lt;br /&gt;
| &lt;br /&gt;
| Ignored&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Mapping restrictions ==&lt;br /&gt;
The physaddr range 0x80060000-0x2000000000 is not allowed to be mapped as IO.&lt;br /&gt;
The physaddr range 0x80000000-0x2000000000 is not allowed to be mapped as Normal.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The range for IO was changed into 0x80060000-0x81D3FFFF.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] A blacklist was added for IO and Normal mappings:&lt;br /&gt;
* 0x50040000-0x50060000 (ARM, Interrupt Controller)&lt;br /&gt;
* 0x6000F000 (Exception Vectors)&lt;br /&gt;
* 0x6001DC00-0x6001E000 (IPATCH)&lt;br /&gt;
* 0x7000E000 (RTC/PMC)&lt;br /&gt;
* 0x70019000 (MC)&lt;br /&gt;
* 0x7001C000 (MC0)&lt;br /&gt;
* 0x7001D000 (MC1)&lt;br /&gt;
&lt;br /&gt;
== Kernel versions ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Firmware || Kernel Version || Minimum Allowed&lt;br /&gt;
|-&lt;br /&gt;
| 1.0.0 || 5.0.0 || 3.0.0&lt;br /&gt;
|-&lt;br /&gt;
| 2.0.0 || 6.1.0 || 3.0.0&lt;br /&gt;
|-&lt;br /&gt;
| 3.0.0 || 7.4.0 || 3.0.0&lt;br /&gt;
|-&lt;br /&gt;
| 3.0.2 || 7.4.0 || 3.0.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bit31-19: Major version&lt;br /&gt;
Bit18-15: Minor version&lt;br /&gt;
Bit14-0: Zeroes&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=GPU&amp;diff=3700</id>
		<title>GPU</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=GPU&amp;diff=3700"/>
		<updated>2018-02-10T04:28:57Z</updated>

		<summary type="html">&lt;p&gt;OgniK: educated guesses for draw gpfifo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mapping Memory ==&lt;br /&gt;
&lt;br /&gt;
First, to map a memory region on the GPU Address Space, caching needs to be disabled by using [[SVC#svcSetMemoryAttribute|svcSetMemoryAttribute]]. The Address passed is the Virtual Address of the region that will be mapped, the size is the region size, and State0/1 are both set to 8 to disable caching of the memory region. This is done to ensure that the GPU can actually &amp;quot;see&amp;quot; the data written there, and it doesn&#039;t get stuck on some cache.&lt;br /&gt;
&lt;br /&gt;
Then, [[NV_services#NVMAP_IOC_CREATE|NVMAP_IOC_CREATE]] is used to create a nvmap object with the desired size. After, [[NV_services#NVMAP_IOC_ALLOC|NVMAP_IOC_ALLOC]] is used to allocate the memory on the GPU Address Space, and map data on the process Address Space into the GPU Address Space, by passing the Virtual Address as the input addr parameter, and also the Handle returned from [[NV_services#NVMAP_IOC_CREATE|NVMAP_IOC_CREATE]]. Lastly, the actual mapping is done by using [[NV_services#NVGPU_AS_IOCTL_MAP_BUFFER_EX|NVGPU_AS_IOCTL_MAP_BUFFER_EX]], and the GPU Virtual Address is returned on the offset parameter. It&#039;s also possible to manually set the offset where the mapping should be made on the GPU Address Space, by passing the address on the &amp;quot;offset&amp;quot; parameter, and setting the bit 0 of the flags parameter to 1. However, for this to work, the desired GPU Virtual Address needs to be previously reserved using [[NV_services#NVGPU_AS_IOCTL_ALLOC_SPACE|NVGPU_AS_IOCTL_ALLOC_SPACE]].&lt;br /&gt;
&lt;br /&gt;
The above process is used to map all data that will be used by the GPU, like Textures, Command Lists (a.k.a. Push Buffers), Vertex/Index buffers and Shaders. They usually have their own mapping, but Command Lists can share the same mapping.&lt;br /&gt;
&lt;br /&gt;
== FIFO Commands ==&lt;br /&gt;
&lt;br /&gt;
The GPU implements a variation of Tegra&#039;s push buffer format for it&#039;s PFIFO engine. PFIFO is a special engine responsible for receiving user command lists and routing them to the appropriate engines (2D, 3D, DMA).&lt;br /&gt;
&lt;br /&gt;
Commands are submitted to the GPU&#039;s PFIFO engine through [[NV_services#NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO|NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO]].&lt;br /&gt;
&lt;br /&gt;
This ioctl takes an array of gpfifo entries where each entry points to a FIFO command list. This list is composed of alternating 32-bit words containing FIFO commands and their respective arguments.&lt;br /&gt;
&lt;br /&gt;
=== Command Structure ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Bits&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
|12-0&lt;br /&gt;
|Method&lt;br /&gt;
|-&lt;br /&gt;
|15-13&lt;br /&gt;
|Subchannel&lt;br /&gt;
|-&lt;br /&gt;
|28-16&lt;br /&gt;
|Argument count (in 32-bits Words) or inline data (see below)&lt;br /&gt;
|-&lt;br /&gt;
|31-29&lt;br /&gt;
|[[#Submission_mode|Submission mode]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: Methods are treated as 4-byte addressable locations, and hence their numbers are written down multiplied by 4.&lt;br /&gt;
&lt;br /&gt;
Note: The command&#039;s arguments, when present, follow the command word immediately.&lt;br /&gt;
&lt;br /&gt;
==== Submission mode ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Mode&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Offical name&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Increasing mode (old)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Increasing mode - Tells PFIFO to read as much arguments as specified by &#039;&#039;&#039;argument count&#039;&#039;&#039;, while automatically incrementing the &#039;&#039;&#039;method&#039;&#039;&#039; value. This means that each argument will be written to a different method location.&lt;br /&gt;
|INCR&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Non-increasing mode (old)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Non-increasing mode - Tells PFIFO to read as much arguments as specified by &#039;&#039;&#039;argument count&#039;&#039;&#039;. However, all arguments will be written to the same method location.&lt;br /&gt;
|NONINCR&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Inline mode - Tells PFIFO to read &#039;&#039;&#039;inline data&#039;&#039;&#039; from bits 28-16 of the command word, thus eliminating the need to pass additional words for the arguments.&lt;br /&gt;
|IMM&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Increase-once mode - Tells PFIFO to read as much arguments as specified by &#039;&#039;&#039;argument count&#039;&#039;&#039; and automatically increments the &#039;&#039;&#039;method&#039;&#039;&#039; value once only.&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command List ===&lt;br /&gt;
&lt;br /&gt;
All methods with values &amp;lt; 0x100 are special and executed by the PFIFO&#039;s DMA puller. The others are forwarded to the engine object currently bound to a given subchannel.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Command || Method || Subchannel || Arg Count || Mode || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001?000 || 0x0000 || Variable || 1 || 1 || [[#BindObject|BindObject]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000040 || 0x40 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA???0045 || 0x45 || 0 || Variable || 5 || SetGraphMacroCode&lt;br /&gt;
|-&lt;br /&gt;
| 0x20020047 || 0x47 || 0 || 2 || 1 || SetGraphMacroEntry&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0049 || 0x49 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20056080 || 0x80 || 3 || Variable || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20016085 || 0x85 || 3 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20026086 || 0x86 || 3 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20026088 || 0x88 || 3 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2004608C || 0x8C || 3 || Variable || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20016091 || 0x91 || 3 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20026092 || 0x92 || 3 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20026094 || 0x94 || 3 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800160B5 || 0xB5 || 3 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800000BA || 0xBA || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x601000BE || 0xBE || 0 || 16 || 3 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200100BF || 0xBF || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200180C0 || 0xC0 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200400C9 || 0xC9 || 0 || 4 || 1 || SetOuterTessellationLevels&lt;br /&gt;
|-&lt;br /&gt;
| 0x200200CD || 0xCD || 0 || 2 || 1 || SetInnerTessellationLevels&lt;br /&gt;
|-&lt;br /&gt;
| 0x200100DC || 0xDC || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?00DF || 0xDF || 0 || Variable || 4 || SetRasterizerDiscard?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20048100 || 0x100 || 4 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20028102 || 0x102 || 4 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20018104 || 0x104 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20018105 || 0x105 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20018106 || 0x106 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C0 || 0x1C0 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C2 || 0x1C2 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C3 || 0x1C3 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200281C4 || 0x1C4 || 4 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C5 || 0x1C5 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C6 || 0x1C6 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C7 || 0x1C7 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C8 || 0x1C8 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CA || 0x1CA || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CB || 0x1CB || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CC || 0x1CC || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CD || 0x1CD || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CF || 0x1CF || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800001D1 || 0x1D1 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200301F0 || 0x1F0 || 0 || 3 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800001F3 || 0x1F3 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200201F8 || 0x1F8 || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200401FA || 0x1FA || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20016223 || 0x223 || 3 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2004622C || 0x22C || 3 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20046230 || 0x230 || 3 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20046234 || 0x234 || 3 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200203?? || 0x3?? Variable || 0 || 2 || 1 || SetScissors?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20040360 || 0x360 || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010364 || 0x364 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0368 || 0x368 || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?036B || 0x36B || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?036C || 0x36C || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001036F || 0x36F || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000370 || 0x370 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000371 || 0x371 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000372 || 0x372 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8???0373 || 0x373 || 0 || Variable || 4 || SetPatchSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000374 || 0x374 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010376 || 0x376 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?03D5 || 0x3D5 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?03D6 || 0x3D6 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?03D7 || 0x3D7 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200103D9 || 0x3D9 || 0 || 1 || 1 || SetTiledCacheTileSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x80?003DE || 0x3DE || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800003E0 || 0x3E0 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200203E7 || 0x3E7 || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800003ED || 0x3ED || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800203EE || 0x3EE || 0 || 2 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200403EF || 0x3EF || 0 || 4 || 1 || SetSampleMask&lt;br /&gt;
|-&lt;br /&gt;
| 0x800003F5 || 0x3F5 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800103F6 || 0x3F6 || 0 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200503F8 || 0x3F8 || 0 || 5 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200203FD || 0x3FD || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2004040C || 0x40C || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200C0420 || 0x420 || 0 || 12 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000446 || 0x446 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000451 || 0x451 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0452 || 0x452 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20100458 || 0x458 || 0 || 16 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20040478 || 0x478 || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000047C || 0x47C || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000047E || 0x47E || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8001047F || 0x47F || 0 || 1 || 4 || ResolveDepthBuffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x2003048A || 0x48A || 0 || 3 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04B3 || 0x4B3 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800104B9 || 0x4B9 || 0 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04BA || 0x4BA || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800004BB || 0x4BB || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04C3 || 0x4C3 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200104C4 || 0x4C4 || 0 || 1 || 1 || SetAlphaRef&lt;br /&gt;
|-&lt;br /&gt;
| 0x200404C7 || 0x4C7 || 0 || 4 || 1 || SetBlendColor&lt;br /&gt;
|-&lt;br /&gt;
| 0x800004E0 || 0x4E0 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04E5 || 0x4E5 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04E6 || 0x4E6 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04E7 || 0x4E7 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200204EC || 0x4EC || 0 || 2 || 1 || SetLineWidth&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?050D || 0x50D || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000519 || 0x519 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000540 || 0x540 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010546 || 0x546 || 0 || 1 || 1 || SetPointSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001054C || 0x54C || 0 || 1 || 1 || ResetCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?054E || 0x54E || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20030554 || 0x554 || 0 || 3 || 1 || SetRenderEnableConditional&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0556 || 0x556 || 0 || Variable || 4 || SetRenderEnable?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001055B || 0x55B || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001056F || 0x56F || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000572 || 0x572 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0574 || 0x574 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000057F || 0x57F || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000580 || 0x580 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000591 || 0x591 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010592 || 0x592 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200205F2 || 0x5F2 || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?05F6 || 0x5F6 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001061F || 0x61F || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0620 || 0x620 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80010646 || 0x646 || 0 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0648 || 0x648 || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001064F || 0x64F || 0 || 1 || 1 || SetDepthClamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?066F || 0x66F || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x120020671 || 0x671 || 0 || 2 || 9 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010674 || 0x674 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000068B || 0x68B || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200406C0 || 0x6C0 || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010703 || 0x703 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200207?? || 0x7?? Variable || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80300830 || 0x830 || 0 || 48 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80400840 || 0x840 || 0 || 64 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80500850 || 0x850 || 0 || 80 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200308E0 || 0x8E0 || 0 || 3 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200308E3 || 0x8E3 || 0 || 3 || 1 || CB_POS(Const buffer position)&lt;br /&gt;
|-&lt;br /&gt;
| 0x200308E4 || 0x8E4 || 0 || 3 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??0904 || 0x904 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??090C || 0x90C || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??0914 || 0x914 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??091C || 0x91C || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??0924 || 0x924 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000D1E || 0xD1E || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0D28 || 0xD28 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010D29 || 0xD29 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010D34 || 0xD34 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0020E00 || 0xE00 || 0 || 2 || 5 || BeginTransformFeedback&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010E02 || 0xE02 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80020E04 || 0xE04 || 0 || 2 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010E06 || 0xE06 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0030E0A || 0xE0A || 0 || 3 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80050E0C || 0xE0C || 0 || 5 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0E0E || 0xE0E || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010E10 || 0xE10 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0040E12 || 0xE12 || 0 || 4 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010E1A || 0xE1A || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0040E1C || 0xE1C || 0 || 4 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x81900E1E || 0xE1E || 0 || 400 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000E20 || 0xE20 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000E24 || 0xE24 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0040E2C || 0xE2C || 0 || 4 || 5 || PushDebugGroup&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0020E2E || 0xE2E || 0 || 2 || 5 || PopDebugGroupId&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0030E30 || 0xE30 || 0 || 3 || 5 || DrawArrays&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E32 || 0xE32 || 0 || 5 || 5 || DrawArraysIndirect?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E34 || 0xE34 || 0 || 5 || 5 || DrawArraysInstanced?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E36 || 0xE36 || 0 || 5 || 5 || DrawElements&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0060E38 || 0xE38 || 0 || 6 || 5 || DrawElementsIndirect?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0060E3A || 0xE3A || 0 || 6 || 5 || DrawElementsInstanced?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E42 || 0xE42 || 0 || 5 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0060E44 || 0xE44 || 0 || 6 || 5 || ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: These still need to be heavily verified and &#039;&#039;could&#039;&#039; be wrong.&lt;br /&gt;
&lt;br /&gt;
=== BindObject ===&lt;br /&gt;
&lt;br /&gt;
In order to bind an engine object to a specific subchannel, method 0 (BindObject) must be used first. The target subchannel is specified in bits 15-13 of the command word.&lt;br /&gt;
&lt;br /&gt;
After the engine object is bound to the desired subchannel, setting it&#039;s value in bits 15-13 of any subsequent command word will make PFIFO forward the command to the target engine.&lt;br /&gt;
&lt;br /&gt;
This method only takes one argument, an [[#Engine_IDs|engine ID]].&lt;br /&gt;
&lt;br /&gt;
==== Engine IDs ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Engine&lt;br /&gt;
|-&lt;br /&gt;
|0x902D&lt;br /&gt;
|FERMI_TWOD_A (2D)&lt;br /&gt;
|-&lt;br /&gt;
|0xB197&lt;br /&gt;
|MAXWELL_B (3D)&lt;br /&gt;
|-&lt;br /&gt;
|0xB1C0&lt;br /&gt;
|MAXWELL_COMPUTE_B&lt;br /&gt;
|-&lt;br /&gt;
|0xA140&lt;br /&gt;
|KEPLER_INLINE_TO_MEMORY_B&lt;br /&gt;
|-&lt;br /&gt;
|0xB0B5&lt;br /&gt;
|MAXWELL_DMA_COPY_A (DMA)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Fences ===&lt;br /&gt;
&lt;br /&gt;
Command lists can contain fences to ensure that commands are executed on the correct order, and subsequent commands are only sent when the previously sent commands were already processed by the GPU. Fences uses the QUERY_* commands, and works like this:&lt;br /&gt;
&lt;br /&gt;
* First, QUERY_ADDRESS_HIGH and QUERY_ADDRESS_LOW commands are added to the Command List, with the High/Low 32 bits part of the 64-bits GPU Virtual Address where the fence is located. This GPU Virtual Address needs to be mapped to the process Virtual Address beforehand.&lt;br /&gt;
* Then, QUERY_SEQUENCE is added with a sequential number. This number is basically a incrementing counter, so the first Command List can have QUERY_SEQUENCE = 1, the next one QUERY_SEQUENCE = 2, 3, 4... and so on.&lt;br /&gt;
* Finally, QUERY_GET is added and contains the mode and other unknown data.&lt;br /&gt;
&lt;br /&gt;
The above commands are added using the [[#Submission_mode|increasing mode]], since the Ids for all those 4 registers are sequential.&lt;br /&gt;
&lt;br /&gt;
==== QUERY_GET Structure ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Bits&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
|1-0&lt;br /&gt;
|Mode&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Fence&lt;br /&gt;
|-&lt;br /&gt;
|15-12&lt;br /&gt;
|Unit &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== QUERY_GET Mode ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Value&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Mode&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Write&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Sync&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Write ? &lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Write ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TODO: Move this to a separate page with all GPU Commands with descriptions. Also figure out what the other values mean.&lt;br /&gt;
&lt;br /&gt;
Some of the other fields are still unknown/unobserved.&lt;br /&gt;
&lt;br /&gt;
Official games will set Mode to 0, Fence to 1 and Unit to 0xF. The QUERY_SEQUENCE value is then written by the GPU to the address pointed to by QUERY_ADDRESS.&lt;br /&gt;
On the CPU side, the game code should wait until the value at the address pointed to by QUERY_ADDRESS is &amp;gt;= to the last written SEQUENCE value. Official code waits for this condition to be true on a loop, and won&#039;t send any further commands before that.&lt;br /&gt;
&lt;br /&gt;
== Vertex Data Submission ==&lt;br /&gt;
&lt;br /&gt;
Note: This is a observation on how the game Puyo Puyo Tetris sends textured squares to the GPU.&lt;br /&gt;
&lt;br /&gt;
# VERTEX_ATTRIB_FORMAT (0-15) are set (only the first 3 are really used, the rest are set float, with Size = 1 and offset at 0).&lt;br /&gt;
# VERTEX_ARRAY_FETCH (0) is set with the lower 12 bits set to 0x1c (Stride) and bit 12 to 1 (Enabled).&lt;br /&gt;
# VERTEX_ARRAY_START_HIGH/LOW (0) are set to the GPU Virtual Address where the Vertex Data is located.&lt;br /&gt;
# VERTEX_ARRAY_LIMIT_HIGH/LOW (0) are set to the GPU Virtual Address where the Vertex Data is located, plus the Vertex Data size in bytes minus 1.&lt;br /&gt;
# VERTEX_BEGIN_GL is used with the primitive type set to TRIANGLE_STRIP.&lt;br /&gt;
# VERTEX_BUFFER_FIRST with value 0 (indicating the index of the first primitive to render?).&lt;br /&gt;
# VERTEX_BUFFER_COUNT is set to 4, because the Vertex Buffer with the square has 4 vertices.&lt;br /&gt;
# VERTEX_END_GL is used with value 0 (currently unknown what this value means).&lt;br /&gt;
&lt;br /&gt;
== Texture View ==&lt;br /&gt;
&lt;br /&gt;
Texture information such as address, format and size is sent to the GPU through a structure know as Texture View (a.k.a. Texture Image Control, or TIC). Each texture that the game uses needs a separate TIC, and those TICs are written to a table, one after the other. Each [[#TIC_Structure|TIC entry]] has 0x20 bytes, and is composed of 8 32-bits words where the texture information is packed.&lt;br /&gt;
&lt;br /&gt;
The index of the TIC entries that should be used by the shader is sent to the GPU with the CB_POS/CB_DATA (0) methods. Games usually follows the following steps to write the TIC entry indexes:&lt;br /&gt;
&lt;br /&gt;
* CB_ADDRESS_HIGH/LOW method is used to set the GPU Virtual Address of the Const Buffer.&lt;br /&gt;
* CB_POS is used to set the write offset of the Const Buffer to 0x20 + n * 4, where &#039;&#039;n&#039;&#039; is the is the index of the active texture that will be used by the shader (?).&lt;br /&gt;
* CB_DATA (0) method is used to write the value into the Const Buffer. The value is a word where the lower 20 bits is the TIC index.&lt;br /&gt;
&lt;br /&gt;
The address of a given TIC entry can be calculates as:&lt;br /&gt;
&lt;br /&gt;
 tic_entry_address = tic_base_address + tic_index * 0x20&lt;br /&gt;
&lt;br /&gt;
Where &#039;&#039;tic_base_address&#039;&#039; is the address written to TIC_ADDRESS_HIGH/LOW (methods 0x1574 and 0x1578), &#039;&#039;tic_index&#039;&#039; is the lower 20 bits of the word written into the Const Buffer with CB_DATA (0), and 0x20 is the size of each TIC entry in bytes.&lt;br /&gt;
&lt;br /&gt;
Note: More research still needs to be done on the Const Buffer and how it is used by the shader.&lt;br /&gt;
&lt;br /&gt;
=== TIC Structure ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Word || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 6-0 || [[GPU_Texture_Formats#Texture_Formats|Texture Format]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 9-7 || [[#Channel_Data_Type|R Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12-10 || [[#Channel_Data_Type|G Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 15-13 || [[#Channel_Data_Type|B Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 18-16 || [[#Channel_Data_Type|A Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 31-0 || Lower 32-bits of the Texture GPU Virtual Address&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 15-0 || Higher 16-bits of the Texture GPU Virtual Address&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 15-0 || Texture Width minus 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 15-0 || Texture Height minus 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Channel Data Type ====&lt;br /&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;
| 1 || SNORM&lt;br /&gt;
|-&lt;br /&gt;
| 2 || UNORM&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SINT&lt;br /&gt;
|-&lt;br /&gt;
| 4 || UINT&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SNORM_FORCE_FP16&lt;br /&gt;
|-&lt;br /&gt;
| 6 || UNORM_FORCE_FP16&lt;br /&gt;
|-&lt;br /&gt;
| 7 || FLOAT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
FIFO engine overview:&lt;br /&gt;
[https://envytools.readthedocs.io/en/latest/hw/fifo/intro.html]&lt;br /&gt;
&lt;br /&gt;
Method values from the Fermi family GPU (a bit older than the Tegra X1, but values seems to be mostly the same):&lt;br /&gt;
[https://github.com/envytools/envytools/blob/master/rnndb/graph/gf100_3d.xml]&lt;br /&gt;
&lt;br /&gt;
TIC structure used on a Maxwell GPU:&lt;br /&gt;
[https://github.com/envytools/envytools/blob/master/rnndb/graph/gm200_texture.xml]&lt;br /&gt;
&lt;br /&gt;
Values for some types used on the above XML:&lt;br /&gt;
[https://github.com/envytools/envytools/blob/master/rnndb/graph/nv_3ddefs.xml]&lt;br /&gt;
&lt;br /&gt;
Command word packing code used on Mesa3d:&lt;br /&gt;
[https://cgit.freedesktop.org/mesa/mesa/tree/src/gallium/drivers/nouveau/nvc0/nvc0_winsys.h]&lt;br /&gt;
&lt;br /&gt;
TIC entry pack/write code used on Mesa3d:&lt;br /&gt;
[https://cgit.freedesktop.org/mesa/mesa/tree/src/gallium/drivers/nouveau/nvc0/nvc0_tex.c#n65]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=GPU&amp;diff=3699</id>
		<title>GPU</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=GPU&amp;diff=3699"/>
		<updated>2018-02-10T04:23:40Z</updated>

		<summary type="html">&lt;p&gt;OgniK: gpu command list sorted by method&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mapping Memory ==&lt;br /&gt;
&lt;br /&gt;
First, to map a memory region on the GPU Address Space, caching needs to be disabled by using [[SVC#svcSetMemoryAttribute|svcSetMemoryAttribute]]. The Address passed is the Virtual Address of the region that will be mapped, the size is the region size, and State0/1 are both set to 8 to disable caching of the memory region. This is done to ensure that the GPU can actually &amp;quot;see&amp;quot; the data written there, and it doesn&#039;t get stuck on some cache.&lt;br /&gt;
&lt;br /&gt;
Then, [[NV_services#NVMAP_IOC_CREATE|NVMAP_IOC_CREATE]] is used to create a nvmap object with the desired size. After, [[NV_services#NVMAP_IOC_ALLOC|NVMAP_IOC_ALLOC]] is used to allocate the memory on the GPU Address Space, and map data on the process Address Space into the GPU Address Space, by passing the Virtual Address as the input addr parameter, and also the Handle returned from [[NV_services#NVMAP_IOC_CREATE|NVMAP_IOC_CREATE]]. Lastly, the actual mapping is done by using [[NV_services#NVGPU_AS_IOCTL_MAP_BUFFER_EX|NVGPU_AS_IOCTL_MAP_BUFFER_EX]], and the GPU Virtual Address is returned on the offset parameter. It&#039;s also possible to manually set the offset where the mapping should be made on the GPU Address Space, by passing the address on the &amp;quot;offset&amp;quot; parameter, and setting the bit 0 of the flags parameter to 1. However, for this to work, the desired GPU Virtual Address needs to be previously reserved using [[NV_services#NVGPU_AS_IOCTL_ALLOC_SPACE|NVGPU_AS_IOCTL_ALLOC_SPACE]].&lt;br /&gt;
&lt;br /&gt;
The above process is used to map all data that will be used by the GPU, like Textures, Command Lists (a.k.a. Push Buffers), Vertex/Index buffers and Shaders. They usually have their own mapping, but Command Lists can share the same mapping.&lt;br /&gt;
&lt;br /&gt;
== FIFO Commands ==&lt;br /&gt;
&lt;br /&gt;
The GPU implements a variation of Tegra&#039;s push buffer format for it&#039;s PFIFO engine. PFIFO is a special engine responsible for receiving user command lists and routing them to the appropriate engines (2D, 3D, DMA).&lt;br /&gt;
&lt;br /&gt;
Commands are submitted to the GPU&#039;s PFIFO engine through [[NV_services#NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO|NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO]].&lt;br /&gt;
&lt;br /&gt;
This ioctl takes an array of gpfifo entries where each entry points to a FIFO command list. This list is composed of alternating 32-bit words containing FIFO commands and their respective arguments.&lt;br /&gt;
&lt;br /&gt;
=== Command Structure ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Bits&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
|12-0&lt;br /&gt;
|Method&lt;br /&gt;
|-&lt;br /&gt;
|15-13&lt;br /&gt;
|Subchannel&lt;br /&gt;
|-&lt;br /&gt;
|28-16&lt;br /&gt;
|Argument count (in 32-bits Words) or inline data (see below)&lt;br /&gt;
|-&lt;br /&gt;
|31-29&lt;br /&gt;
|[[#Submission_mode|Submission mode]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: Methods are treated as 4-byte addressable locations, and hence their numbers are written down multiplied by 4.&lt;br /&gt;
&lt;br /&gt;
Note: The command&#039;s arguments, when present, follow the command word immediately.&lt;br /&gt;
&lt;br /&gt;
==== Submission mode ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Mode&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Offical name&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Increasing mode (old)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Increasing mode - Tells PFIFO to read as much arguments as specified by &#039;&#039;&#039;argument count&#039;&#039;&#039;, while automatically incrementing the &#039;&#039;&#039;method&#039;&#039;&#039; value. This means that each argument will be written to a different method location.&lt;br /&gt;
|INCR&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Non-increasing mode (old)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Non-increasing mode - Tells PFIFO to read as much arguments as specified by &#039;&#039;&#039;argument count&#039;&#039;&#039;. However, all arguments will be written to the same method location.&lt;br /&gt;
|NONINCR&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Inline mode - Tells PFIFO to read &#039;&#039;&#039;inline data&#039;&#039;&#039; from bits 28-16 of the command word, thus eliminating the need to pass additional words for the arguments.&lt;br /&gt;
|IMM&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Increase-once mode - Tells PFIFO to read as much arguments as specified by &#039;&#039;&#039;argument count&#039;&#039;&#039; and automatically increments the &#039;&#039;&#039;method&#039;&#039;&#039; value once only.&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command List ===&lt;br /&gt;
&lt;br /&gt;
All methods with values &amp;lt; 0x100 are special and executed by the PFIFO&#039;s DMA puller. The others are forwarded to the engine object currently bound to a given subchannel.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Command || Method || Subchannel || Arg Count || Mode || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001?000 || 0x0000 || Variable || 1 || 1 || [[#BindObject|BindObject]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000040 || 0x40 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA???0045 || 0x45 || 0 || Variable || 5 || SetGraphMacroCode&lt;br /&gt;
|-&lt;br /&gt;
| 0x20020047 || 0x47 || 0 || 2 || 1 || SetGraphMacroEntry&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0049 || 0x49 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20056080 || 0x80 || 3 || Variable || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20016085 || 0x85 || 3 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20026086 || 0x86 || 3 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20026088 || 0x88 || 3 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2004608C || 0x8C || 3 || Variable || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20016091 || 0x91 || 3 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20026092 || 0x92 || 3 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20026094 || 0x94 || 3 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800160B5 || 0xB5 || 3 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800000BA || 0xBA || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x601000BE || 0xBE || 0 || 16 || 3 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200100BF || 0xBF || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200180C0 || 0xC0 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200400C9 || 0xC9 || 0 || 4 || 1 || SetOuterTessellationLevels&lt;br /&gt;
|-&lt;br /&gt;
| 0x200200CD || 0xCD || 0 || 2 || 1 || SetInnerTessellationLevels&lt;br /&gt;
|-&lt;br /&gt;
| 0x200100DC || 0xDC || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?00DF || 0xDF || 0 || Variable || 4 || SetRasterizerDiscard?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20048100 || 0x100 || 4 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20028102 || 0x102 || 4 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20018104 || 0x104 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20018105 || 0x105 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20018106 || 0x106 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C0 || 0x1C0 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C2 || 0x1C2 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C3 || 0x1C3 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200281C4 || 0x1C4 || 4 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C5 || 0x1C5 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C6 || 0x1C6 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C7 || 0x1C7 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C8 || 0x1C8 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CA || 0x1CA || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CB || 0x1CB || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CC || 0x1CC || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CD || 0x1CD || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CF || 0x1CF || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800001D1 || 0x1D1 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200301F0 || 0x1F0 || 0 || 3 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800001F3 || 0x1F3 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200201F8 || 0x1F8 || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200401FA || 0x1FA || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20016223 || 0x223 || 3 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2004622C || 0x22C || 3 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20046230 || 0x230 || 3 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20046234 || 0x234 || 3 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200203?? || 0x3?? Variable || 0 || 2 || 1 || SetScissors?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20040360 || 0x360 || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010364 || 0x364 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0368 || 0x368 || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?036B || 0x36B || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?036C || 0x36C || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001036F || 0x36F || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000370 || 0x370 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000371 || 0x371 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000372 || 0x372 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8???0373 || 0x373 || 0 || Variable || 4 || SetPatchSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000374 || 0x374 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010376 || 0x376 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?03D5 || 0x3D5 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?03D6 || 0x3D6 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?03D7 || 0x3D7 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200103D9 || 0x3D9 || 0 || 1 || 1 || SetTiledCacheTileSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x80?003DE || 0x3DE || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800003E0 || 0x3E0 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200203E7 || 0x3E7 || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800003ED || 0x3ED || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800203EE || 0x3EE || 0 || 2 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200403EF || 0x3EF || 0 || 4 || 1 || SetSampleMask&lt;br /&gt;
|-&lt;br /&gt;
| 0x800003F5 || 0x3F5 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800103F6 || 0x3F6 || 0 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200503F8 || 0x3F8 || 0 || 5 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200203FD || 0x3FD || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2004040C || 0x40C || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200C0420 || 0x420 || 0 || 12 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000446 || 0x446 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000451 || 0x451 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0452 || 0x452 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20100458 || 0x458 || 0 || 16 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20040478 || 0x478 || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000047C || 0x47C || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000047E || 0x47E || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8001047F || 0x47F || 0 || 1 || 4 || ResolveDepthBuffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x2003048A || 0x48A || 0 || 3 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04B3 || 0x4B3 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800104B9 || 0x4B9 || 0 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04BA || 0x4BA || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800004BB || 0x4BB || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04C3 || 0x4C3 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200104C4 || 0x4C4 || 0 || 1 || 1 || SetAlphaRef&lt;br /&gt;
|-&lt;br /&gt;
| 0x200404C7 || 0x4C7 || 0 || 4 || 1 || SetBlendColor&lt;br /&gt;
|-&lt;br /&gt;
| 0x800004E0 || 0x4E0 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04E5 || 0x4E5 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04E6 || 0x4E6 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04E7 || 0x4E7 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200204EC || 0x4EC || 0 || 2 || 1 || SetLineWidth&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?050D || 0x50D || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000519 || 0x519 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000540 || 0x540 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010546 || 0x546 || 0 || 1 || 1 || SetPointSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001054C || 0x54C || 0 || 1 || 1 || ResetCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?054E || 0x54E || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20030554 || 0x554 || 0 || 3 || 1 || SetRenderEnableConditional&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0556 || 0x556 || 0 || Variable || 4 || SetRenderEnable?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001055B || 0x55B || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001056F || 0x56F || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000572 || 0x572 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0574 || 0x574 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000057F || 0x57F || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000580 || 0x580 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000591 || 0x591 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010592 || 0x592 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200205F2 || 0x5F2 || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?05F6 || 0x5F6 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001061F || 0x61F || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0620 || 0x620 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80010646 || 0x646 || 0 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0648 || 0x648 || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001064F || 0x64F || 0 || 1 || 1 || SetDepthClamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?066F || 0x66F || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x120020671 || 0x671 || 0 || 2 || 9 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010674 || 0x674 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000068B || 0x68B || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200406C0 || 0x6C0 || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010703 || 0x703 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200207?? || 0x7?? Variable || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80300830 || 0x830 || 0 || 48 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80400840 || 0x840 || 0 || 64 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80500850 || 0x850 || 0 || 80 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200308E0 || 0x8E0 || 0 || 3 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200308E3 || 0x8E3 || 0 || 3 || 1 || CB_POS(Const buffer position)&lt;br /&gt;
|-&lt;br /&gt;
| 0x200308E4 || 0x8E4 || 0 || 3 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??0904 || 0x904 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??090C || 0x90C || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??0914 || 0x914 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??091C || 0x91C || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??0924 || 0x924 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000D1E || 0xD1E || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0D28 || 0xD28 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010D29 || 0xD29 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010D34 || 0xD34 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0020E00 || 0xE00 || 0 || 2 || 5 || BeginTransformFeedback&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010E02 || 0xE02 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80020E04 || 0xE04 || 0 || 2 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010E06 || 0xE06 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0030E0A || 0xE0A || 0 || 3 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80050E0C || 0xE0C || 0 || 5 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0E0E || 0xE0E || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010E10 || 0xE10 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0040E12 || 0xE12 || 0 || 4 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010E1A || 0xE1A || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0040E1C || 0xE1C || 0 || 4 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x81900E1E || 0xE1E || 0 || 400 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000E20 || 0xE20 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000E24 || 0xE24 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0040E2C || 0xE2C || 0 || 4 || 5 || PushDebugGroup&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0020E2E || 0xE2E || 0 || 2 || 5 || PopDebugGroupId&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0030E30 || 0xE30 || 0 || 3 || 5 || DrawArrays&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E32 || 0xE32 || 0 || 5 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E34 || 0xE34 || 0 || 5 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E36 || 0xE36 || 0 || 5 || 5 || DrawElements&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0060E38 || 0xE38 || 0 || 6 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0060E3A || 0xE3A || 0 || 6 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E42 || 0xE42 || 0 || 5 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0060E44 || 0xE44 || 0 || 6 || 5 || ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: These still need to be heavily verified and &#039;&#039;could&#039;&#039; be wrong.&lt;br /&gt;
&lt;br /&gt;
=== BindObject ===&lt;br /&gt;
&lt;br /&gt;
In order to bind an engine object to a specific subchannel, method 0 (BindObject) must be used first. The target subchannel is specified in bits 15-13 of the command word.&lt;br /&gt;
&lt;br /&gt;
After the engine object is bound to the desired subchannel, setting it&#039;s value in bits 15-13 of any subsequent command word will make PFIFO forward the command to the target engine.&lt;br /&gt;
&lt;br /&gt;
This method only takes one argument, an [[#Engine_IDs|engine ID]].&lt;br /&gt;
&lt;br /&gt;
==== Engine IDs ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Engine&lt;br /&gt;
|-&lt;br /&gt;
|0x902D&lt;br /&gt;
|FERMI_TWOD_A (2D)&lt;br /&gt;
|-&lt;br /&gt;
|0xB197&lt;br /&gt;
|MAXWELL_B (3D)&lt;br /&gt;
|-&lt;br /&gt;
|0xB1C0&lt;br /&gt;
|MAXWELL_COMPUTE_B&lt;br /&gt;
|-&lt;br /&gt;
|0xA140&lt;br /&gt;
|KEPLER_INLINE_TO_MEMORY_B&lt;br /&gt;
|-&lt;br /&gt;
|0xB0B5&lt;br /&gt;
|MAXWELL_DMA_COPY_A (DMA)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Fences ===&lt;br /&gt;
&lt;br /&gt;
Command lists can contain fences to ensure that commands are executed on the correct order, and subsequent commands are only sent when the previously sent commands were already processed by the GPU. Fences uses the QUERY_* commands, and works like this:&lt;br /&gt;
&lt;br /&gt;
* First, QUERY_ADDRESS_HIGH and QUERY_ADDRESS_LOW commands are added to the Command List, with the High/Low 32 bits part of the 64-bits GPU Virtual Address where the fence is located. This GPU Virtual Address needs to be mapped to the process Virtual Address beforehand.&lt;br /&gt;
* Then, QUERY_SEQUENCE is added with a sequential number. This number is basically a incrementing counter, so the first Command List can have QUERY_SEQUENCE = 1, the next one QUERY_SEQUENCE = 2, 3, 4... and so on.&lt;br /&gt;
* Finally, QUERY_GET is added and contains the mode and other unknown data.&lt;br /&gt;
&lt;br /&gt;
The above commands are added using the [[#Submission_mode|increasing mode]], since the Ids for all those 4 registers are sequential.&lt;br /&gt;
&lt;br /&gt;
==== QUERY_GET Structure ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Bits&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
|1-0&lt;br /&gt;
|Mode&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Fence&lt;br /&gt;
|-&lt;br /&gt;
|15-12&lt;br /&gt;
|Unit &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== QUERY_GET Mode ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Value&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Mode&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Write&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Sync&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Write ? &lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Write ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TODO: Move this to a separate page with all GPU Commands with descriptions. Also figure out what the other values mean.&lt;br /&gt;
&lt;br /&gt;
Some of the other fields are still unknown/unobserved.&lt;br /&gt;
&lt;br /&gt;
Official games will set Mode to 0, Fence to 1 and Unit to 0xF. The QUERY_SEQUENCE value is then written by the GPU to the address pointed to by QUERY_ADDRESS.&lt;br /&gt;
On the CPU side, the game code should wait until the value at the address pointed to by QUERY_ADDRESS is &amp;gt;= to the last written SEQUENCE value. Official code waits for this condition to be true on a loop, and won&#039;t send any further commands before that.&lt;br /&gt;
&lt;br /&gt;
== Vertex Data Submission ==&lt;br /&gt;
&lt;br /&gt;
Note: This is a observation on how the game Puyo Puyo Tetris sends textured squares to the GPU.&lt;br /&gt;
&lt;br /&gt;
# VERTEX_ATTRIB_FORMAT (0-15) are set (only the first 3 are really used, the rest are set float, with Size = 1 and offset at 0).&lt;br /&gt;
# VERTEX_ARRAY_FETCH (0) is set with the lower 12 bits set to 0x1c (Stride) and bit 12 to 1 (Enabled).&lt;br /&gt;
# VERTEX_ARRAY_START_HIGH/LOW (0) are set to the GPU Virtual Address where the Vertex Data is located.&lt;br /&gt;
# VERTEX_ARRAY_LIMIT_HIGH/LOW (0) are set to the GPU Virtual Address where the Vertex Data is located, plus the Vertex Data size in bytes minus 1.&lt;br /&gt;
# VERTEX_BEGIN_GL is used with the primitive type set to TRIANGLE_STRIP.&lt;br /&gt;
# VERTEX_BUFFER_FIRST with value 0 (indicating the index of the first primitive to render?).&lt;br /&gt;
# VERTEX_BUFFER_COUNT is set to 4, because the Vertex Buffer with the square has 4 vertices.&lt;br /&gt;
# VERTEX_END_GL is used with value 0 (currently unknown what this value means).&lt;br /&gt;
&lt;br /&gt;
== Texture View ==&lt;br /&gt;
&lt;br /&gt;
Texture information such as address, format and size is sent to the GPU through a structure know as Texture View (a.k.a. Texture Image Control, or TIC). Each texture that the game uses needs a separate TIC, and those TICs are written to a table, one after the other. Each [[#TIC_Structure|TIC entry]] has 0x20 bytes, and is composed of 8 32-bits words where the texture information is packed.&lt;br /&gt;
&lt;br /&gt;
The index of the TIC entries that should be used by the shader is sent to the GPU with the CB_POS/CB_DATA (0) methods. Games usually follows the following steps to write the TIC entry indexes:&lt;br /&gt;
&lt;br /&gt;
* CB_ADDRESS_HIGH/LOW method is used to set the GPU Virtual Address of the Const Buffer.&lt;br /&gt;
* CB_POS is used to set the write offset of the Const Buffer to 0x20 + n * 4, where &#039;&#039;n&#039;&#039; is the is the index of the active texture that will be used by the shader (?).&lt;br /&gt;
* CB_DATA (0) method is used to write the value into the Const Buffer. The value is a word where the lower 20 bits is the TIC index.&lt;br /&gt;
&lt;br /&gt;
The address of a given TIC entry can be calculates as:&lt;br /&gt;
&lt;br /&gt;
 tic_entry_address = tic_base_address + tic_index * 0x20&lt;br /&gt;
&lt;br /&gt;
Where &#039;&#039;tic_base_address&#039;&#039; is the address written to TIC_ADDRESS_HIGH/LOW (methods 0x1574 and 0x1578), &#039;&#039;tic_index&#039;&#039; is the lower 20 bits of the word written into the Const Buffer with CB_DATA (0), and 0x20 is the size of each TIC entry in bytes.&lt;br /&gt;
&lt;br /&gt;
Note: More research still needs to be done on the Const Buffer and how it is used by the shader.&lt;br /&gt;
&lt;br /&gt;
=== TIC Structure ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Word || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 6-0 || [[GPU_Texture_Formats#Texture_Formats|Texture Format]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 9-7 || [[#Channel_Data_Type|R Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12-10 || [[#Channel_Data_Type|G Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 15-13 || [[#Channel_Data_Type|B Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 18-16 || [[#Channel_Data_Type|A Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 31-0 || Lower 32-bits of the Texture GPU Virtual Address&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 15-0 || Higher 16-bits of the Texture GPU Virtual Address&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 15-0 || Texture Width minus 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 15-0 || Texture Height minus 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Channel Data Type ====&lt;br /&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;
| 1 || SNORM&lt;br /&gt;
|-&lt;br /&gt;
| 2 || UNORM&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SINT&lt;br /&gt;
|-&lt;br /&gt;
| 4 || UINT&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SNORM_FORCE_FP16&lt;br /&gt;
|-&lt;br /&gt;
| 6 || UNORM_FORCE_FP16&lt;br /&gt;
|-&lt;br /&gt;
| 7 || FLOAT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
FIFO engine overview:&lt;br /&gt;
[https://envytools.readthedocs.io/en/latest/hw/fifo/intro.html]&lt;br /&gt;
&lt;br /&gt;
Method values from the Fermi family GPU (a bit older than the Tegra X1, but values seems to be mostly the same):&lt;br /&gt;
[https://github.com/envytools/envytools/blob/master/rnndb/graph/gf100_3d.xml]&lt;br /&gt;
&lt;br /&gt;
TIC structure used on a Maxwell GPU:&lt;br /&gt;
[https://github.com/envytools/envytools/blob/master/rnndb/graph/gm200_texture.xml]&lt;br /&gt;
&lt;br /&gt;
Values for some types used on the above XML:&lt;br /&gt;
[https://github.com/envytools/envytools/blob/master/rnndb/graph/nv_3ddefs.xml]&lt;br /&gt;
&lt;br /&gt;
Command word packing code used on Mesa3d:&lt;br /&gt;
[https://cgit.freedesktop.org/mesa/mesa/tree/src/gallium/drivers/nouveau/nvc0/nvc0_winsys.h]&lt;br /&gt;
&lt;br /&gt;
TIC entry pack/write code used on Mesa3d:&lt;br /&gt;
[https://cgit.freedesktop.org/mesa/mesa/tree/src/gallium/drivers/nouveau/nvc0/nvc0_tex.c#n65]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=GPU&amp;diff=3698</id>
		<title>GPU</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=GPU&amp;diff=3698"/>
		<updated>2018-02-10T04:02:27Z</updated>

		<summary type="html">&lt;p&gt;OgniK: gpu command list part 3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mapping Memory ==&lt;br /&gt;
&lt;br /&gt;
First, to map a memory region on the GPU Address Space, caching needs to be disabled by using [[SVC#svcSetMemoryAttribute|svcSetMemoryAttribute]]. The Address passed is the Virtual Address of the region that will be mapped, the size is the region size, and State0/1 are both set to 8 to disable caching of the memory region. This is done to ensure that the GPU can actually &amp;quot;see&amp;quot; the data written there, and it doesn&#039;t get stuck on some cache.&lt;br /&gt;
&lt;br /&gt;
Then, [[NV_services#NVMAP_IOC_CREATE|NVMAP_IOC_CREATE]] is used to create a nvmap object with the desired size. After, [[NV_services#NVMAP_IOC_ALLOC|NVMAP_IOC_ALLOC]] is used to allocate the memory on the GPU Address Space, and map data on the process Address Space into the GPU Address Space, by passing the Virtual Address as the input addr parameter, and also the Handle returned from [[NV_services#NVMAP_IOC_CREATE|NVMAP_IOC_CREATE]]. Lastly, the actual mapping is done by using [[NV_services#NVGPU_AS_IOCTL_MAP_BUFFER_EX|NVGPU_AS_IOCTL_MAP_BUFFER_EX]], and the GPU Virtual Address is returned on the offset parameter. It&#039;s also possible to manually set the offset where the mapping should be made on the GPU Address Space, by passing the address on the &amp;quot;offset&amp;quot; parameter, and setting the bit 0 of the flags parameter to 1. However, for this to work, the desired GPU Virtual Address needs to be previously reserved using [[NV_services#NVGPU_AS_IOCTL_ALLOC_SPACE|NVGPU_AS_IOCTL_ALLOC_SPACE]].&lt;br /&gt;
&lt;br /&gt;
The above process is used to map all data that will be used by the GPU, like Textures, Command Lists (a.k.a. Push Buffers), Vertex/Index buffers and Shaders. They usually have their own mapping, but Command Lists can share the same mapping.&lt;br /&gt;
&lt;br /&gt;
== FIFO Commands ==&lt;br /&gt;
&lt;br /&gt;
The GPU implements a variation of Tegra&#039;s push buffer format for it&#039;s PFIFO engine. PFIFO is a special engine responsible for receiving user command lists and routing them to the appropriate engines (2D, 3D, DMA).&lt;br /&gt;
&lt;br /&gt;
Commands are submitted to the GPU&#039;s PFIFO engine through [[NV_services#NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO|NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO]].&lt;br /&gt;
&lt;br /&gt;
This ioctl takes an array of gpfifo entries where each entry points to a FIFO command list. This list is composed of alternating 32-bit words containing FIFO commands and their respective arguments.&lt;br /&gt;
&lt;br /&gt;
=== Command Structure ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Bits&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
|12-0&lt;br /&gt;
|Method&lt;br /&gt;
|-&lt;br /&gt;
|15-13&lt;br /&gt;
|Subchannel&lt;br /&gt;
|-&lt;br /&gt;
|28-16&lt;br /&gt;
|Argument count (in 32-bits Words) or inline data (see below)&lt;br /&gt;
|-&lt;br /&gt;
|31-29&lt;br /&gt;
|[[#Submission_mode|Submission mode]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: Methods are treated as 4-byte addressable locations, and hence their numbers are written down multiplied by 4.&lt;br /&gt;
&lt;br /&gt;
Note: The command&#039;s arguments, when present, follow the command word immediately.&lt;br /&gt;
&lt;br /&gt;
==== Submission mode ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Mode&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Offical name&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Increasing mode (old)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Increasing mode - Tells PFIFO to read as much arguments as specified by &#039;&#039;&#039;argument count&#039;&#039;&#039;, while automatically incrementing the &#039;&#039;&#039;method&#039;&#039;&#039; value. This means that each argument will be written to a different method location.&lt;br /&gt;
|INCR&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Non-increasing mode (old)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Non-increasing mode - Tells PFIFO to read as much arguments as specified by &#039;&#039;&#039;argument count&#039;&#039;&#039;. However, all arguments will be written to the same method location.&lt;br /&gt;
|NONINCR&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Inline mode - Tells PFIFO to read &#039;&#039;&#039;inline data&#039;&#039;&#039; from bits 28-16 of the command word, thus eliminating the need to pass additional words for the arguments.&lt;br /&gt;
|IMM&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Increase-once mode - Tells PFIFO to read as much arguments as specified by &#039;&#039;&#039;argument count&#039;&#039;&#039; and automatically increments the &#039;&#039;&#039;method&#039;&#039;&#039; value once only.&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command List ===&lt;br /&gt;
&lt;br /&gt;
All methods with values &amp;lt; 0x100 are special and executed by the PFIFO&#039;s DMA puller. The others are forwarded to the engine object currently bound to a given subchannel.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Command || Method || Subchannel || Arg Count || Mode || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001?000 || 0x0000 || Variable || 1 || 1 || [[#BindObject|BindObject]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0020E00 || 0xE00 || 0 || 2 || 5 || BeginTransformFeedback&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0030E30 || 0xE30 || 0 || 3 || 5 || DrawArrays&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E36 || 0xE36 || 0 || 5 || 5 || DrawElements&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0020E2E || 0xE2E || 0 || 2 || 5 || PopDebugGroupId&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0040E2C || 0xE2C || 0 || 4 || 5 || PushDebugGroup&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001054C || 0x54C || 0 || 1 || 1 || ResetCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x8001047F || 0x47F || 0 || 1 || 4 || ResolveDepthBuffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x200104C4 || 0x4C4 || 0 || 1 || 1 || SetAlphaRef&lt;br /&gt;
|-&lt;br /&gt;
| 0x200404C7 || 0x4C7 || 0 || 4 || 1 || SetBlendColor&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001064F || 0x64F || 0 || 1 || 1 || SetDepthClamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x200200CD || 0xCD || 0 || 2 || 1 || SetInnerTessellationLevels&lt;br /&gt;
|-&lt;br /&gt;
| 0x200204EC || 0x4EC || 0 || 2 || 1 || SetLineWidth&lt;br /&gt;
|-&lt;br /&gt;
| 0x200400C9 || 0xC9 || 0 || 4 || 1 || SetOuterTessellationLevels&lt;br /&gt;
|-&lt;br /&gt;
| 0x8???0373 || 0x373 || 0 || Variable || 4 || SetPatchSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010546 || 0x546 || 0 || 1 || 1 || SetPointSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20030554 || 0x554 || 0 || 3 || 1 || SetRenderEnableConditional&lt;br /&gt;
|-&lt;br /&gt;
| 0x200403EF || 0x3EF || 0 || 4 || 1 || SetSampleMask&lt;br /&gt;
|-&lt;br /&gt;
| 0x200103D9 || 0x3D9 || 0 || 1 || 1 || SetTiledCacheTileSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20020047 || 0x47 || 0 || 2 || 1 || SetGraphMacroEntry&lt;br /&gt;
|-&lt;br /&gt;
| 0xA???0045 || 0x45 || 0 || Variable || 5 || SetGraphMacroCode&lt;br /&gt;
|-&lt;br /&gt;
| 0x800104B9 || 0x4B9 || 0 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000374 || 0x374 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0040E12 || 0xE12 || 0 || 4 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010E10 || 0xE10 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x120020671 || 0x671 || 0 || 2 || 9 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800004BB || 0x4BB || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2004040C || 0x40C || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800103F6 || 0x3F6 || 0 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04BA || 0x4BA || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04B3 || 0x4B3 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04C3 || 0x4C3 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800004E0 || 0x4E0 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010E1A || 0xE1A || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000068B || 0x68B || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200308E3 || 0x8E3 || 0 || 3 || 1 || CB_POS(Const buffer position)&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0E0E || 0xE0E || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20040478 || 0x478 || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800003ED || 0x3ED || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800203EE || 0x3EE || 0 || 2 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800003F5 || 0x3F5 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000370 || 0x370 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000371 || 0x371 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000372 || 0x372 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80010646 || 0x646 || 0 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?036B || 0x36B || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?036C || 0x36C || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0648 || 0x648 || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000D1E || 0xD1E || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80300830 || 0x830 || 0 || 48 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80400840 || 0x840 || 0 || 64 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80500850 || 0x850 || 0 || 80 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000047C || 0x47C || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200308E4 || 0x8E4 || 0 || 3 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200308E0 || 0x8E0 || 0 || 3 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??0924 || 0x924 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??0904 || 0x904 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??091C || 0x91C || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??090C || 0x90C || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??0914 || 0x914 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20100458 || 0x458 || 0 || 16 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200207?? || 0x7?? Variable || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010703 || 0x703 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0620 || 0x620 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000040 || 0x40 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C0 || 0x1C0 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C2 || 0x1C2 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20048100 || 0x100 || 4 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200281C4 || 0x1C4 || 4 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20018106 || 0x106 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200180C0 || 0xC0 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20040360 || 0x360 || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010E02 || 0xE02 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0049 || 0x49 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001036F || 0x36F || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010376 || 0x376 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000E24 || 0xE24 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010364 || 0x364 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04E7 || 0x4E7 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0368 || 0x368 || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80020E04 || 0xE04 || 0 || 2 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0040E1C || 0xE1C || 0 || 4 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200203FD || 0x3FD || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010674 || 0x674 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CC || 0x1CC || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CA || 0x1CA || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CD || 0x1CD || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CB || 0x1CB || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CF || 0x1CF || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C3 || 0x1C3 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20018104 || 0x104 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C5 || 0x1C5 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C6 || 0x1C6 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C7 || 0x1C7 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C8 || 0x1C8 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20028102 || 0x102 || 4 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20018105 || 0x105 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20016223 || 0x223 || 3 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20016085 || 0x85 || 3 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20026086 || 0x86 || 3 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20026088 || 0x88 || 3 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20056080 || 0x80 || 3 || Variable || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2004608C || 0x8C || 3 || Variable || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20046230 || 0x230 || 3 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20016091 || 0x91 || 3 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20026092 || 0x92 || 3 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20026094 || 0x94 || 3 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800160B5 || 0xB5 || 3 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20046234 || 0x234 || 3 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2004622C || 0x22C || 3 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80?003DE || 0x3DE || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E32 || 0xE32 || 0 || 5 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x81900E1E || 0xE1E || 0 || 400 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E42 || 0xE42 || 0 || 5 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E34 || 0xE34 || 0 || 5 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000446 || 0x446 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?050D || 0x50D || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?05F6 || 0x5F6 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0060E38 || 0xE38 || 0 || 6 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0060E3A || 0xE3A || 0 || 6 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0060E44 || 0xE44 || 0 || 6 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200205F2 || 0x5F2 || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80050E0C || 0xE0C || 0 || 5 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000047E || 0x47E || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200C0420 || 0x420 || 0 || 12 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200406C0 || 0x6C0 || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800001D1 || 0x1D1 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800003E0 || 0x3E0 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000451 || 0x451 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200401FA || 0x1FA || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000540 || 0x540 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000519 || 0x519 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0030E0A || 0xE0A || 0 || 3 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010D34 || 0xD34 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000E20 || 0xE20 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0452 || 0x452 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?066F || 0x66F || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200203E7 || 0x3E7 || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001055B || 0x55B || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001056F || 0x56F || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001061F || 0x61F || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000591 || 0x591 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010592 || 0x592 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?00DF || 0xDF || 0 || Variable || 4 || SetRasterizerDiscard?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0556 || 0x556 || 0 || Variable || 4 || SetRenderEnable?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0574 || 0x574 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0D28 || 0xD28 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800000BA || 0xBA || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010E06 || 0xE06 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200100BF || 0xBF || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200100DC || 0xDC || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x601000BE || 0xBE || 0 || 16 || 3 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200503F8 || 0x3F8 || 0 || 5 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?054E || 0x54E || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2003048A || 0x48A || 0 || 3 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200201F8 || 0x1F8 || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200301F0 || 0x1F0 || 0 || 3 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000572 || 0x572 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000057F || 0x57F || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000580 || 0x580 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800001F3 || 0x1F3 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010D29 || 0xD29 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200203?? || 0x3?? Variable || 0 || 2 || 1 || SetScissors?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?03D6 || 0x3D6 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?03D5 || 0x3D5 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04E5 || 0x4E5 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?03D7 || 0x3D7 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04E6 || 0x4E6 || 0 || Variable || 4 || ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: These still need to be heavily verified and &#039;&#039;could&#039;&#039; be wrong.&lt;br /&gt;
&lt;br /&gt;
=== BindObject ===&lt;br /&gt;
&lt;br /&gt;
In order to bind an engine object to a specific subchannel, method 0 (BindObject) must be used first. The target subchannel is specified in bits 15-13 of the command word.&lt;br /&gt;
&lt;br /&gt;
After the engine object is bound to the desired subchannel, setting it&#039;s value in bits 15-13 of any subsequent command word will make PFIFO forward the command to the target engine.&lt;br /&gt;
&lt;br /&gt;
This method only takes one argument, an [[#Engine_IDs|engine ID]].&lt;br /&gt;
&lt;br /&gt;
==== Engine IDs ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Engine&lt;br /&gt;
|-&lt;br /&gt;
|0x902D&lt;br /&gt;
|FERMI_TWOD_A (2D)&lt;br /&gt;
|-&lt;br /&gt;
|0xB197&lt;br /&gt;
|MAXWELL_B (3D)&lt;br /&gt;
|-&lt;br /&gt;
|0xB1C0&lt;br /&gt;
|MAXWELL_COMPUTE_B&lt;br /&gt;
|-&lt;br /&gt;
|0xA140&lt;br /&gt;
|KEPLER_INLINE_TO_MEMORY_B&lt;br /&gt;
|-&lt;br /&gt;
|0xB0B5&lt;br /&gt;
|MAXWELL_DMA_COPY_A (DMA)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Fences ===&lt;br /&gt;
&lt;br /&gt;
Command lists can contain fences to ensure that commands are executed on the correct order, and subsequent commands are only sent when the previously sent commands were already processed by the GPU. Fences uses the QUERY_* commands, and works like this:&lt;br /&gt;
&lt;br /&gt;
* First, QUERY_ADDRESS_HIGH and QUERY_ADDRESS_LOW commands are added to the Command List, with the High/Low 32 bits part of the 64-bits GPU Virtual Address where the fence is located. This GPU Virtual Address needs to be mapped to the process Virtual Address beforehand.&lt;br /&gt;
* Then, QUERY_SEQUENCE is added with a sequential number. This number is basically a incrementing counter, so the first Command List can have QUERY_SEQUENCE = 1, the next one QUERY_SEQUENCE = 2, 3, 4... and so on.&lt;br /&gt;
* Finally, QUERY_GET is added and contains the mode and other unknown data.&lt;br /&gt;
&lt;br /&gt;
The above commands are added using the [[#Submission_mode|increasing mode]], since the Ids for all those 4 registers are sequential.&lt;br /&gt;
&lt;br /&gt;
==== QUERY_GET Structure ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Bits&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
|1-0&lt;br /&gt;
|Mode&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Fence&lt;br /&gt;
|-&lt;br /&gt;
|15-12&lt;br /&gt;
|Unit &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== QUERY_GET Mode ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Value&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Mode&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Write&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Sync&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Write ? &lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Write ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TODO: Move this to a separate page with all GPU Commands with descriptions. Also figure out what the other values mean.&lt;br /&gt;
&lt;br /&gt;
Some of the other fields are still unknown/unobserved.&lt;br /&gt;
&lt;br /&gt;
Official games will set Mode to 0, Fence to 1 and Unit to 0xF. The QUERY_SEQUENCE value is then written by the GPU to the address pointed to by QUERY_ADDRESS.&lt;br /&gt;
On the CPU side, the game code should wait until the value at the address pointed to by QUERY_ADDRESS is &amp;gt;= to the last written SEQUENCE value. Official code waits for this condition to be true on a loop, and won&#039;t send any further commands before that.&lt;br /&gt;
&lt;br /&gt;
== Vertex Data Submission ==&lt;br /&gt;
&lt;br /&gt;
Note: This is a observation on how the game Puyo Puyo Tetris sends textured squares to the GPU.&lt;br /&gt;
&lt;br /&gt;
# VERTEX_ATTRIB_FORMAT (0-15) are set (only the first 3 are really used, the rest are set float, with Size = 1 and offset at 0).&lt;br /&gt;
# VERTEX_ARRAY_FETCH (0) is set with the lower 12 bits set to 0x1c (Stride) and bit 12 to 1 (Enabled).&lt;br /&gt;
# VERTEX_ARRAY_START_HIGH/LOW (0) are set to the GPU Virtual Address where the Vertex Data is located.&lt;br /&gt;
# VERTEX_ARRAY_LIMIT_HIGH/LOW (0) are set to the GPU Virtual Address where the Vertex Data is located, plus the Vertex Data size in bytes minus 1.&lt;br /&gt;
# VERTEX_BEGIN_GL is used with the primitive type set to TRIANGLE_STRIP.&lt;br /&gt;
# VERTEX_BUFFER_FIRST with value 0 (indicating the index of the first primitive to render?).&lt;br /&gt;
# VERTEX_BUFFER_COUNT is set to 4, because the Vertex Buffer with the square has 4 vertices.&lt;br /&gt;
# VERTEX_END_GL is used with value 0 (currently unknown what this value means).&lt;br /&gt;
&lt;br /&gt;
== Texture View ==&lt;br /&gt;
&lt;br /&gt;
Texture information such as address, format and size is sent to the GPU through a structure know as Texture View (a.k.a. Texture Image Control, or TIC). Each texture that the game uses needs a separate TIC, and those TICs are written to a table, one after the other. Each [[#TIC_Structure|TIC entry]] has 0x20 bytes, and is composed of 8 32-bits words where the texture information is packed.&lt;br /&gt;
&lt;br /&gt;
The index of the TIC entries that should be used by the shader is sent to the GPU with the CB_POS/CB_DATA (0) methods. Games usually follows the following steps to write the TIC entry indexes:&lt;br /&gt;
&lt;br /&gt;
* CB_ADDRESS_HIGH/LOW method is used to set the GPU Virtual Address of the Const Buffer.&lt;br /&gt;
* CB_POS is used to set the write offset of the Const Buffer to 0x20 + n * 4, where &#039;&#039;n&#039;&#039; is the is the index of the active texture that will be used by the shader (?).&lt;br /&gt;
* CB_DATA (0) method is used to write the value into the Const Buffer. The value is a word where the lower 20 bits is the TIC index.&lt;br /&gt;
&lt;br /&gt;
The address of a given TIC entry can be calculates as:&lt;br /&gt;
&lt;br /&gt;
 tic_entry_address = tic_base_address + tic_index * 0x20&lt;br /&gt;
&lt;br /&gt;
Where &#039;&#039;tic_base_address&#039;&#039; is the address written to TIC_ADDRESS_HIGH/LOW (methods 0x1574 and 0x1578), &#039;&#039;tic_index&#039;&#039; is the lower 20 bits of the word written into the Const Buffer with CB_DATA (0), and 0x20 is the size of each TIC entry in bytes.&lt;br /&gt;
&lt;br /&gt;
Note: More research still needs to be done on the Const Buffer and how it is used by the shader.&lt;br /&gt;
&lt;br /&gt;
=== TIC Structure ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Word || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 6-0 || [[GPU_Texture_Formats#Texture_Formats|Texture Format]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 9-7 || [[#Channel_Data_Type|R Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12-10 || [[#Channel_Data_Type|G Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 15-13 || [[#Channel_Data_Type|B Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 18-16 || [[#Channel_Data_Type|A Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 31-0 || Lower 32-bits of the Texture GPU Virtual Address&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 15-0 || Higher 16-bits of the Texture GPU Virtual Address&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 15-0 || Texture Width minus 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 15-0 || Texture Height minus 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Channel Data Type ====&lt;br /&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;
| 1 || SNORM&lt;br /&gt;
|-&lt;br /&gt;
| 2 || UNORM&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SINT&lt;br /&gt;
|-&lt;br /&gt;
| 4 || UINT&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SNORM_FORCE_FP16&lt;br /&gt;
|-&lt;br /&gt;
| 6 || UNORM_FORCE_FP16&lt;br /&gt;
|-&lt;br /&gt;
| 7 || FLOAT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
FIFO engine overview:&lt;br /&gt;
[https://envytools.readthedocs.io/en/latest/hw/fifo/intro.html]&lt;br /&gt;
&lt;br /&gt;
Method values from the Fermi family GPU (a bit older than the Tegra X1, but values seems to be mostly the same):&lt;br /&gt;
[https://github.com/envytools/envytools/blob/master/rnndb/graph/gf100_3d.xml]&lt;br /&gt;
&lt;br /&gt;
TIC structure used on a Maxwell GPU:&lt;br /&gt;
[https://github.com/envytools/envytools/blob/master/rnndb/graph/gm200_texture.xml]&lt;br /&gt;
&lt;br /&gt;
Values for some types used on the above XML:&lt;br /&gt;
[https://github.com/envytools/envytools/blob/master/rnndb/graph/nv_3ddefs.xml]&lt;br /&gt;
&lt;br /&gt;
Command word packing code used on Mesa3d:&lt;br /&gt;
[https://cgit.freedesktop.org/mesa/mesa/tree/src/gallium/drivers/nouveau/nvc0/nvc0_winsys.h]&lt;br /&gt;
&lt;br /&gt;
TIC entry pack/write code used on Mesa3d:&lt;br /&gt;
[https://cgit.freedesktop.org/mesa/mesa/tree/src/gallium/drivers/nouveau/nvc0/nvc0_tex.c#n65]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=GPU&amp;diff=3697</id>
		<title>GPU</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=GPU&amp;diff=3697"/>
		<updated>2018-02-10T03:36:13Z</updated>

		<summary type="html">&lt;p&gt;OgniK: gpu command list part 2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mapping Memory ==&lt;br /&gt;
&lt;br /&gt;
First, to map a memory region on the GPU Address Space, caching needs to be disabled by using [[SVC#svcSetMemoryAttribute|svcSetMemoryAttribute]]. The Address passed is the Virtual Address of the region that will be mapped, the size is the region size, and State0/1 are both set to 8 to disable caching of the memory region. This is done to ensure that the GPU can actually &amp;quot;see&amp;quot; the data written there, and it doesn&#039;t get stuck on some cache.&lt;br /&gt;
&lt;br /&gt;
Then, [[NV_services#NVMAP_IOC_CREATE|NVMAP_IOC_CREATE]] is used to create a nvmap object with the desired size. After, [[NV_services#NVMAP_IOC_ALLOC|NVMAP_IOC_ALLOC]] is used to allocate the memory on the GPU Address Space, and map data on the process Address Space into the GPU Address Space, by passing the Virtual Address as the input addr parameter, and also the Handle returned from [[NV_services#NVMAP_IOC_CREATE|NVMAP_IOC_CREATE]]. Lastly, the actual mapping is done by using [[NV_services#NVGPU_AS_IOCTL_MAP_BUFFER_EX|NVGPU_AS_IOCTL_MAP_BUFFER_EX]], and the GPU Virtual Address is returned on the offset parameter. It&#039;s also possible to manually set the offset where the mapping should be made on the GPU Address Space, by passing the address on the &amp;quot;offset&amp;quot; parameter, and setting the bit 0 of the flags parameter to 1. However, for this to work, the desired GPU Virtual Address needs to be previously reserved using [[NV_services#NVGPU_AS_IOCTL_ALLOC_SPACE|NVGPU_AS_IOCTL_ALLOC_SPACE]].&lt;br /&gt;
&lt;br /&gt;
The above process is used to map all data that will be used by the GPU, like Textures, Command Lists (a.k.a. Push Buffers), Vertex/Index buffers and Shaders. They usually have their own mapping, but Command Lists can share the same mapping.&lt;br /&gt;
&lt;br /&gt;
== FIFO Commands ==&lt;br /&gt;
&lt;br /&gt;
The GPU implements a variation of Tegra&#039;s push buffer format for it&#039;s PFIFO engine. PFIFO is a special engine responsible for receiving user command lists and routing them to the appropriate engines (2D, 3D, DMA).&lt;br /&gt;
&lt;br /&gt;
Commands are submitted to the GPU&#039;s PFIFO engine through [[NV_services#NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO|NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO]].&lt;br /&gt;
&lt;br /&gt;
This ioctl takes an array of gpfifo entries where each entry points to a FIFO command list. This list is composed of alternating 32-bit words containing FIFO commands and their respective arguments.&lt;br /&gt;
&lt;br /&gt;
=== Command Structure ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Bits&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
|12-0&lt;br /&gt;
|Method&lt;br /&gt;
|-&lt;br /&gt;
|15-13&lt;br /&gt;
|Subchannel&lt;br /&gt;
|-&lt;br /&gt;
|28-16&lt;br /&gt;
|Argument count (in 32-bits Words) or inline data (see below)&lt;br /&gt;
|-&lt;br /&gt;
|31-29&lt;br /&gt;
|[[#Submission_mode|Submission mode]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: Methods are treated as 4-byte addressable locations, and hence their numbers are written down multiplied by 4.&lt;br /&gt;
&lt;br /&gt;
Note: The command&#039;s arguments, when present, follow the command word immediately.&lt;br /&gt;
&lt;br /&gt;
==== Submission mode ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Mode&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Offical name&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Increasing mode (old)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Increasing mode - Tells PFIFO to read as much arguments as specified by &#039;&#039;&#039;argument count&#039;&#039;&#039;, while automatically incrementing the &#039;&#039;&#039;method&#039;&#039;&#039; value. This means that each argument will be written to a different method location.&lt;br /&gt;
|INCR&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Non-increasing mode (old)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Non-increasing mode - Tells PFIFO to read as much arguments as specified by &#039;&#039;&#039;argument count&#039;&#039;&#039;. However, all arguments will be written to the same method location.&lt;br /&gt;
|NONINCR&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Inline mode - Tells PFIFO to read &#039;&#039;&#039;inline data&#039;&#039;&#039; from bits 28-16 of the command word, thus eliminating the need to pass additional words for the arguments.&lt;br /&gt;
|IMM&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Increase-once mode - Tells PFIFO to read as much arguments as specified by &#039;&#039;&#039;argument count&#039;&#039;&#039; and automatically increments the &#039;&#039;&#039;method&#039;&#039;&#039; value once only.&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command List ===&lt;br /&gt;
&lt;br /&gt;
All methods with values &amp;lt; 0x100 are special and executed by the PFIFO&#039;s DMA puller. The others are forwarded to the engine object currently bound to a given subchannel.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Command || Method || Subchannel || Arg Count || Mode || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001?000 || 0x0000 || Variable || 1 || 1 || [[#BindObject|BindObject]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0020E00 || 0xE00 || 0 || 2 || 5 || BeginTransformFeedback&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0030E30 || 0xE30 || 0 || 3 || 5 || DrawArrays&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E36 || 0xE36 || 0 || 5 || 5 || DrawElements&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0020E2E || 0xE2E || 0 || 2 || 5 || PopDebugGroupId&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0040E2C || 0xE2C || 0 || 4 || 5 || PushDebugGroup&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001054C || 0x54C || 0 || 1 || 1 || ResetCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x8001047F || 0x47F || 0 || 1 || 4 || ResolveDepthBuffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x200104C4 || 0x4C4 || 0 || 1 || 1 || SetAlphaRef&lt;br /&gt;
|-&lt;br /&gt;
| 0x200404C7 || 0x4C7 || 0 || 4 || 1 || SetBlendColor&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001064F || 0x64F || 0 || 1 || 1 || SetDepthClamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x200200CD || 0xCD || 0 || 2 || 1 || SetInnerTessellationLevels&lt;br /&gt;
|-&lt;br /&gt;
| 0x200204EC || 0x4EC || 0 || 2 || 1 || SetLineWidth&lt;br /&gt;
|-&lt;br /&gt;
| 0x200400C9 || 0xC9 || 0 || 4 || 1 || SetOuterTessellationLevels&lt;br /&gt;
|-&lt;br /&gt;
| 0x8???0373 || 0x373 || 0 || Variable || 4 || SetPatchSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010546 || 0x546 || 0 || 1 || 1 || SetPointSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20030554 || 0x554 || 0 || 3 || 1 || SetRenderEnableConditional&lt;br /&gt;
|-&lt;br /&gt;
| 0x200403EF || 0x3EF || 0 || 4 || 1 || SetSampleMask&lt;br /&gt;
|-&lt;br /&gt;
| 0x200103D9 || 0x3D9 || 0 || 1 || 1 || SetTiledCacheTileSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20020047 || 0x47 || 0 || 2 || 1 || SetGraphMacroEntry&lt;br /&gt;
|-&lt;br /&gt;
| 0xA???0045 || 0x45 || 0 || Variable || 5 || SetGraphMacroCode&lt;br /&gt;
|-&lt;br /&gt;
| 0x800104B9 || 0x4B9 || 0 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000374 || 0x374 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0040E12 || 0xE12 || 0 || 4 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010E10 || 0xE10 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x120020671 || 0x671 || 0 || 2 || 9 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800004BB || 0x4BB || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2004040C || 0x40C || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800103F6 || 0x3F6 || 0 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04BA || 0x4BA || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04B3 || 0x4B3 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04C3 || 0x4C3 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800004E0 || 0x4E0 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010E1A || 0xE1A || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000068B || 0x68B || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200308E3 || 0x8E3 || 0 || 3 || 1 || CB_POS(Const buffer position)&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0E0E || 0xE0E || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20040478 || 0x478 || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800003ED || 0x3ED || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800203EE || 0x3EE || 0 || 2 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800003F5 || 0x3F5 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000370 || 0x370 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000371 || 0x371 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000372 || 0x372 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80010646 || 0x646 || 0 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?036B || 0x36B || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?036C || 0x36C || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0648 || 0x648 || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000D1E || 0xD1E || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80300830 || 0x830 || 0 || 48 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80400840 || 0x840 || 0 || 64 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80500850 || 0x850 || 0 || 80 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000047C || 0x47C || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200308E4 || 0x8E4 || 0 || 3 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200308E0 || 0x8E0 || 0 || 3 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??0924 || 0x924 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??0904 || 0x904 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??091C || 0x91C || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??090C || 0x90C || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??0914 || 0x914 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20100458 || 0x458 || 0 || 16 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200207?? || 0x7?? Variable || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010703 || 0x703 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0620 || 0x620 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000040 || 0x40 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C0 || 0x1C0 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C2 || 0x1C2 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20048100 || 0x100 || 4 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200281C4 || 0x1C4 || 4 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20018106 || 0x106 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200180C0 || 0xC0 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20040360 || 0x360 || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010E02 || 0xE02 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0049 || 0x49 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001036F || 0x36F || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010376 || 0x376 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000E24 || 0xE24 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010364 || 0x364 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04E7 || 0x4E7 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0368 || 0x368 || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80020E04 || 0xE04 || 0 || 2 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0040E1C || 0xE1C || 0 || 4 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200203FD || 0x3FD || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010674 || 0x674 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CC || 0x1CC || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CA || 0x1CA || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CD || 0x1CD || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CB || 0x1CB || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181CF || 0x1CF || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C3 || 0x1C3 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20018104 || 0x104 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C5 || 0x1C5 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C6 || 0x1C6 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C7 || 0x1C7 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200181C8 || 0x1C8 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20028102 || 0x102 || 4 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20018105 || 0x105 || 4 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20016223 || 0x223 || 3 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20016085 || 0x85 || 3 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20026086 || 0x86 || 3 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20026088 || 0x88 || 3 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20056080 || 0x80 || 3 || Variable || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2004608C || 0x8C || 3 || Variable || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20046230 || 0x230 || 3 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20016091 || 0x91 || 3 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20026092 || 0x92 || 3 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20026094 || 0x94 || 3 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800160B5 || 0xB5 || 3 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20046234 || 0x234 || 3 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2004622C || 0x22C || 3 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80?003DE || 0x3DE || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E32 || 0xE32 || 0 || 5 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x81900E1E || 0xE1E || 0 || 400 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E42 || 0xE42 || 0 || 5 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E34 || 0xE34 || 0 || 5 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000446 || 0x446 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?050D || 0x50D || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?05F6 || 0x5F6 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0060E38 || 0xE38 || 0 || 6 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0060E3A || 0xE3A || 0 || 6 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0060E44 || 0xE44 || 0 || 6 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200205F2 || 0x5F2 || 0 || 2 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80050E0C || 0xE0C || 0 || 5 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000047E || 0x47E || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200C0420 || 0x420 || 0 || 12 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200406C0 || 0x6C0 || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800001D1 || 0x1D1 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800003E0 || 0x3E0 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000451 || 0x451 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200401FA || 0x1FA || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000540 || 0x540 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000519 || 0x519 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0030E0A || 0xE0A || 0 || 3 || 5 || ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: These still need to be heavily verified and &#039;&#039;could&#039;&#039; be wrong.&lt;br /&gt;
&lt;br /&gt;
=== BindObject ===&lt;br /&gt;
&lt;br /&gt;
In order to bind an engine object to a specific subchannel, method 0 (BindObject) must be used first. The target subchannel is specified in bits 15-13 of the command word.&lt;br /&gt;
&lt;br /&gt;
After the engine object is bound to the desired subchannel, setting it&#039;s value in bits 15-13 of any subsequent command word will make PFIFO forward the command to the target engine.&lt;br /&gt;
&lt;br /&gt;
This method only takes one argument, an [[#Engine_IDs|engine ID]].&lt;br /&gt;
&lt;br /&gt;
==== Engine IDs ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Engine&lt;br /&gt;
|-&lt;br /&gt;
|0x902D&lt;br /&gt;
|FERMI_TWOD_A (2D)&lt;br /&gt;
|-&lt;br /&gt;
|0xB197&lt;br /&gt;
|MAXWELL_B (3D)&lt;br /&gt;
|-&lt;br /&gt;
|0xB1C0&lt;br /&gt;
|MAXWELL_COMPUTE_B&lt;br /&gt;
|-&lt;br /&gt;
|0xA140&lt;br /&gt;
|KEPLER_INLINE_TO_MEMORY_B&lt;br /&gt;
|-&lt;br /&gt;
|0xB0B5&lt;br /&gt;
|MAXWELL_DMA_COPY_A (DMA)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Fences ===&lt;br /&gt;
&lt;br /&gt;
Command lists can contain fences to ensure that commands are executed on the correct order, and subsequent commands are only sent when the previously sent commands were already processed by the GPU. Fences uses the QUERY_* commands, and works like this:&lt;br /&gt;
&lt;br /&gt;
* First, QUERY_ADDRESS_HIGH and QUERY_ADDRESS_LOW commands are added to the Command List, with the High/Low 32 bits part of the 64-bits GPU Virtual Address where the fence is located. This GPU Virtual Address needs to be mapped to the process Virtual Address beforehand.&lt;br /&gt;
* Then, QUERY_SEQUENCE is added with a sequential number. This number is basically a incrementing counter, so the first Command List can have QUERY_SEQUENCE = 1, the next one QUERY_SEQUENCE = 2, 3, 4... and so on.&lt;br /&gt;
* Finally, QUERY_GET is added and contains the mode and other unknown data.&lt;br /&gt;
&lt;br /&gt;
The above commands are added using the [[#Submission_mode|increasing mode]], since the Ids for all those 4 registers are sequential.&lt;br /&gt;
&lt;br /&gt;
==== QUERY_GET Structure ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Bits&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
|1-0&lt;br /&gt;
|Mode&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Fence&lt;br /&gt;
|-&lt;br /&gt;
|15-12&lt;br /&gt;
|Unit &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== QUERY_GET Mode ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Value&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Mode&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Write&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Sync&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Write ? &lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Write ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TODO: Move this to a separate page with all GPU Commands with descriptions. Also figure out what the other values mean.&lt;br /&gt;
&lt;br /&gt;
Some of the other fields are still unknown/unobserved.&lt;br /&gt;
&lt;br /&gt;
Official games will set Mode to 0, Fence to 1 and Unit to 0xF. The QUERY_SEQUENCE value is then written by the GPU to the address pointed to by QUERY_ADDRESS.&lt;br /&gt;
On the CPU side, the game code should wait until the value at the address pointed to by QUERY_ADDRESS is &amp;gt;= to the last written SEQUENCE value. Official code waits for this condition to be true on a loop, and won&#039;t send any further commands before that.&lt;br /&gt;
&lt;br /&gt;
== Vertex Data Submission ==&lt;br /&gt;
&lt;br /&gt;
Note: This is a observation on how the game Puyo Puyo Tetris sends textured squares to the GPU.&lt;br /&gt;
&lt;br /&gt;
# VERTEX_ATTRIB_FORMAT (0-15) are set (only the first 3 are really used, the rest are set float, with Size = 1 and offset at 0).&lt;br /&gt;
# VERTEX_ARRAY_FETCH (0) is set with the lower 12 bits set to 0x1c (Stride) and bit 12 to 1 (Enabled).&lt;br /&gt;
# VERTEX_ARRAY_START_HIGH/LOW (0) are set to the GPU Virtual Address where the Vertex Data is located.&lt;br /&gt;
# VERTEX_ARRAY_LIMIT_HIGH/LOW (0) are set to the GPU Virtual Address where the Vertex Data is located, plus the Vertex Data size in bytes minus 1.&lt;br /&gt;
# VERTEX_BEGIN_GL is used with the primitive type set to TRIANGLE_STRIP.&lt;br /&gt;
# VERTEX_BUFFER_FIRST with value 0 (indicating the index of the first primitive to render?).&lt;br /&gt;
# VERTEX_BUFFER_COUNT is set to 4, because the Vertex Buffer with the square has 4 vertices.&lt;br /&gt;
# VERTEX_END_GL is used with value 0 (currently unknown what this value means).&lt;br /&gt;
&lt;br /&gt;
== Texture View ==&lt;br /&gt;
&lt;br /&gt;
Texture information such as address, format and size is sent to the GPU through a structure know as Texture View (a.k.a. Texture Image Control, or TIC). Each texture that the game uses needs a separate TIC, and those TICs are written to a table, one after the other. Each [[#TIC_Structure|TIC entry]] has 0x20 bytes, and is composed of 8 32-bits words where the texture information is packed.&lt;br /&gt;
&lt;br /&gt;
The index of the TIC entries that should be used by the shader is sent to the GPU with the CB_POS/CB_DATA (0) methods. Games usually follows the following steps to write the TIC entry indexes:&lt;br /&gt;
&lt;br /&gt;
* CB_ADDRESS_HIGH/LOW method is used to set the GPU Virtual Address of the Const Buffer.&lt;br /&gt;
* CB_POS is used to set the write offset of the Const Buffer to 0x20 + n * 4, where &#039;&#039;n&#039;&#039; is the is the index of the active texture that will be used by the shader (?).&lt;br /&gt;
* CB_DATA (0) method is used to write the value into the Const Buffer. The value is a word where the lower 20 bits is the TIC index.&lt;br /&gt;
&lt;br /&gt;
The address of a given TIC entry can be calculates as:&lt;br /&gt;
&lt;br /&gt;
 tic_entry_address = tic_base_address + tic_index * 0x20&lt;br /&gt;
&lt;br /&gt;
Where &#039;&#039;tic_base_address&#039;&#039; is the address written to TIC_ADDRESS_HIGH/LOW (methods 0x1574 and 0x1578), &#039;&#039;tic_index&#039;&#039; is the lower 20 bits of the word written into the Const Buffer with CB_DATA (0), and 0x20 is the size of each TIC entry in bytes.&lt;br /&gt;
&lt;br /&gt;
Note: More research still needs to be done on the Const Buffer and how it is used by the shader.&lt;br /&gt;
&lt;br /&gt;
=== TIC Structure ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Word || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 6-0 || [[GPU_Texture_Formats#Texture_Formats|Texture Format]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 9-7 || [[#Channel_Data_Type|R Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12-10 || [[#Channel_Data_Type|G Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 15-13 || [[#Channel_Data_Type|B Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 18-16 || [[#Channel_Data_Type|A Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 31-0 || Lower 32-bits of the Texture GPU Virtual Address&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 15-0 || Higher 16-bits of the Texture GPU Virtual Address&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 15-0 || Texture Width minus 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 15-0 || Texture Height minus 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Channel Data Type ====&lt;br /&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;
| 1 || SNORM&lt;br /&gt;
|-&lt;br /&gt;
| 2 || UNORM&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SINT&lt;br /&gt;
|-&lt;br /&gt;
| 4 || UINT&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SNORM_FORCE_FP16&lt;br /&gt;
|-&lt;br /&gt;
| 6 || UNORM_FORCE_FP16&lt;br /&gt;
|-&lt;br /&gt;
| 7 || FLOAT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
FIFO engine overview:&lt;br /&gt;
[https://envytools.readthedocs.io/en/latest/hw/fifo/intro.html]&lt;br /&gt;
&lt;br /&gt;
Method values from the Fermi family GPU (a bit older than the Tegra X1, but values seems to be mostly the same):&lt;br /&gt;
[https://github.com/envytools/envytools/blob/master/rnndb/graph/gf100_3d.xml]&lt;br /&gt;
&lt;br /&gt;
TIC structure used on a Maxwell GPU:&lt;br /&gt;
[https://github.com/envytools/envytools/blob/master/rnndb/graph/gm200_texture.xml]&lt;br /&gt;
&lt;br /&gt;
Values for some types used on the above XML:&lt;br /&gt;
[https://github.com/envytools/envytools/blob/master/rnndb/graph/nv_3ddefs.xml]&lt;br /&gt;
&lt;br /&gt;
Command word packing code used on Mesa3d:&lt;br /&gt;
[https://cgit.freedesktop.org/mesa/mesa/tree/src/gallium/drivers/nouveau/nvc0/nvc0_winsys.h]&lt;br /&gt;
&lt;br /&gt;
TIC entry pack/write code used on Mesa3d:&lt;br /&gt;
[https://cgit.freedesktop.org/mesa/mesa/tree/src/gallium/drivers/nouveau/nvc0/nvc0_tex.c#n65]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=GPU&amp;diff=3693</id>
		<title>GPU</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=GPU&amp;diff=3693"/>
		<updated>2018-02-10T01:10:25Z</updated>

		<summary type="html">&lt;p&gt;OgniK: gpu command list part 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mapping Memory ==&lt;br /&gt;
&lt;br /&gt;
First, to map a memory region on the GPU Address Space, caching needs to be disabled by using [[SVC#svcSetMemoryAttribute|svcSetMemoryAttribute]]. The Address passed is the Virtual Address of the region that will be mapped, the size is the region size, and State0/1 are both set to 8 to disable caching of the memory region. This is done to ensure that the GPU can actually &amp;quot;see&amp;quot; the data written there, and it doesn&#039;t get stuck on some cache.&lt;br /&gt;
&lt;br /&gt;
Then, [[NV_services#NVMAP_IOC_CREATE|NVMAP_IOC_CREATE]] is used to create a nvmap object with the desired size. After, [[NV_services#NVMAP_IOC_ALLOC|NVMAP_IOC_ALLOC]] is used to allocate the memory on the GPU Address Space, and map data on the process Address Space into the GPU Address Space, by passing the Virtual Address as the input addr parameter, and also the Handle returned from [[NV_services#NVMAP_IOC_CREATE|NVMAP_IOC_CREATE]]. Lastly, the actual mapping is done by using [[NV_services#NVGPU_AS_IOCTL_MAP_BUFFER_EX|NVGPU_AS_IOCTL_MAP_BUFFER_EX]], and the GPU Virtual Address is returned on the offset parameter. It&#039;s also possible to manually set the offset where the mapping should be made on the GPU Address Space, by passing the address on the &amp;quot;offset&amp;quot; parameter, and setting the bit 0 of the flags parameter to 1. However, for this to work, the desired GPU Virtual Address needs to be previously reserved using [[NV_services#NVGPU_AS_IOCTL_ALLOC_SPACE|NVGPU_AS_IOCTL_ALLOC_SPACE]].&lt;br /&gt;
&lt;br /&gt;
The above process is used to map all data that will be used by the GPU, like Textures, Command Lists (a.k.a. Push Buffers), Vertex/Index buffers and Shaders. They usually have their own mapping, but Command Lists can share the same mapping.&lt;br /&gt;
&lt;br /&gt;
== FIFO Commands ==&lt;br /&gt;
&lt;br /&gt;
The GPU implements a variation of Tegra&#039;s push buffer format for it&#039;s PFIFO engine. PFIFO is a special engine responsible for receiving user command lists and routing them to the appropriate engines (2D, 3D, DMA).&lt;br /&gt;
&lt;br /&gt;
Commands are submitted to the GPU&#039;s PFIFO engine through [[NV_services#NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO|NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO]].&lt;br /&gt;
&lt;br /&gt;
This ioctl takes an array of gpfifo entries where each entry points to a FIFO command list. This list is composed of alternating 32-bit words containing FIFO commands and their respective arguments.&lt;br /&gt;
&lt;br /&gt;
=== Command Structure ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Bits&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
|12-0&lt;br /&gt;
|Method&lt;br /&gt;
|-&lt;br /&gt;
|15-13&lt;br /&gt;
|Subchannel&lt;br /&gt;
|-&lt;br /&gt;
|28-16&lt;br /&gt;
|Argument count (in 32-bits Words) or inline data (see below)&lt;br /&gt;
|-&lt;br /&gt;
|31-29&lt;br /&gt;
|[[#Submission_mode|Submission mode]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: Methods are treated as 4-byte addressable locations, and hence their numbers are written down multiplied by 4.&lt;br /&gt;
&lt;br /&gt;
Note: The command&#039;s arguments, when present, follow the command word immediately.&lt;br /&gt;
&lt;br /&gt;
==== Submission mode ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Mode&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Offical name&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Increasing mode (old)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Increasing mode - Tells PFIFO to read as much arguments as specified by &#039;&#039;&#039;argument count&#039;&#039;&#039;, while automatically incrementing the &#039;&#039;&#039;method&#039;&#039;&#039; value. This means that each argument will be written to a different method location.&lt;br /&gt;
|INCR&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Non-increasing mode (old)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Non-increasing mode - Tells PFIFO to read as much arguments as specified by &#039;&#039;&#039;argument count&#039;&#039;&#039;. However, all arguments will be written to the same method location.&lt;br /&gt;
|NONINCR&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Inline mode - Tells PFIFO to read &#039;&#039;&#039;inline data&#039;&#039;&#039; from bits 28-16 of the command word, thus eliminating the need to pass additional words for the arguments.&lt;br /&gt;
|IMM&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Increase-once mode - Tells PFIFO to read as much arguments as specified by &#039;&#039;&#039;argument count&#039;&#039;&#039; and automatically increments the &#039;&#039;&#039;method&#039;&#039;&#039; value once only.&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command List ===&lt;br /&gt;
&lt;br /&gt;
All methods with values &amp;lt; 0x100 are special and executed by the PFIFO&#039;s DMA puller. The others are forwarded to the engine object currently bound to a given subchannel.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Command || Method || Subchannel || Arg Count || Mode || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001?000 || 0x0000 || Variable || 1 || 1 || [[#BindObject|BindObject]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0020E00 || 0x3800 || 0 || 2 || 5 || BeginTransformFeedback&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0030E30 || 0x38C0 || 0 || 3 || 5 || DrawArrays&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E36 || 0x38D8 || 0 || 5 || 5 || DrawElements&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0020E2E || 0x38B8 || 0 || 2 || 5 || PopDebugGroupId&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0040E2C || 0x38B0 || 0 || 4 || 5 || PushDebugGroup&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001054C || 0x1530 || 0 || 1 || 1 || ResetCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x8001047F || 0x11FC || 0 || 1 || 4 || ResolveDepthBuffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x200104C4 || 0x1310 || 0 || 1 || 1 || SetAlphaRef&lt;br /&gt;
|-&lt;br /&gt;
| 0x200404C7 || 0x131C || 0 || 4 || 1 || SetBlendColor&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001064F || 0x1BD0 || 0 || 1 || 1 || SetDepthClamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x200200CD || 0x0334 || 0 || 2 || 1 || SetInnerTessellationLevels&lt;br /&gt;
|-&lt;br /&gt;
| 0x200204EC || 0x13B0 || 0 || 2 || 1 || SetLineWidth&lt;br /&gt;
|-&lt;br /&gt;
| 0x200400C9 || 0x0324 || 0 || 4 || 1 || SetOuterTessellationLevels&lt;br /&gt;
|-&lt;br /&gt;
| 0x8???0373 || 0x0DCC || 0 || Variable || 4 || SetPatchSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010546 || 0x1518 || 0 || 1 || 1 || SetPointSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20030554 || 0x1550 || 0 || 3 || 1 || SetRenderEnableConditional&lt;br /&gt;
|-&lt;br /&gt;
| 0x200403EF || 0x0FBC || 0 || 4 || 1 || SetSampleMask&lt;br /&gt;
|-&lt;br /&gt;
| 0x200103D9 || 0x0F64 || 0 || 1 || 1 || SetTiledCacheTileSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20020047 || 0x011C || 0 || 2 || 1 || SetGraphMacroEntry&lt;br /&gt;
|-&lt;br /&gt;
| 0xA???0045 || 0x0114 || 0 || Variable || 5 || SetGraphMacroCode&lt;br /&gt;
|-&lt;br /&gt;
| 0x800104B9 || 0x4B9 || 0 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000374 || 0x374 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0040E12 || 0xE12 || 0 || 4 || 5 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010E10 || 0xE10 || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x120020671 || 0x671 || 0 || 2 || 9 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800004BB || 0x4BB || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2004040C || 0x40C || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800103F6 || 0x3F6 || 0 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04BA || 0x4BA || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04B3 || 0x4B3 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?04C3 || 0x4C3 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800004E0 || 0x4E0 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010E1A || 0xE1A || 0 || 1 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000068B || 0x68B || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200308E3 || 0x8E3 || 0 || 3 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0E0E || 0xE0E || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x20040478 || 0x478 || 0 || 4 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800003ED || 0x3ED || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800203EE || 0x3EE || 0 || 2 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800003F5 || 0x3F5 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000370 || 0x370 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000371 || 0x371 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000372 || 0x372 || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80010646 || 0x646 || 0 || 1 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?036B || 0x36B || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?036C || 0x36C || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x800?0648 || 0x648 || 0 || Variable  || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000D1E || 0xD1E || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80300830 || 0x830 || 0 || 48 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80400840 || 0x840 || 0 || 64 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80500850 || 0x850 || 0 || 80 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000047C || 0x47C || 0 || 0 || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200308E4 || 0x8E4 || 0 || 3 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x200308E0 || 0x8E0 || 0 || 3 || 1 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??0924 || 0x924 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??0904 || 0x904 || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??091C || 0x91C || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??090C || 0x90C || 0 || Variable || 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80??0914 || 0x914 || 0 || Variable || 4 || ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: These still need to be heavily verified and &#039;&#039;could&#039;&#039; be wrong.&lt;br /&gt;
&lt;br /&gt;
=== BindObject ===&lt;br /&gt;
&lt;br /&gt;
In order to bind an engine object to a specific subchannel, method 0 (BindObject) must be used first. The target subchannel is specified in bits 15-13 of the command word.&lt;br /&gt;
&lt;br /&gt;
After the engine object is bound to the desired subchannel, setting it&#039;s value in bits 15-13 of any subsequent command word will make PFIFO forward the command to the target engine.&lt;br /&gt;
&lt;br /&gt;
This method only takes one argument, an [[#Engine_IDs|engine ID]].&lt;br /&gt;
&lt;br /&gt;
==== Engine IDs ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Engine&lt;br /&gt;
|-&lt;br /&gt;
|0x902D&lt;br /&gt;
|FERMI_TWOD_A (2D)&lt;br /&gt;
|-&lt;br /&gt;
|0xB197&lt;br /&gt;
|MAXWELL_B (3D)&lt;br /&gt;
|-&lt;br /&gt;
|0xB1C0&lt;br /&gt;
|MAXWELL_COMPUTE_B&lt;br /&gt;
|-&lt;br /&gt;
|0xA140&lt;br /&gt;
|KEPLER_INLINE_TO_MEMORY_B&lt;br /&gt;
|-&lt;br /&gt;
|0xB0B5&lt;br /&gt;
|MAXWELL_DMA_COPY_A (DMA)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Fences ===&lt;br /&gt;
&lt;br /&gt;
Command lists can contain fences to ensure that commands are executed on the correct order, and subsequent commands are only sent when the previously sent commands were already processed by the GPU. Fences uses the QUERY_* commands, and works like this:&lt;br /&gt;
&lt;br /&gt;
* First, QUERY_ADDRESS_HIGH and QUERY_ADDRESS_LOW commands are added to the Command List, with the High/Low 32 bits part of the 64-bits GPU Virtual Address where the fence is located. This GPU Virtual Address needs to be mapped to the process Virtual Address beforehand.&lt;br /&gt;
* Then, QUERY_SEQUENCE is added with a sequential number. This number is basically a incrementing counter, so the first Command List can have QUERY_SEQUENCE = 1, the next one QUERY_SEQUENCE = 2, 3, 4... and so on.&lt;br /&gt;
* Finally, QUERY_GET is added and contains the mode and other unknown data.&lt;br /&gt;
&lt;br /&gt;
The above commands are added using the [[#Submission_mode|increasing mode]], since the Ids for all those 4 registers are sequential.&lt;br /&gt;
&lt;br /&gt;
==== QUERY_GET Structure ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Bits&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
|1-0&lt;br /&gt;
|Mode&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Fence&lt;br /&gt;
|-&lt;br /&gt;
|15-12&lt;br /&gt;
|Unit &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== QUERY_GET Mode ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Value&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Mode&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Write&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Sync&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Write ? &lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Write ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TODO: Move this to a separate page with all GPU Commands with descriptions. Also figure out what the other values mean.&lt;br /&gt;
&lt;br /&gt;
Some of the other fields are still unknown/unobserved.&lt;br /&gt;
&lt;br /&gt;
Official games will set Mode to 0, Fence to 1 and Unit to 0xF. The QUERY_SEQUENCE value is then written by the GPU to the address pointed to by QUERY_ADDRESS.&lt;br /&gt;
On the CPU side, the game code should wait until the value at the address pointed to by QUERY_ADDRESS is &amp;gt;= to the last written SEQUENCE value. Official code waits for this condition to be true on a loop, and won&#039;t send any further commands before that.&lt;br /&gt;
&lt;br /&gt;
== Vertex Data Submission ==&lt;br /&gt;
&lt;br /&gt;
Note: This is a observation on how the game Puyo Puyo Tetris sends textured squares to the GPU.&lt;br /&gt;
&lt;br /&gt;
# VERTEX_ATTRIB_FORMAT (0-15) are set (only the first 3 are really used, the rest are set float, with Size = 1 and offset at 0).&lt;br /&gt;
# VERTEX_ARRAY_FETCH (0) is set with the lower 12 bits set to 0x1c (Stride) and bit 12 to 1 (Enabled).&lt;br /&gt;
# VERTEX_ARRAY_START_HIGH/LOW (0) are set to the GPU Virtual Address where the Vertex Data is located.&lt;br /&gt;
# VERTEX_ARRAY_LIMIT_HIGH/LOW (0) are set to the GPU Virtual Address where the Vertex Data is located, plus the Vertex Data size in bytes minus 1.&lt;br /&gt;
# VERTEX_BEGIN_GL is used with the primitive type set to TRIANGLE_STRIP.&lt;br /&gt;
# VERTEX_BUFFER_FIRST with value 0 (indicating the index of the first primitive to render?).&lt;br /&gt;
# VERTEX_BUFFER_COUNT is set to 4, because the Vertex Buffer with the square has 4 vertices.&lt;br /&gt;
# VERTEX_END_GL is used with value 0 (currently unknown what this value means).&lt;br /&gt;
&lt;br /&gt;
== Texture View ==&lt;br /&gt;
&lt;br /&gt;
Texture information such as address, format and size is sent to the GPU through a structure know as Texture View (a.k.a. Texture Image Control, or TIC). Each texture that the game uses needs a separate TIC, and those TICs are written to a table, one after the other. Each [[#TIC_Structure|TIC entry]] has 0x20 bytes, and is composed of 8 32-bits words where the texture information is packed.&lt;br /&gt;
&lt;br /&gt;
The index of the TIC entries that should be used by the shader is sent to the GPU with the CB_POS/CB_DATA (0) methods. Games usually follows the following steps to write the TIC entry indexes:&lt;br /&gt;
&lt;br /&gt;
* CB_ADDRESS_HIGH/LOW method is used to set the GPU Virtual Address of the Const Buffer.&lt;br /&gt;
* CB_POS is used to set the write offset of the Const Buffer to 0x20 + n * 4, where &#039;&#039;n&#039;&#039; is the is the index of the active texture that will be used by the shader (?).&lt;br /&gt;
* CB_DATA (0) method is used to write the value into the Const Buffer. The value is a word where the lower 20 bits is the TIC index.&lt;br /&gt;
&lt;br /&gt;
The address of a given TIC entry can be calculates as:&lt;br /&gt;
&lt;br /&gt;
 tic_entry_address = tic_base_address + tic_index * 0x20&lt;br /&gt;
&lt;br /&gt;
Where &#039;&#039;tic_base_address&#039;&#039; is the address written to TIC_ADDRESS_HIGH/LOW (methods 0x1574 and 0x1578), &#039;&#039;tic_index&#039;&#039; is the lower 20 bits of the word written into the Const Buffer with CB_DATA (0), and 0x20 is the size of each TIC entry in bytes.&lt;br /&gt;
&lt;br /&gt;
Note: More research still needs to be done on the Const Buffer and how it is used by the shader.&lt;br /&gt;
&lt;br /&gt;
=== TIC Structure ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Word || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 6-0 || [[GPU_Texture_Formats#Texture_Formats|Texture Format]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 9-7 || [[#Channel_Data_Type|R Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12-10 || [[#Channel_Data_Type|G Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 15-13 || [[#Channel_Data_Type|B Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 18-16 || [[#Channel_Data_Type|A Channel Data Type]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 31-0 || Lower 32-bits of the Texture GPU Virtual Address&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 15-0 || Higher 16-bits of the Texture GPU Virtual Address&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 15-0 || Texture Width minus 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 15-0 || Texture Height minus 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Channel Data Type ====&lt;br /&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;
| 1 || SNORM&lt;br /&gt;
|-&lt;br /&gt;
| 2 || UNORM&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SINT&lt;br /&gt;
|-&lt;br /&gt;
| 4 || UINT&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SNORM_FORCE_FP16&lt;br /&gt;
|-&lt;br /&gt;
| 6 || UNORM_FORCE_FP16&lt;br /&gt;
|-&lt;br /&gt;
| 7 || FLOAT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
FIFO engine overview:&lt;br /&gt;
[https://envytools.readthedocs.io/en/latest/hw/fifo/intro.html]&lt;br /&gt;
&lt;br /&gt;
Method values from the Fermi family GPU (a bit older than the Tegra X1, but values seems to be mostly the same):&lt;br /&gt;
[https://github.com/envytools/envytools/blob/master/rnndb/graph/gf100_3d.xml]&lt;br /&gt;
&lt;br /&gt;
TIC structure used on a Maxwell GPU:&lt;br /&gt;
[https://github.com/envytools/envytools/blob/master/rnndb/graph/gm200_texture.xml]&lt;br /&gt;
&lt;br /&gt;
Values for some types used on the above XML:&lt;br /&gt;
[https://github.com/envytools/envytools/blob/master/rnndb/graph/nv_3ddefs.xml]&lt;br /&gt;
&lt;br /&gt;
Command word packing code used on Mesa3d:&lt;br /&gt;
[https://cgit.freedesktop.org/mesa/mesa/tree/src/gallium/drivers/nouveau/nvc0/nvc0_winsys.h]&lt;br /&gt;
&lt;br /&gt;
TIC entry pack/write code used on Mesa3d:&lt;br /&gt;
[https://cgit.freedesktop.org/mesa/mesa/tree/src/gallium/drivers/nouveau/nvc0/nvc0_tex.c#n65]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=GPU&amp;diff=3607</id>
		<title>GPU</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=GPU&amp;diff=3607"/>
		<updated>2018-02-02T10:05:29Z</updated>

		<summary type="html">&lt;p&gt;OgniK: Likely command list for gpu stuff(unfinished)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Mapping Memory==&lt;br /&gt;
&lt;br /&gt;
First, to map a memory region on the GPU Address Space, caching needs to be disabled by using [[SVC#svcSetMemoryAttribute|svcSetMemoryAttribute]]. The Address passed is the Virtual Address of the region that will be mapped, the size is the region size, and State0/1 are both set to 8 to disable caching of the memory region. This is done to ensure that the GPU can actually &amp;quot;see&amp;quot; the data written there, and it doesn&#039;t get stuck on some cache.&lt;br /&gt;
&lt;br /&gt;
Then, [[NV_services#NVMAP_IOC_CREATE|NVMAP_IOC_CREATE]] is used to create a nvmap object with the desired size. After, [[NV_services#NVMAP_IOC_ALLOC|NVMAP_IOC_ALLOC]] is used to allocate the memory on the GPU Address Space, and map data on the process Address Space into the GPU Address Space, by passing the Virtual Address as the input addr parameter, and also the Handle returned from [[NV_services#NVMAP_IOC_CREATE|NVMAP_IOC_CREATE]]. Lastly, the actual mapping is done by using [[NV_services#NVGPU_AS_IOCTL_MAP_BUFFER_EX|NVGPU_AS_IOCTL_MAP_BUFFER_EX]], and the GPU Virtual Address is returned on the offset parameter. It&#039;s also possible to manually set the offset where the mapping should be made on the GPU Address Space, by passing the address on the &amp;quot;offset&amp;quot; parameter, and setting the bit 0 of the flags parameter to 1. However, for this to work, the desired GPU Virtual Address needs to be previously reserved using [[NV_services#NVGPU_AS_IOCTL_ALLOC_SPACE|NVGPU_AS_IOCTL_ALLOC_SPACE]].&lt;br /&gt;
&lt;br /&gt;
The above process is used to map all data that will be used by the GPU, like Textures, Command Lists (a.k.a. Push Buffers), Vertex/Index buffers and Shaders. They usually have their own mapping, but Command Lists can share the same mapping.&lt;br /&gt;
&lt;br /&gt;
==Commands Submission==&lt;br /&gt;
&lt;br /&gt;
Commands are sent to the GPU through [[NV_services#NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO|NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO]]. This IoCtl command accepts various GpFifo entries, and each GpFifo entry points to a Command List. The GPU Command List is composed of 32-bits words, which usually are Command/Argument pairs.&lt;br /&gt;
&lt;br /&gt;
====Command Word Structure====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Bits&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
|12-0&lt;br /&gt;
|Command/Register Id&lt;br /&gt;
|-&lt;br /&gt;
|15-13&lt;br /&gt;
|Sub Channel&lt;br /&gt;
|-&lt;br /&gt;
|28-16&lt;br /&gt;
|Arguments Count (in 32-bits Words) or Inline Data (see below)&lt;br /&gt;
|-&lt;br /&gt;
|31-29&lt;br /&gt;
|Mode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Command Mode====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Mode&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Sequential Mode - Reads &amp;quot;Argument Count&amp;quot; arguments, while automatically incrementing the Register Id. So, each argument is written to a different register.&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Normal Mode - This is a Command with multiple arguments. Reads &amp;quot;Argument Count&amp;quot; arguments, all belonging to the same Command.&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Inline Mode - Bits 28-16 of the Command Word (where Inline Data is located) contains the Value of the argument written to the register. The next Word is another Command.&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Unobserved, but is valid too.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TODO: Find a better name for the &amp;quot;Normal Mode&amp;quot; and figure out what mode 5 is.&lt;br /&gt;
&lt;br /&gt;
Other mode values are unobserved.&lt;br /&gt;
&lt;br /&gt;
Note: All Commands/Register Id values are multiples of 4, so they are divided by 4 when packing, and multiplied by 4 when unpacking.&lt;br /&gt;
&lt;br /&gt;
==Sub Channel binding==&lt;br /&gt;
&lt;br /&gt;
All Command Id values &amp;lt; 0x100 are special and aren&#039;t fowarded to the engines. The command 0 is used to bind engines to Sub Channels, and needs to be used before commands are submited to the engines.&lt;br /&gt;
&lt;br /&gt;
The command 0 only has one argument, the Engine Id.&lt;br /&gt;
&lt;br /&gt;
====Engine Ids====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Id&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Engine&lt;br /&gt;
|-&lt;br /&gt;
|0x902d&lt;br /&gt;
|2D&lt;br /&gt;
|-&lt;br /&gt;
|0xb197&lt;br /&gt;
|3D&lt;br /&gt;
|-&lt;br /&gt;
|0xb1c0&lt;br /&gt;
|Compute&lt;br /&gt;
|-&lt;br /&gt;
|0xa140&lt;br /&gt;
|Kepler&lt;br /&gt;
|-&lt;br /&gt;
|0xb0b5 &lt;br /&gt;
|DMA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The bits 15-13 of the Command Word contains the Sub Channel index that should be bound.&lt;br /&gt;
&lt;br /&gt;
After binding the required Sub Channels, then the respective values can be used on the &amp;quot;Sub Channel&amp;quot; field of the Command Word to talk with the respective Engines.&lt;br /&gt;
&lt;br /&gt;
==Fences==&lt;br /&gt;
&lt;br /&gt;
Command Lists can contain fences to ensure that commands are executed on the correct order, and subsequent commands are only sent when the previously sent commands were already processed by the GPU. Fences uses the QUERY_* commands, and works like this:&lt;br /&gt;
&lt;br /&gt;
* First, QUERY_ADDRESS_HIGH and QUERY_ADDRESS_LOW commands are added to the Command List, with the High/Low 32 bits part of the 64-bits GPU Virtual Address where the fence is located. This GPU Virtual Address needs to be mapped to the process Virtual Address beforehand.&lt;br /&gt;
* Then, QUERY_SEQUENCE is added with a sequential number. This number is basically a incrementing counter, so the first Command List can have QUERY_SEQUENCE = 1, the next one QUERY_SEQUENCE = 2, 3, 4... and so on.&lt;br /&gt;
* Finally, QUERY_GET is added and contains the mode and other unknown data.&lt;br /&gt;
&lt;br /&gt;
The above commands are added using the Sequential Mode, since the Ids for all those 4 registers are sequential.&lt;br /&gt;
&lt;br /&gt;
====QUERY_GET Structure====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Bits&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
|1-0&lt;br /&gt;
|Mode&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Fence&lt;br /&gt;
|-&lt;br /&gt;
|15-12&lt;br /&gt;
|Unit &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====QUERY_GET Mode====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Value&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Mode&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Write&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Sync&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Write ? &lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Write ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
TODO: Move this to a separate page with all GPU Commands with descriptions. Also figure out what the other values mean.&lt;br /&gt;
&lt;br /&gt;
Some of the other fields are still unknown/unobserved.&lt;br /&gt;
&lt;br /&gt;
Official games will set Mode to 0, Fence to 1 and Unit to 0xF. The QUERY_SEQUENCE value is then written by the GPU to the address pointed to by QUERY_ADDRESS.&lt;br /&gt;
On the CPU side, the game code should wait until the value at the address pointed to by QUERY_ADDRESS is &amp;gt;= to the last written SEQUENCE value. Official code waits for this condition to be true on a loop, and won&#039;t send any further commands before that.&lt;br /&gt;
&lt;br /&gt;
==Vertex Data Submission==&lt;br /&gt;
&lt;br /&gt;
Note: This is a observation on how the game Puyo Puyo Tetris sends textured squares to the GPU.&lt;br /&gt;
&lt;br /&gt;
# VERTEX_ATTRIB_FORMAT (0-15) are set (only the first 3 are really used, the rest are set float, with Size = 1 and offset at 0).&lt;br /&gt;
# VERTEX_ARRAY_FETCH (0) is set with the lower 12 bits set to 0x1c (Stride) and bit 12 to 1 (Enabled).&lt;br /&gt;
# VERTEX_ARRAY_START_HIGH/LOW (0) are set to the GPU Virtual Address where the Vertex Data is located.&lt;br /&gt;
# VERTEX_ARRAY_LIMIT_HIGH/LOW (0) are set to the GPU Virtual Address where the Vertex Data is located, plus the Vertex Data size in bytes minus 1.&lt;br /&gt;
# VERTEX_BEGIN_GL is used with the primitive type set to TRIANGLE_STRIP.&lt;br /&gt;
# VERTEX_BUFFER_FIRST with value 0 (indicating the index of the first primitive to render?).&lt;br /&gt;
# VERTEX_BUFFER_COUNT is set to 4, because the Vertex Buffer with the square has 4 vertices.&lt;br /&gt;
# VERTEX_END_GL is used with value 0 (currently unknown what this value means).&lt;br /&gt;
&lt;br /&gt;
==Command List==&lt;br /&gt;
&lt;br /&gt;
These still need to be heavily verified and &#039;&#039;could&#039;&#039; be wrong&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Command || ID/Register || Sub Channel || Arg Count || Mode || Command Name&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0020E00 || 0xE00 || 0 || 2 || 5 || BeginTransformFeedback&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0030E30 || 0xE30 || 0 || 3 || 5 || DrawArrays&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0050E36 || 0xE36 || 0 || 5 || 5 || DrawElements&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0020E2E || 0xE2E || 0 || 2 || 5 || PopDebugGroupId&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0040E2C || 0xE2C || 0 || 4 || 5 || PushDebugGroup&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001054C || 0x54C || 0 || 1 || 1 || ResetCounter&lt;br /&gt;
|-&lt;br /&gt;
| 0x8001047F || 0x47F || 0 || 1 || 4 || ResolveDepthBuffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x200104C4 || 0x4C4 || 0 || 1 || 1 || SetAlphaRef&lt;br /&gt;
|-&lt;br /&gt;
| 0x200404C7 || 0x4C7 || 0 || 4 || 1 || SetBlendColor&lt;br /&gt;
|-&lt;br /&gt;
| 0x2001064F || 0x6F4 || 0 || 1 || 1 || SetDepthClamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x200200CD || 0xCD || 0 || 2 || 1 || SetInnerTessellationLevels&lt;br /&gt;
|-&lt;br /&gt;
| 0x200204EC || 0x4EC || 0 || 2 || 1 || SetLineWidth&lt;br /&gt;
|-&lt;br /&gt;
| 0x200400C9 || 0xC9 || 0 || 4 || 1 || SetOuterTessellationLevels&lt;br /&gt;
|-&lt;br /&gt;
| 0x8???0373 || 0x373 || 0 || Variable || 4 || SetPatchSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20010546 || 0x546 || 0 || 1 || 1 || SetPointSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20030554 || 0x554 || 0 || 3 || 1 || SetRenderEnableConditional&lt;br /&gt;
|-&lt;br /&gt;
| 0x200403EF || 0x3EF || 0 || 4 || 1 || SetSampleMask&lt;br /&gt;
|-&lt;br /&gt;
| 0x200103D9 || 0x3D9 || 0 || 1 || 1 || SetTiledCacheTileSize&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
Check out those pages for more useful data.&lt;br /&gt;
&lt;br /&gt;
Register Id values from the Fermi family GPU (a bit older than the Tegra X1, but values seems to be mostly the same):&lt;br /&gt;
[https://github.com/envytools/envytools/blob/master/rnndb/graph/gf100_3d.xml]&lt;br /&gt;
&lt;br /&gt;
Values for some types used on the above XML:&lt;br /&gt;
[https://github.com/envytools/envytools/blob/master/rnndb/graph/nv_3ddefs.xml]&lt;br /&gt;
&lt;br /&gt;
Command Word packing code used on Mesa3d:&lt;br /&gt;
[https://cgit.freedesktop.org/mesa/mesa/tree/src/gallium/drivers/nouveau/nvc0/nvc0_winsys.h]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=3569</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=3569"/>
		<updated>2018-01-25T07:10:40Z</updated>

		<summary type="html">&lt;p&gt;OgniK: svcBreak BreakReason&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 || W0=result&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=out, X2=out&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2 || 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 || 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 || 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;
|-&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=event_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 || W0=thread_handle || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || ?&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]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&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;
|- style=&amp;quot;border-top: double&amp;quot;&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 || W0=thread_handle, W1=[[#ThreadContext]]* || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] || X0=ptr, W1=type, X2=? X3=timeout ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] || X0=ptr, W1=type, X2=? W3=? ||&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=client_handle ?, W2=server_handle ?&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateJitMemory]] || X1=addr, X2=size || W0=result, W1=jit_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcMapJitMemory]] || W0=jit_handle, W1=[[#MapJitOperation]], 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 || W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id || 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, W1=[[#ThreadContextFlags]], X2=ThreadContext* || 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, 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;
| 0x70 || svcCreatePort || W2=max_sessions, W3=unk_bool, X4=name_ptr || W0=result, W1=clientport_handle, W2=serverport_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=srcaddr, W1=process_handle, X2=dstaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || W0=process_handle, X1=dstaddr, 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, X2=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 || 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 0x2000000.&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;
[2.0.0+] Size must be less than 0x18000000.&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;
If dstaddr &amp;gt;= LowerTreshold, the dst-range is enforced to be within the process&#039; &amp;quot;MapRegion&amp;quot;. Code can get the range of this region from [[#svcGetInfo]] id0=2,3.&lt;br /&gt;
&lt;br /&gt;
In this case, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
As long as (dstaddr+size) &amp;lt; LowerThreshold, then you can map anywhere but the mapped memory will have state 0x482907 instead.&lt;br /&gt;
&lt;br /&gt;
LowerTreshold is 0x80000000 for 36-bit address spaces, and 0x40000000 for 32-bit ones.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Support for the 0x482907 mappings outside the &amp;quot;MapRegion&amp;quot; were removed.&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;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Nano&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&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 nano=0 means &amp;quot;yield thread&amp;quot;.&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;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || 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 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || 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;
! 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 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&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;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40, error on num_handles == 0.&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;Port:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Session (server-side):&#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;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signalled before the timeout expired. Handle index is updated to indicate which object signalled.&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;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signalled within the timeout. Handle index is not updated.&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 must be 0x1000-aligned.&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) ? || ? || ?&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When used on retail where inx0 bit31 is clear, the system will throw a [[Error_codes|fatal-error]]. Otherwise when bit31 is set, it will return 0 and notify the debugger?&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) 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;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || MapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || MapRegionSize&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 || TotalMemoryUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalHeapUsage&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+] NewMapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] NewMapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] IsVirtualAddressMemoryEnabled&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] Some size in bytes.&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+] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0+] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0 || Performance counter related.&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;
== 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;
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;
== svcCreateJitMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the JIT memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcMapJitMemory ==&lt;br /&gt;
Maps the backing memory for a JIT memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#MapJitOperation|MapJitOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#MapJitOperation|MapJitOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#MapJitOperation|MapJitOperation_UnmapOwner/MapJitOperation_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 memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&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;
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;
&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;
== 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;
== 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;
== 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 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || DstAddr&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) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || 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 [[#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 || u64 || 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;
&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;
== 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;
= Enum/Structures =&lt;br /&gt;
== ThreadContextRequestFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || NormalContext&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 ||&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;
== MapJitOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || MapJitOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MapJitOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || MapJitOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MapJitOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessEvent ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessEvent_Created&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessEvent_DebugAttached&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessEvent_DebugDetached&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessEvent_Crashed&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessEvent_Running&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessEvent_Exiting&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessEvent_Exited&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessEvent_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_ActualPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_CpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_CoreMask&lt;br /&gt;
|}&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;
| 0 || 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 || || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsSystem&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 ||&lt;br /&gt;
|}&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 || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed&lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcMapped: when IpcRefCount &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceMapped: 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_Type0&lt;br /&gt;
|-&lt;br /&gt;
| 11 || IpcSendAllowed_Type3&lt;br /&gt;
|-&lt;br /&gt;
| 12 || IpcSendAllowed_Type1&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+] JitMemoryAllowed&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_WeirdSharedMemory || 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_IpcBuffer0]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_MappedMemory || 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_IpcBuffer1]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_IpcBuffer3]] || 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_JitReadOnly || Mapped in kernel during [[#svcMapJitMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_JitWritable || Mapped in kernel during [[#svcMapJitMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&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;
&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 || u64 || Type (0=PausedThread, 1=RunningThread, 2=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 || u64 || 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 ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_Exit&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_UndefinedInstruction&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;
&lt;br /&gt;
UndefinedInstruction 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;
There is userland code for handling exceptions, however this doesn&#039;t seem to be executed on retail mode.&lt;br /&gt;
&lt;br /&gt;
When a usermode exception occurs, it jumps to the main code binary entrypoint (main_binary_address + 0 == &#039;&#039;&#039;_start&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
During normal boot &#039;&#039;&#039;_start&#039;&#039;&#039; is invoked with X0=0 and X1=main_thread_handle (triggering normal crt0 setup).&lt;br /&gt;
During an usermode exception &#039;&#039;&#039;_start&#039;&#039;&#039; is invoked with X0=exception_info0_ptr and X1=exception_info1_ptr instead.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;_start&#039;&#039;&#039; method determines whether to boot normally or handle an exception if X0 is set to 0 or not.&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=3568</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=3568"/>
		<updated>2018-01-25T07:09:25Z</updated>

		<summary type="html">&lt;p&gt;OgniK: svcBreak&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 || W0=result&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=out, X2=out&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2 || 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 || 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 || 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;
|-&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=event_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 || W0=thread_handle || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0,X1,X2=info || ?&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]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&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;
|- style=&amp;quot;border-top: double&amp;quot;&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 || W0=thread_handle, W1=[[#ThreadContext]]* || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] || X0=ptr, W1=type, X2=? X3=timeout ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] || X0=ptr, W1=type, X2=? W3=? ||&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=client_handle ?, W2=server_handle ?&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateJitMemory]] || X1=addr, X2=size || W0=result, W1=jit_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcMapJitMemory]] || W0=jit_handle, W1=[[#MapJitOperation]], 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 || W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id || 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, W1=[[#ThreadContextFlags]], X2=ThreadContext* || 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, 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;
| 0x70 || svcCreatePort || W2=max_sessions, W3=unk_bool, X4=name_ptr || W0=result, W1=clientport_handle, W2=serverport_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=srcaddr, W1=process_handle, X2=dstaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || W0=process_handle, X1=dstaddr, 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, X2=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 || 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 0x2000000.&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;
[2.0.0+] Size must be less than 0x18000000.&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;
If dstaddr &amp;gt;= LowerTreshold, the dst-range is enforced to be within the process&#039; &amp;quot;MapRegion&amp;quot;. Code can get the range of this region from [[#svcGetInfo]] id0=2,3.&lt;br /&gt;
&lt;br /&gt;
In this case, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
As long as (dstaddr+size) &amp;lt; LowerThreshold, then you can map anywhere but the mapped memory will have state 0x482907 instead.&lt;br /&gt;
&lt;br /&gt;
LowerTreshold is 0x80000000 for 36-bit address spaces, and 0x40000000 for 32-bit ones.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Support for the 0x482907 mappings outside the &amp;quot;MapRegion&amp;quot; were removed.&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;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Nano&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&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 nano=0 means &amp;quot;yield thread&amp;quot;.&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;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || 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 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || 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;
! 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 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&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;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40, error on num_handles == 0.&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;Port:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Session (server-side):&#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;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signalled before the timeout expired. Handle index is updated to indicate which object signalled.&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;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signalled within the timeout. Handle index is not updated.&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 must be 0x1000-aligned.&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 ||&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) ? || ? || ?&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When used on retail where inx0 bit31 is clear, the system will throw a [[Error_codes|fatal-error]]. Otherwise when bit31 is set, it will return 0 and notify the debugger?&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) 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;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || MapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || MapRegionSize&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 || TotalMemoryUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalHeapUsage&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+] NewMapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] NewMapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] IsVirtualAddressMemoryEnabled&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] Some size in bytes.&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+] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0+] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0 || Performance counter related.&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;
== 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;
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;
== svcCreateJitMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the JIT memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcMapJitMemory ==&lt;br /&gt;
Maps the backing memory for a JIT memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#MapJitOperation|MapJitOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#MapJitOperation|MapJitOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#MapJitOperation|MapJitOperation_UnmapOwner/MapJitOperation_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 memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&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;
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;
&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;
== 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;
== 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;
== 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 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || DstAddr&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) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || 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 [[#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 || u64 || 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;
&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;
== 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;
= Enum/Structures =&lt;br /&gt;
== ThreadContextRequestFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || NormalContext&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 ||&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;
== MapJitOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || MapJitOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MapJitOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || MapJitOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MapJitOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessEvent ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessEvent_Created&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessEvent_DebugAttached&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessEvent_DebugDetached&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessEvent_Crashed&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessEvent_Running&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessEvent_Exiting&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessEvent_Exited&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessEvent_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_ActualPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_CpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_CoreMask&lt;br /&gt;
|}&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;
| 0 || 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 || || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsSystem&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 ||&lt;br /&gt;
|}&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 || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed&lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcMapped: when IpcRefCount &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceMapped: 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_Type0&lt;br /&gt;
|-&lt;br /&gt;
| 11 || IpcSendAllowed_Type3&lt;br /&gt;
|-&lt;br /&gt;
| 12 || IpcSendAllowed_Type1&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+] JitMemoryAllowed&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_WeirdSharedMemory || 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_IpcBuffer0]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_MappedMemory || 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_IpcBuffer1]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_IpcBuffer3]] || 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_JitReadOnly || Mapped in kernel during [[#svcMapJitMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_JitWritable || Mapped in kernel during [[#svcMapJitMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&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;
&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 || u64 || Type (0=PausedThread, 1=RunningThread, 2=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 || u64 || 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 ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_Exit&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_UndefinedInstruction&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;
&lt;br /&gt;
UndefinedInstruction 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;
There is userland code for handling exceptions, however this doesn&#039;t seem to be executed on retail mode.&lt;br /&gt;
&lt;br /&gt;
When a usermode exception occurs, it jumps to the main code binary entrypoint (main_binary_address + 0 == &#039;&#039;&#039;_start&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
During normal boot &#039;&#039;&#039;_start&#039;&#039;&#039; is invoked with X0=0 and X1=main_thread_handle (triggering normal crt0 setup).&lt;br /&gt;
During an usermode exception &#039;&#039;&#039;_start&#039;&#039;&#039; is invoked with X0=exception_info0_ptr and X1=exception_info1_ptr instead.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;_start&#039;&#039;&#039; method determines whether to boot normally or handle an exception if X0 is set to 0 or not.&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=NV_services&amp;diff=3469</id>
		<title>NV services</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=NV_services&amp;diff=3469"/>
		<updated>2018-01-19T03:50:27Z</updated>

		<summary type="html">&lt;p&gt;OgniK: /* nvmemp */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Switch uses a customized NVIDIA driver.&lt;br /&gt;
&lt;br /&gt;
= nvdrv, nvdrv:a, nvdrv:s, nvdrv:t =&lt;br /&gt;
Main NVIDIA driver service.&lt;br /&gt;
&lt;br /&gt;
Each service is used by:&lt;br /&gt;
* &amp;quot;nvdrv&amp;quot;: regular applications&lt;br /&gt;
* &amp;quot;nvdrv:a&amp;quot;: applets&lt;br /&gt;
* &amp;quot;nvdrv:s&amp;quot;: sysmodules&lt;br /&gt;
* &amp;quot;nvdrv:t&amp;quot;: factory titles&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#Open]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#Ioctl]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [[#Close]]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [[#Initialize]]&lt;br /&gt;
|-&lt;br /&gt;
| 4 || [[#QueryEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [[#MapSharedMem]]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || [[#GetStatus]]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || [[#ForceSetClientPID]]&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#SetClientPID]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || [[#DumpGraphicsMemoryInfo]]&lt;br /&gt;
|-&lt;br /&gt;
| 10 || [3.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 11 || [3.0.0+] [[#Ioctl2]]&lt;br /&gt;
|-&lt;br /&gt;
| 12 || [3.0.0+] [[#Ioctl3]]&lt;br /&gt;
|-&lt;br /&gt;
| 13 || [3.0.0+]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Open ==&lt;br /&gt;
Takes a type-0x5 input buffer for the device-path. Returns the output 32bit &#039;&#039;&#039;fd&#039;&#039;&#039; and the u32 &#039;&#039;&#039;error_code&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Ioctl ==&lt;br /&gt;
Takes a 32bit &#039;&#039;&#039;fd&#039;&#039;&#039;, an u32 &#039;&#039;&#039;ioctl_cmd&#039;&#039;&#039;, a type-0x21 input buffer, and a type-0x22 output buffer. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
The addr/size for send/recv buffers are only set when the associated direction bit is set in the ioctl cmd (addr/size = 0 otherwise).&lt;br /&gt;
&lt;br /&gt;
== Close ==&lt;br /&gt;
Takes a 32bit &#039;&#039;&#039;fd&#039;&#039;&#039;. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Initialize ==&lt;br /&gt;
Takes two copy-handles (&#039;&#039;&#039;current_process&#039;&#039;&#039; and &#039;&#039;&#039;transfer_memory&#039;&#039;&#039;) and an input u32 (&#039;&#039;&#039;transfer_memory_size&#039;&#039;&#039;). Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Webkit applet creates the transfer-memory with perm = 0 and size 0x300000.&lt;br /&gt;
&lt;br /&gt;
== QueryEvent ==&lt;br /&gt;
Takes two input u32s (&#039;&#039;&#039;fd&#039;&#039;&#039; and &#039;&#039;&#039;event_id&#039;&#039;&#039;), with the second word immediately after the first one. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;) and a copy-handle (&#039;&#039;&#039;event_handle&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== MapSharedMem ==&lt;br /&gt;
Takes a copy-handle (&#039;&#039;&#039;transfer_memory&#039;&#039;&#039;) and two input u32s (&#039;&#039;&#039;fd&#039;&#039;&#039; and &#039;&#039;&#039;nvmap_handle&#039;&#039;&#039;). Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== GetStatus ==&lt;br /&gt;
Takes no input. Returns 0x10-bytes and an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== ForceSetClientPID ==&lt;br /&gt;
Takes an input u64 which must [[IPC_Marshalling|match]] the user-process PID ([[AM_services|AppletResourceUserId]]). Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== SetClientPID ==&lt;br /&gt;
Takes a PID-descriptor and an u64 which must [[IPC_Marshalling|match]] the user-process PID ([[AM_services|AppletResourceUserId]]). Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== DumpGraphicsMemoryInfo ==&lt;br /&gt;
No input or output. Does nothing.&lt;br /&gt;
&lt;br /&gt;
== Cmd10 ==&lt;br /&gt;
Takes a copy-handle and an input u32. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Ioctl2 ==&lt;br /&gt;
Takes a type-0x21 buffer, a type-0x22 buffer, a type-0x21 buffer, and two input u32s. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Ioctl3 ==&lt;br /&gt;
Same input/output as Ioctl2, except cmdhdr_word1 is 0x100B instead of 0xC0B.&lt;br /&gt;
&lt;br /&gt;
== Cmd13 ==&lt;br /&gt;
Takes an input u64. No output.&lt;br /&gt;
&lt;br /&gt;
Official user-processes starting with 3.0.0 now use this at the end of nvdrv service init with value 0x1.&lt;br /&gt;
&lt;br /&gt;
= Ioctls =&lt;br /&gt;
The ioctl number is generated with the following primitive (see Linux kernel):&lt;br /&gt;
&lt;br /&gt;
 #define _IOC(inout, group, num, len) \&lt;br /&gt;
    (inout | ((len &amp;amp; IOCPARM_MASK) &amp;lt;&amp;lt; 16) | ((group) &amp;lt;&amp;lt; 8) | (num))&lt;br /&gt;
&lt;br /&gt;
The following table contains known ioctls.&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080014 || Inout || 8 || [[#NVHOST_IOCTL_CTRL_SYNCPT_READ]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040015 || In || 4 || [[#NVHOST_IOCTL_CTRL_SYNCPT_INCR]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC00C0016 || Inout || 12 || [[#NVHOST_IOCTL_CTRL_SYNCPT_WAIT]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080017 || In || 8 || [[#NVHOST_IOCTL_CTRL_MODULE_MUTEX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0180018 || Inout || 24 || [[#NVHOST_IOCTL_CTRL_MODULE_REGRDWR]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0100019 || Inout || 16 || [[#NVHOST_IOCTL_CTRL_SYNCPT_WAITEX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC008001A || Inout || 8 || [[#NVHOST_IOCTL_CTRL_SYNCPT_READ_MAX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC183001B || Inout || 387 || [[#NVHOST_IOCTL_CTRL_GET_CONFIG]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004001C || Inout || 4 || [[#NVHOST_IOCTL_CTRL_EVENT_SIGNAL]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010001D || Inout || 16 || [[#NVHOST_IOCTL_CTRL_EVENT_WAIT]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010001E || Inout || 16 || [[#NVHOST_IOCTL_CTRL_EVENT_WAIT_ASYNC]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004001F || Inout || 4 || [[#NVHOST_IOCTL_CTRL_EVENT_REGISTER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0040020 || Inout || 4 || [[#NVHOST_IOCTL_CTRL_EVENT_UNREGISTER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080021 || In || 8 || [[#NVHOST_IOCTL_CTRL_EVENT_KILL]] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_READ ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 id;&lt;br /&gt;
    __out u32 value;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_INCR ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_WAIT ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
    __in u32 thresh;&lt;br /&gt;
    __in s32 timeout;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_MODULE_MUTEX ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
    __in u32 lock;        // (0==unlock; 1==lock)&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_MODULE_REGRDWR ===&lt;br /&gt;
Identical to Linux driver. Uses 32-bit version and doesn&#039;t work.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
    __in u32 num_offsets;&lt;br /&gt;
    __in u32 block_size;&lt;br /&gt;
    __in u32 offsets;&lt;br /&gt;
    __in u32 values;&lt;br /&gt;
    __in u32 write;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_WAITEX ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 id;&lt;br /&gt;
    __in  u32 thresh;&lt;br /&gt;
    __in  s32 timeout;&lt;br /&gt;
    __out u32 value;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_READ_MAX ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 id;&lt;br /&gt;
    __out u32 value;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_GET_CONFIG ===&lt;br /&gt;
Gets configured settings. Not available in production mode.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in char domain_str[0x41];       // &amp;quot;nv&amp;quot;&lt;br /&gt;
    __in char param_str[0x41];&lt;br /&gt;
    __out char config_str[0x101];&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_SIGNAL ===&lt;br /&gt;
Signals an user event. Exclusive to the Switch.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 user_event_id;      // ranges from 0x00 to 0x3F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_WAIT ===&lt;br /&gt;
Waits on an event. If waiting fails, returns error code 0x05 (Timeout) and sets &#039;&#039;&#039;value&#039;&#039;&#039; to ((&#039;&#039;&#039;syncpt_id&#039;&#039;&#039; &amp;lt;&amp;lt; 0x10) | 0x10000000).&lt;br /&gt;
&lt;br /&gt;
Depending on &#039;&#039;&#039;threshold&#039;&#039;&#039;, an &#039;&#039;&#039;user_event_id&#039;&#039;&#039; may be returned for using with other event ioctls.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u32 syncpt_id;&lt;br /&gt;
    __in    u32 threshold;&lt;br /&gt;
    __in    s32 timeout;&lt;br /&gt;
    __inout u32 value;           // in=user_event_id (ignored); out=syncpt_value or user_event_id&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_WAIT_ASYNC ===&lt;br /&gt;
Waits on an event (async version). If waiting fails, returns error code 0x0B (BadValue).&lt;br /&gt;
&lt;br /&gt;
Depending on &#039;&#039;&#039;threshold&#039;&#039;&#039;, an &#039;&#039;&#039;user_event_id&#039;&#039;&#039; may be returned for using with other event ioctls.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u32 syncpt_id;&lt;br /&gt;
    __in    u32 threshold;&lt;br /&gt;
    __in    u32 timeout;&lt;br /&gt;
    __inout u32 value;           // in=user_event_id (ignored); out=syncpt_value or user_event_id&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_REGISTER ===&lt;br /&gt;
Registers an user event. Exclusive to the Switch. &lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 user_event_id;      // ranges from 0x00 to 0x3F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_UNREGISTER ===&lt;br /&gt;
Unregisters an user event. Exclusive to the Switch. &lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 user_event_id;      // ranges from 0x00 to 0x3F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_KILL ===&lt;br /&gt;
Kills user events. Exclusive to the Switch. &lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 user_events;       // 64-bit bitfield where each bit represents one event&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
== /dev/nvmap ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080101 || Inout || 8 || [[#NVMAP_IOC_CREATE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000102 || - || 0 || NVMAP_IOC_CLAIM || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080103 || Inout || 8 || [[#NVMAP_IOC_FROM_ID]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0200104 || Inout || 32 || [[#NVMAP_IOC_ALLOC]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0180105 || Inout || 24 || [[#NVMAP_IOC_FREE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0280106 || Inout || 40 || NVMAP_IOC_MMAP || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0280107 || Inout || 40 || NVMAP_IOC_WRITE || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0280108 || Inout || 40 || NVMAP_IOC_READ || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC00C0109 || Inout || 12 || [[#NVMAP_IOC_PARAM]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010010A || Inout || 16 || NVMAP_IOC_PIN_MULT || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010010B || Inout || 16 || NVMAP_IOC_UNPIN_MULT || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC008010C || Inout || 8 || NVMAP_IOC_CACHE || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004010D || Inout || 4 || || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC008010E || Inout || 8 || [[#NVMAP_IOC_GET_ID]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004010F || Inout || 4 || || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040110 || In || 4 || || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000111 || - || 0 || || Returns NotSupported&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_CREATE ===&lt;br /&gt;
Creates an nvmap object. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 size;&lt;br /&gt;
    __out u32 handle;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_FROM_ID ===&lt;br /&gt;
Get handle to an existing nvmap object. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 id;&lt;br /&gt;
    __out u32 handle;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_ALLOC ===&lt;br /&gt;
Allocate memory for the nvmap object. Nintendo extended this one with 16 bytes, and changed it from in to inout.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 handle;&lt;br /&gt;
    __in u32 heapmask;&lt;br /&gt;
    __in u32 flags;    // (0=read-only, 1=read-write)&lt;br /&gt;
    __in u32 align;&lt;br /&gt;
    __in u8  kind;&lt;br /&gt;
    u8       pad[7];&lt;br /&gt;
    __in u64 addr;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_FREE ===&lt;br /&gt;
This one is completely custom. Partly because the Linux driver passed the handle as the ioctl &amp;quot;arg-ptr&amp;quot;, and HIPC can&#039;t handle that voodoo.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 handle;&lt;br /&gt;
    u32       pad;&lt;br /&gt;
    __out u64 refcount;&lt;br /&gt;
    __out u32 size;&lt;br /&gt;
    __out u32 flags;    // 1=NOT_FREED_YET&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_PARAM ===&lt;br /&gt;
Returns info about a nvmap object. Identical to Linux driver, but extended with further params.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 handle;&lt;br /&gt;
    __in  u32 param;  // 1=SIZE, 2=ALIGNMENT, 3=BASE (returns error), 4=HEAP (always 0x40000000), 5=KIND, 6=COMPR (unused)&lt;br /&gt;
    __out u32 result;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_GET_ID ===&lt;br /&gt;
Returns an id for a nvmap object. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u32 id; //~0 indicates error&lt;br /&gt;
    __in  u32 handle;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
== /dev/nvdisp-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x80040212 || Out || 4 || TEGRA_DC_EXT_CONTROL_GET_NUM_OUTPUTS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0140213 || Inout || 20 || TEGRA_DC_EXT_CONTROL_GET_OUTPUT_PROPERTIES ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC1100214 || Inout || 272 || TEGRA_DC_EXT_CONTROL_GET_OUTPUT_EDID ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0040216 || Inout || 4 || TEGRA_DC_EXT_CONTROL_SET_EVENT0 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0040217 || Inout || 4 || TEGRA_DC_EXT_CONTROL_SET_EVENT1 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0100218 || Inout || 16 || TEGRA_DC_EXT_CONTROL_SET_EVENT2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0100219 || Inout || 16 || TEGRA_DC_EXT_CONTROL_SET_EVENT3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0040220 || Inout || 4 || TEGRA_DC_EXT_CONTROL_SET_EVENT4 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvdisp-disp0, /dev/nvdisp-disp1 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040201 || In || 4 || TEGRA_DC_EXT_GET_WINDOW ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040202 || In || 4 || TEGRA_DC_EXT_PUT_WINDOW ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC4C80203 || In || 1224 || TEGRA_DC_EXT_FLIP ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80380204 || Out || 56 || TEGRA_DC_EXT_GET_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40380205 || Out || 56 || TEGRA_DC_EXT_SET_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x430C0206 || In || 780 || TEGRA_DC_EXT_SET_LUT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010207 || In || 1 || TEGRA_DC_EXT_ENABLE_DISABLE_CRC ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80040208 || Out || 4 || TEGRA_DC_EXT_GET_CRC ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80040209 || Out || 4 || TEGRA_DC_EXT_GET_HEAD_STATUS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC038020A || Inout || 56 || TEGRA_DC_EXT_VALIDATE_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4018020B || In || 24 || TEGRA_DC_EXT_SET_CSC ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004020C || Inout || 4 || TEGRA_DC_EXT_GET_VBLANK_SYNCPT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8040020D || Out || 64 || TEGRA_DC_EXT_GET_UNDERFLOWS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC99A020E || Inout || 2458 || TEGRA_DC_EXT_SET_CMU ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004020F || Inout || 4 || TEGRA_DC_EXT_DPMS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80600210 || Out || 96 || TEGRA_DC_EXT_GET_AVI_INFOFRAME ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40600211 || In || 96 || TEGRA_DC_EXT_SET_AVI_INFOFRAME ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xEBFC0215 || Inout || 11260 || TEGRA_DC_EXT_GET_MODE_DB ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC003021A || Inout || 3 || TEGRA_DC_EXT_PANEL_GET_VENDOR_ID ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x803C021B || Out || 60 || TEGRA_DC_EXT_GET_MODE2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x403C021C || In || 60 || TEGRA_DC_EXT_SET_MODE2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC03C021D || Inout || 60  || TEGRA_DC_EXT_VALIDATE_MODE2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xEF20021E || Inout || 12064 || TEGRA_DC_EXT_GET_MODE_DB2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004021F || Inout || 4 || TEGRA_DC_EXT_GET_WINMASK ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvcec-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010300 || In || 1 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010301 || In || 1 || NVCEC_CTRL_ENABLE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x804C0302 || Out || 76 || NVCEC_CTRL_GET_PADDR ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040303 || In || 4 || NVCEC_CTRL_SET_LADDR ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC04C0304 || Inout || 76 || NVCEC_CTRL_WRITE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC04C0305 || Inout || 76 || NVCEC_CTRL_READ ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x804C0306 || Out || 76 || NVCEC_CTRL_GET_CONNECTION_STATUS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x804C0307 || Out || 76 || NVCEC_CTRL_GET_WRITE_STATUS ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhdcp_up-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC4880401 || Inout || 1160 || TEGRAIO_NVHDCP_READ_M ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC4880402 || Inout || 1160 || TEGRAIO_NVHDCP_READ_S ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010403 || In || 1 || TEGRAIO_NVHDCP_ON_OFF ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvdcutil-disp0, /dev/nvdcutil-disp1 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010501 || In || 1 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010502 || In || 1 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x42040503 || In || 1056 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x803C0504 || Out || 60 || NVDCUTIL_DISP_IOCTL_GET_DISPLAY_INFO ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvsched-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000601 || - || 0 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000602 || - || 0 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40180603 || In || 1056 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40180604 || In || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080605 || In || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80080606 || Out || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80080607 || Out || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40180608 || In || 24 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100609 || In || 16 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4010060A || In || 16 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008060B || In || 8 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8001060C || Out || 1 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8010060D || Out || 16 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x400C060E || In || 12 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008060F || In || 8 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100610 || In || 16 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100611 || In || 16 || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nverpt-ctrl ==&lt;br /&gt;
Added in firmware version 4.0.0.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC1280701 || Inout || 296 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xCF580702 || Inout || 3928 || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-as-gpu ==&lt;br /&gt;
Each fd opened to this device creates an address space. An address space is then later bound with a channel.&lt;br /&gt;
&lt;br /&gt;
Once a nvgpu channel has been bound to an address space it cannot be unbound. There is no support for allowing an nvgpu channel to change from one address space to another (or from one to none).&lt;br /&gt;
                                                                                                                              &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044101 || In || 4 || [[#NVGPU_AS_IOCTL_BIND_CHANNEL]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0184102 || Inout || 24 || [[#NVGPU_AS_IOCTL_ALLOC_SPACE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0104103 || Inout || 16 || [[#NVGPU_AS_IOCTL_FREE_SPACE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0184104 || Inout || 24 || [[#NVGPU_AS_IOCTL_MAP_BUFFER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0084105 || Inout || 8 || [[#NVGPU_AS_IOCTL_UNMAP_BUFFER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0284106 || Inout || 40 || [[#NVGPU_AS_IOCTL_MAP_BUFFER_EX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40104107 || In || 16 || [[#NVGPU_AS_IOCTL_INITIALIZE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0404108 || Inout || 64 || [[#NVGPU_AS_IOCTL_GET_VA_REGIONS]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40284109 || In || 40 || [[#NVGPU_AS_IOCTL_INITIALIZE_EX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??4114 || Inout || Variable || [[#NVGPU_AS_IOCTL_REMAP]] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_BIND_CHANNEL ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 fd;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_ALLOC_SPACE ===&lt;br /&gt;
This one reserves pages in the device address space.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 pages;&lt;br /&gt;
    __in u32 page_size;&lt;br /&gt;
    __in u32 flags;&lt;br /&gt;
    u32      pad;&lt;br /&gt;
    union {&lt;br /&gt;
      __out u64 offset;&lt;br /&gt;
      __in  u64 align;&lt;br /&gt;
    };&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_FREE_SPACE ===&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 offset;&lt;br /&gt;
    __in u32 pages;&lt;br /&gt;
    __in u32 page_size;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_MAP_BUFFER ===&lt;br /&gt;
Map a memory region in the device address space. Identical to Linux driver pretty much.&lt;br /&gt;
&lt;br /&gt;
On success, the mapped memory region is locked by having [[SVC#MemoryState]] bit34 set.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u32 flags;        // bit0: fixed_offset, bit2: cacheable&lt;br /&gt;
    u32         pad;&lt;br /&gt;
    __in    u32 nvmap_handle;&lt;br /&gt;
    __inout u32 page_size;    // 0 means don&#039;t care&lt;br /&gt;
    union {&lt;br /&gt;
      __out u64 offset;&lt;br /&gt;
      __in  u64 align;&lt;br /&gt;
    };&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_MAP_BUFFER_EX ===&lt;br /&gt;
Map a memory region in the device address space. Identical to Linux driver pretty much.&lt;br /&gt;
&lt;br /&gt;
On success, the mapped memory region is locked by having [[SVC#MemoryState]] bit34 set.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u32 flags;          // bit0: fixed_offset, bit2: cacheable&lt;br /&gt;
    __in    u32 kind;           // -1 is default&lt;br /&gt;
    __in    u32 nvmap_handle;&lt;br /&gt;
    __inout u32 page_size;      // 0 means don&#039;t care&lt;br /&gt;
    __in    u64 buffer_offset;&lt;br /&gt;
    __in    u64 mapping_size;&lt;br /&gt;
    __inout   u64 offset;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_UNMAP_BUFFER ===&lt;br /&gt;
Unmap a memory region from the device address space.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __in u64 offset;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_INITIALIZE ===&lt;br /&gt;
Nintendo&#039;s custom implementation of NVGPU_GPU_IOCTL_ALLOC_AS (unavailable).&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 big_page_size;   // depends on GPU&#039;s available_big_page_sizes; 0=default&lt;br /&gt;
    __in s32 as_fd;           // ignored; passes 0&lt;br /&gt;
    __in u32 flags;           // ignored; passes 0&lt;br /&gt;
    __in u32 reserved;        // ignored; passes 0&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_GET_VA_REGIONS ===&lt;br /&gt;
Nintendo modified to get rid of pointer in struct.&lt;br /&gt;
&lt;br /&gt;
  struct va_region {&lt;br /&gt;
    u64 offset;&lt;br /&gt;
    u32 page_size;&lt;br /&gt;
    u32 pad;&lt;br /&gt;
    u64 pages;&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  struct {&lt;br /&gt;
    u64         not_used;   // (contained output user ptr on linux, ignored)&lt;br /&gt;
    __inout u32 bufsize;    // forced to 2*sizeof(struct va_region)&lt;br /&gt;
    u32         pad;&lt;br /&gt;
    __out struct va_region regions[2];&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_INITIALIZE_EX ===&lt;br /&gt;
Nintendo&#039;s custom implementation of NVGPU_GPU_IOCTL_ALLOC_AS (unavailable) with extra params.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 big_page_size;   // depends on GPU&#039;s available_big_page_sizes; 0=default&lt;br /&gt;
    __in s32 as_fd;           // ignored; passes 0&lt;br /&gt;
    __in u32 flags;           // passes 0&lt;br /&gt;
    __in u32 reserved;        // ignored; passes 0&lt;br /&gt;
    __in u64 unk0;&lt;br /&gt;
    __in u64 unk1;&lt;br /&gt;
    __in u64 unk2;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_REMAP ===&lt;br /&gt;
Nintendo&#039;s custom implementation of address space remapping.&lt;br /&gt;
&lt;br /&gt;
  struct remap_entry {&lt;br /&gt;
    __in u16 flags;        // 0 or 4&lt;br /&gt;
    __in u16 kind;           &lt;br /&gt;
    __in u32 nvmap_handle;&lt;br /&gt;
    __in u32 padding;&lt;br /&gt;
    __in u32 offset;       // (alloc_space_offset &amp;gt;&amp;gt; 0x10)&lt;br /&gt;
    __in u32 pages;        // alloc_space_pages&lt;br /&gt;
  };&lt;br /&gt;
 &lt;br /&gt;
 struct {&lt;br /&gt;
    __in struct remap_entry entries[];&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-dbg-gpu ==&lt;br /&gt;
Not accessible, but there is code to invoke it.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084401 || In || 8 || NVGPU_DBG_GPU_IOCTL_BIND_CHANNEL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??4402 || Inout || Variable || NVGPU_DBG_GPU_IOCTL_REG_OPS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084403 || In || 8 || NVGPU_DBG_GPU_IOCTL_EVENTS_CTRL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044404 || In || 4 || NVGPU_DBG_GPU_IOCTL_POWERGATE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044405 || In || 4 || NVGPU_DBG_GPU_IOCTL_SMPC_CTXSW_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0184407 || Inout || 24 || NVGPU_DBG_GPU_IOCTL_PERFBUF_MAP ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084408 || In || 8 || NVGPU_DBG_GPU_IOCTL_PERFBUF_UNMAP ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084409 || In || 8 || NVGPU_DBG_GPU_IOCTL_PC_SAMPLING ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008440A || In || 8 || NVGPU_DBG_GPU_IOCTL_TIMEOUT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8008440B || Out || 8 || NVGPU_DBG_GPU_IOCTL_GET_TIMEOUT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8004440C || Out || 4 || NVGPU_DBG_GPU_IOCTL_GET_GR_CONTEXT_SIZE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000440D || None || 0 || NVGPU_DBG_GPU_IOCTL_GET_GR_CONTEXT (uses Ioctl3) ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-ctrl-gpu ==&lt;br /&gt;
This device is for global (context independent) operations on the gpu.  &lt;br /&gt;
                                                                                                                                               &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x80044701 || Out || 4 || [[#NVGPU_GPU_IOCTL_ZCULL_GET_CTX_SIZE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80284702 || Out || 40 || [[#NVGPU_GPU_IOCTL_ZCULL_GET_INFO]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x402C4703 || In || 44 || [[#NVGPU_GPU_IOCTL_ZBC_SET_TABLE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0344704 || Inout || 52 || [[#NVGPU_GPU_IOCTL_ZBC_QUERY_TABLE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0B04705 || Inout || 176 || [[#NVGPU_GPU_IOCTL_GET_CHARACTERISTICS]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0184706 || Inout || 24 || NVGPU_GPU_IOCTL_GET_TPC_MASKS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084707 || In || 8 || [[#NVGPU_GPU_IOCTL_FLUSH_L2]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008470E || In || 8 || NVGPU_GPU_IOCTL_SET_MMUDEBUG_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4010470F || In || 16 || NVGPU_GPU_IOCTL_SET_SM_DEBUG_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0084710 || Inout || 8 || NVGPU_GPU_IOCTL_WAIT_FOR_PAUSE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80084711 || Out || 8 || NVGPU_GPU_IOCTL_GET_TPC_EXCEPTION_EN_STATUS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80084712 || Out || 8 || NVGPU_GPU_IOCTL_NUM_VSMS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0044713 || Inout || 4 || NVGPU_GPU_IOCTL_VSMS_MAPPING ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80084714 || Out || 8 || [[#NVGPU_GPU_IOCTL_ZBC_GET_ACTIVE_SLOT_MASK]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80044715 || Out || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8018471A || Out || 24 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC008471B || Inout || 8 || NVGPU_GPU_IOCTL_GET_ERROR_CHANNEL_USER_DATA ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010471C || Inout || 16 || NVGPU_GPU_IOCTL_GET_GPU_TIME ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC108471D || Inout || 264 || NVGPU_GPU_IOCTL_GET_CPU_TIME_CORRELATION_INFO ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZCULL_GET_CTX_SIZE ===&lt;br /&gt;
Returns the GPU&#039;s ZCULL context size. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __out u32 size;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZCULL_GET_CTX_SIZE ===&lt;br /&gt;
Returns GPU&#039;s ZCULL information. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __out u32 width_align_pixels;&lt;br /&gt;
    __out u32 height_align_pixels;&lt;br /&gt;
    __out u32 pixel_squares_by_aliquots;&lt;br /&gt;
    __out u32 aliquot_total;&lt;br /&gt;
    __out u32 region_byte_multiplier;&lt;br /&gt;
    __out u32 region_header_size;&lt;br /&gt;
    __out u32 subregion_header_size;&lt;br /&gt;
    __out u32 subregion_width_align_pixels;&lt;br /&gt;
    __out u32 subregion_height_align_pixels;&lt;br /&gt;
    __out u32 subregion_count;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZBC_SET_TABLE ===&lt;br /&gt;
Sets the active ZBC table. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __in u32 color_ds[4];&lt;br /&gt;
    __in u32 color_l2[4];&lt;br /&gt;
    __in u32 depth;&lt;br /&gt;
    __in u32 format;&lt;br /&gt;
    __in u32 type;         // 1=color, 2=depth&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZBC_QUERY_TABLE ===&lt;br /&gt;
Queries the active ZBC table. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __out u32 color_ds[4];&lt;br /&gt;
    __out u32 color_l2[4];&lt;br /&gt;
    __out u32 depth;&lt;br /&gt;
    __out u32 ref_cnt;&lt;br /&gt;
    __out u32 format;&lt;br /&gt;
    __out u32 type;&lt;br /&gt;
    __inout u32 index_size;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_GET_CHARACTERISTICS ===&lt;br /&gt;
Returns the GPU characteristics. Modified to return inline data instead of using a pointer.&lt;br /&gt;
&lt;br /&gt;
  struct gpu_characteristics {&lt;br /&gt;
    u32 arch;                           // 0x120 (NVGPU_GPU_ARCH_GM200)&lt;br /&gt;
    u32 impl;                           // 0xB (NVGPU_GPU_IMPL_GM20B)&lt;br /&gt;
    u32 rev;                            // 0xA1 (Revision A1)&lt;br /&gt;
    u32 num_gpc;                        // 0x1&lt;br /&gt;
    u64 l2_cache_size;                  // 0x40000&lt;br /&gt;
    u64 on_board_video_memory_size;     // 0x0 (not used)&lt;br /&gt;
    u32 num_tpc_per_gpc;                // 0x2&lt;br /&gt;
    u32 bus_type;                       // 0x20 (NVGPU_GPU_BUS_TYPE_AXI)&lt;br /&gt;
    u32 big_page_size;                  // 0x20000&lt;br /&gt;
    u32 compression_page_size;          // 0x20000&lt;br /&gt;
    u32 pde_coverage_bit_count;         // 0x1B&lt;br /&gt;
    u32 available_big_page_sizes;       // 0x30000&lt;br /&gt;
    u32 gpc_mask;                       // 0x1&lt;br /&gt;
    u32 sm_arch_sm_version;             // 0x503 (Maxwell Generation 5.0.3?)&lt;br /&gt;
    u32 sm_arch_spa_version;            // 0x503 (Maxwell Generation 5.0.3?)&lt;br /&gt;
    u32 sm_arch_warp_count;             // 0x80&lt;br /&gt;
    u32 gpu_va_bit_count;               // 0x28&lt;br /&gt;
    u32 reserved;                       // NULL&lt;br /&gt;
    u64 flags;                          // 0x55&lt;br /&gt;
    u32 twod_class;                     // 0x902D (FERMI_TWOD_A)&lt;br /&gt;
    u32 threed_class;                   // 0xB197 (MAXWELL_B)&lt;br /&gt;
    u32 compute_class;                  // 0xB1C0 (MAXWELL_COMPUTE_B)&lt;br /&gt;
    u32 gpfifo_class;                   // 0xB06F (MAXWELL_CHANNEL_GPFIFO_A)&lt;br /&gt;
    u32 inline_to_memory_class;         // 0xA140 (KEPLER_INLINE_TO_MEMORY_B)&lt;br /&gt;
    u32 dma_copy_class;                 // 0xB0B5 (MAXWELL_DMA_COPY_A)&lt;br /&gt;
    u32 max_fbps_count;                 // 0x1&lt;br /&gt;
    u32 fbp_en_mask;                    // 0x0 (disabled)&lt;br /&gt;
    u32 max_ltc_per_fbp;                // 0x2&lt;br /&gt;
    u32 max_lts_per_ltc;                // 0x1&lt;br /&gt;
    u32 max_tex_per_tpc;                // 0x0 (not supported)&lt;br /&gt;
    u32 max_gpc_count;                  // 0x1&lt;br /&gt;
    u32 rop_l2_en_mask_0;               // 0x21D70 (fuse_status_opt_rop_l2_fbp_r)&lt;br /&gt;
    u32 rop_l2_en_mask_1;               // 0x0&lt;br /&gt;
    u64 chipname;                       // 0x6230326D67 (&amp;quot;gm20b&amp;quot;)&lt;br /&gt;
    u64 gr_compbit_store_base_hw;       // 0x0 (not supported)&lt;br /&gt;
  };&lt;br /&gt;
 &lt;br /&gt;
  struct {&lt;br /&gt;
    __inout u64 gpu_characteristics_buf_size;   // must not be NULL, but gets overwritten with 0xA0=max_size&lt;br /&gt;
    __in    u64 gpu_characteristics_buf_addr;   // ignored, but must not be NULL&lt;br /&gt;
    __out struct gpu_characteristics gc;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_FLUSH_L2 ===&lt;br /&gt;
Flushes the GPU L2 cache.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 flush;          // l2_flush | l2_invalidate &amp;lt;&amp;lt; 1 | fb_flush &amp;lt;&amp;lt; 2&lt;br /&gt;
    u32      reserved;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZBC_GET_ACTIVE_SLOT_MASK ===&lt;br /&gt;
Returns the mask value for a ZBC slot.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u32 slot;       // always 0x07&lt;br /&gt;
    __out u32 mask;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
== Channels ==&lt;br /&gt;
Channels are a concept for  NVIDIA hardware blocks that share a common interface.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Path || Name&lt;br /&gt;
|-&lt;br /&gt;
| /dev/nvhost-gpu ||&lt;br /&gt;
|-&lt;br /&gt;
| /dev/nvhost-vic || Video Image Compositor&lt;br /&gt;
|-&lt;br /&gt;
| /dev/nvhost-nvdec || Video Decoder&lt;br /&gt;
|-&lt;br /&gt;
| /dev/nvhost-nvjpg || JPEG Decoder&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Channel Ioctls ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??0001 || Variable || NVHOST_IOCTL_CHANNEL_SUBMIT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080002 || 8 || NVHOST_IOCTL_CHANNEL_GET_SYNCPOINT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080003 || 8 || NVHOST_IOCTL_CHANNEL_GET_WAITBASE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080004 || 8 || NVHOST_IOCTL_CHANNEL_SET_TIMEOUT_EX ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040007 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080008 || 8 || NVHOST_IOCTL_CHANNEL_SET_CLK_RATE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??0009 || Variable || NVHOST_IOCTL_CHANNEL_MAP_BUFFER ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??000A || Variable || NVHOST_IOCTL_CHANNEL_UNMAP_BUFFER ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000013 || 0 || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40044801 || 4 || [[#NVGPU_IOCTL_CHANNEL_SET_NVMAP_FD]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044803 || 4 || NVGPU_IOCTL_CHANNEL_SET_TIMEOUT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084805 || 8 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0044807 || 4 || NVGPU_IOCTL_CHANNEL_CYCLE_STATS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??4808 || Variable || [[#NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0104809 || 16 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_OBJ_CTX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010480B || 16 || [[#NVGPU_IOCTL_CHANNEL_ZCULL_BIND]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC018480C || 24 || [[#NVGPU_IOCTL_CHANNEL_SET_ERROR_NOTIFIER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4004480D || 4 || [[#NVGPU_IOCTL_CHANNEL_SET_PRIORITY]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000480E || 0 || [[#NVGPU_IOCTL_CHANNEL_ENABLE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000480F || 0 || [[#NVGPU_IOCTL_CHANNEL_DISABLE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00004810 || 0 || [[#NVGPU_IOCTL_CHANNEL_PREEMPT]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00004811 || 0 || [[#NVGPU_IOCTL_CHANNEL_FORCE_RESET]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084812 || 8 || [[#NVGPU_IOCTL_CHANNEL_EVENT_ID_CONTROL]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0104813 || 16 || NVGPU_IOCTL_CHANNEL_CYCLE_STATS_SNAPSHOT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80804816 || 128 || NVGPU_IOCTL_CHANNEL_GET_ERROR_INFO ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0104817 || 16 || [[#NVGPU_IOCTL_CHANNEL_GET_ERROR_NOTIFICATION]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40204818 || 32 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??4819 || Variable || [[#NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO_RETRY]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC020481A || 32 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX2]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC018481B || 24 || (uses Ioctl2) ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC018481C || 24 || (uses Ioctl2) ||&lt;br /&gt;
|-&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40084714 || 8 || NVGPU_IOCTL_CHANNEL_SET_USER_DATA || Sets an unknown user context address&lt;br /&gt;
|-&lt;br /&gt;
| 0x80084715 || 8 || NVGPU_IOCTL_CHANNEL_GET_USER_DATA || Gets an unknown user context address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SET_NVMAP_FD ===&lt;br /&gt;
Binds a nvmap object to this channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 nvmap_fd;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO ===&lt;br /&gt;
Allocates gpfifo entries. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 num_entries;&lt;br /&gt;
    __in u32 flags;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO ===&lt;br /&gt;
Submits a gpfifo object. Modified to take inline entry objects instead of a pointer.&lt;br /&gt;
&lt;br /&gt;
  struct fence {&lt;br /&gt;
    u32 id;&lt;br /&gt;
    u32 value;&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  struct gpfifo_entry {&lt;br /&gt;
    u32 entry0;                           // gpu_va_lo&lt;br /&gt;
    u32 entry1;                           // gpu_va_hi | (unk_0x02 &amp;lt;&amp;lt; 0x08) | (size &amp;lt;&amp;lt; 0x0A) | (unk_0x01 &amp;lt;&amp;lt; 0x1F)&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 gpfifo;                      // (ignored) pointer to gpfifo fence structs&lt;br /&gt;
    __in u32 num_entries;                 // number of fence objects being submitted&lt;br /&gt;
    __in u32 flags;&lt;br /&gt;
    __out struct fence fence_out;         // returned new fence object for others to wait on&lt;br /&gt;
    __in  struct gpfifo_entry entries[];  // depends on num_entries&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ALLOC_OBJ_CTX ===&lt;br /&gt;
Allocates a graphics context object. Modified to ignore object&#039;s ID.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 class_num;    // 0x902D=2d, 0xB197=3d, 0xB1C0=compute, 0xA140=kepler, 0xB0B5=DMA, 0xB06F=channel_gpfifo&lt;br /&gt;
    __in  u32 flags;&lt;br /&gt;
    __out u64 obj_id;       // (ignored) used for FREE_OBJ_CTX ioctl, which is not supported&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ZCULL_BIND ===&lt;br /&gt;
Binds a ZCULL context to the channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __in u64 gpu_va;&lt;br /&gt;
    __in u32 mode;         // 0=global, 1=no_ctxsw, 2=separate_buffer, 3=part_of_regular_buf&lt;br /&gt;
    __in u32 padding;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SET_ERROR_NOTIFIER ===&lt;br /&gt;
Initializes the error notifier for this channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 offset;&lt;br /&gt;
    __in u64 size;&lt;br /&gt;
    __in u32 mem;       // nvmap object handle&lt;br /&gt;
    __in u32 padding;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SET_PRIORITY ===&lt;br /&gt;
Change channel&#039;s priority. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 priority;    // 0x32 is low, 0x64 is medium and 0x96 is high&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ENABLE ===&lt;br /&gt;
Enables the current channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_DISABLE ===&lt;br /&gt;
Disables the current channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_PREEMPT ===&lt;br /&gt;
Clears the FIFO pipe for this channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_FORCE_RESET ===&lt;br /&gt;
Forces the channel to reset. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_EVENT_ID_CONTROL ===&lt;br /&gt;
Controls event notifications.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 cmd;    // 0=disable, 1=enable, 2=clear&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_GET_ERROR_NOTIFICATION ===&lt;br /&gt;
Returns the current error notification caught by the error notifier. Exclusive to the Switch.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out   u64 timestamp;    // nanoseconds since Jan. 1, 1970&lt;br /&gt;
    __out   u32 info32;       // error code&lt;br /&gt;
    __out   u16 info16;       // additional error info&lt;br /&gt;
    __inout u16 status;       // always 0xFFFF&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO_RETRY ===&lt;br /&gt;
Allocates gpfifo entries with additional parameters. Exclusive to the Switch.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 num_entries;&lt;br /&gt;
    __in u32 flags;&lt;br /&gt;
    __in u32 unk0;            // 1 works&lt;br /&gt;
    __in u32 unk1;&lt;br /&gt;
    __in u32 unk2;&lt;br /&gt;
    __in u32 unk3;&lt;br /&gt;
    __in u32 unk4;&lt;br /&gt;
    __in u32 unk5;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO_EX ===&lt;br /&gt;
Submits a gpfifo object (async version). Exclusive to the Switch.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    u64 __gpfifo;                     // in (pointer to gpfifo fence structs; ignored)&lt;br /&gt;
    u32 __num_entries;                // in (number of fence objects being submitted)&lt;br /&gt;
    u32 __flags;                      // in&lt;br /&gt;
    struct fence        __fence_out;  // out (returned new fence object for others to wait on)&lt;br /&gt;
    struct gpfifo_entry __entries[];  // in (depends on __num_entries)&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX2 ===&lt;br /&gt;
Allocates gpfifo entries with additional parameters and returns a fence. Exclusive to the Switch.&lt;br /&gt;
 &lt;br /&gt;
  struct {&lt;br /&gt;
    u32 __num_entries;         // in&lt;br /&gt;
    u32 __flags;               // in&lt;br /&gt;
    u32 __unk0;                // in (1 works)&lt;br /&gt;
    struct fence __fence_out;  // out&lt;br /&gt;
    u32 __unk1;                // in&lt;br /&gt;
    u32 __unk2;                // in&lt;br /&gt;
    u32 __unk3;                // in&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
= nvmemp =&lt;br /&gt;
NVIDIA memory profiler (this service is not available on retail units). &lt;br /&gt;
/dev/nvhost-ctrl sends the ioctl NVHOST_IOCTL_CTRL_GET_CONFIG to check the config &amp;quot;nv!NV_MEMORY_PROFILER&amp;quot;. If config_str returns &amp;quot;1&amp;quot;, the applications attempts to talk to use nvmemp.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Cmd0&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Cmd1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= nvdrvdbg =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#OpenLog]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#CloseLog]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [[#ReadLog]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== OpenLog ==&lt;br /&gt;
Takes process handle. Returns an fd.&lt;br /&gt;
&lt;br /&gt;
== CloseLog ==&lt;br /&gt;
Takes fd and closes it.&lt;br /&gt;
&lt;br /&gt;
== ReadLog ==&lt;br /&gt;
Takes fd and reads log into a type-6 buffer.&lt;br /&gt;
&lt;br /&gt;
= Errors =&lt;br /&gt;
Most nvidia driver commands return an error code apart from the normal return code.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Success&lt;br /&gt;
|-&lt;br /&gt;
| 1 || NotImplemented&lt;br /&gt;
|-&lt;br /&gt;
| 2 || NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 3 || NotInitialized&lt;br /&gt;
|-&lt;br /&gt;
| 4 || BadParameter&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| 6 || InsufficientMemory&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ReadOnlyAttribute&lt;br /&gt;
|-&lt;br /&gt;
| 8 || InvalidState&lt;br /&gt;
|-&lt;br /&gt;
| 9 || InvalidAddress&lt;br /&gt;
|-&lt;br /&gt;
| 0xA || InvalidSize&lt;br /&gt;
|-&lt;br /&gt;
| 0xB || BadValue&lt;br /&gt;
|-&lt;br /&gt;
| 0xD || AlreadyAllocated&lt;br /&gt;
|-&lt;br /&gt;
| 0xE || Busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xF || ResourceError&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || CountMismatch&lt;br /&gt;
|-&lt;br /&gt;
| 0x1000 || SharedMemoryTooSmall&lt;br /&gt;
|-&lt;br /&gt;
| 0x30003 || FileOperationFailed&lt;br /&gt;
|-&lt;br /&gt;
| 0x3000F || IoctlFailed                        &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Panic =&lt;br /&gt;
In some cases, a panic may occur. NV forces a crash by doing:&lt;br /&gt;
 (void *)0 = 0xCAFE;&lt;br /&gt;
End result is that the system hangs with a white-screen.&lt;br /&gt;
&lt;br /&gt;
== Gpfifo Panic ==&lt;br /&gt;
When the gpfifo data in the gpu_va buffers specified by the submitted gpfifo entries is invalid(?), eventually the user-process will be force-terminated after using the submit-gpfifo ioctl. It&#039;s unknown how exactly this is done.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=NV_services&amp;diff=3468</id>
		<title>NV services</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=NV_services&amp;diff=3468"/>
		<updated>2018-01-19T03:46:13Z</updated>

		<summary type="html">&lt;p&gt;OgniK: /* nvmemp */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Switch uses a customized NVIDIA driver.&lt;br /&gt;
&lt;br /&gt;
= nvdrv, nvdrv:a, nvdrv:s, nvdrv:t =&lt;br /&gt;
Main NVIDIA driver service.&lt;br /&gt;
&lt;br /&gt;
Each service is used by:&lt;br /&gt;
* &amp;quot;nvdrv&amp;quot;: regular applications&lt;br /&gt;
* &amp;quot;nvdrv:a&amp;quot;: applets&lt;br /&gt;
* &amp;quot;nvdrv:s&amp;quot;: sysmodules&lt;br /&gt;
* &amp;quot;nvdrv:t&amp;quot;: factory titles&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#Open]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#Ioctl]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [[#Close]]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [[#Initialize]]&lt;br /&gt;
|-&lt;br /&gt;
| 4 || [[#QueryEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [[#MapSharedMem]]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || [[#GetStatus]]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || [[#ForceSetClientPID]]&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#SetClientPID]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || [[#DumpGraphicsMemoryInfo]]&lt;br /&gt;
|-&lt;br /&gt;
| 10 || [3.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 11 || [3.0.0+] [[#Ioctl2]]&lt;br /&gt;
|-&lt;br /&gt;
| 12 || [3.0.0+] [[#Ioctl3]]&lt;br /&gt;
|-&lt;br /&gt;
| 13 || [3.0.0+]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Open ==&lt;br /&gt;
Takes a type-0x5 input buffer for the device-path. Returns the output 32bit &#039;&#039;&#039;fd&#039;&#039;&#039; and the u32 &#039;&#039;&#039;error_code&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Ioctl ==&lt;br /&gt;
Takes a 32bit &#039;&#039;&#039;fd&#039;&#039;&#039;, an u32 &#039;&#039;&#039;ioctl_cmd&#039;&#039;&#039;, a type-0x21 input buffer, and a type-0x22 output buffer. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
The addr/size for send/recv buffers are only set when the associated direction bit is set in the ioctl cmd (addr/size = 0 otherwise).&lt;br /&gt;
&lt;br /&gt;
== Close ==&lt;br /&gt;
Takes a 32bit &#039;&#039;&#039;fd&#039;&#039;&#039;. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Initialize ==&lt;br /&gt;
Takes two copy-handles (&#039;&#039;&#039;current_process&#039;&#039;&#039; and &#039;&#039;&#039;transfer_memory&#039;&#039;&#039;) and an input u32 (&#039;&#039;&#039;transfer_memory_size&#039;&#039;&#039;). Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Webkit applet creates the transfer-memory with perm = 0 and size 0x300000.&lt;br /&gt;
&lt;br /&gt;
== QueryEvent ==&lt;br /&gt;
Takes two input u32s (&#039;&#039;&#039;fd&#039;&#039;&#039; and &#039;&#039;&#039;event_id&#039;&#039;&#039;), with the second word immediately after the first one. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;) and a copy-handle (&#039;&#039;&#039;event_handle&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== MapSharedMem ==&lt;br /&gt;
Takes a copy-handle (&#039;&#039;&#039;transfer_memory&#039;&#039;&#039;) and two input u32s (&#039;&#039;&#039;fd&#039;&#039;&#039; and &#039;&#039;&#039;nvmap_handle&#039;&#039;&#039;). Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== GetStatus ==&lt;br /&gt;
Takes no input. Returns 0x10-bytes and an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== ForceSetClientPID ==&lt;br /&gt;
Takes an input u64 which must [[IPC_Marshalling|match]] the user-process PID ([[AM_services|AppletResourceUserId]]). Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== SetClientPID ==&lt;br /&gt;
Takes a PID-descriptor and an u64 which must [[IPC_Marshalling|match]] the user-process PID ([[AM_services|AppletResourceUserId]]). Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== DumpGraphicsMemoryInfo ==&lt;br /&gt;
No input or output. Does nothing.&lt;br /&gt;
&lt;br /&gt;
== Cmd10 ==&lt;br /&gt;
Takes a copy-handle and an input u32. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Ioctl2 ==&lt;br /&gt;
Takes a type-0x21 buffer, a type-0x22 buffer, a type-0x21 buffer, and two input u32s. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Ioctl3 ==&lt;br /&gt;
Same input/output as Ioctl2, except cmdhdr_word1 is 0x100B instead of 0xC0B.&lt;br /&gt;
&lt;br /&gt;
== Cmd13 ==&lt;br /&gt;
Takes an input u64. No output.&lt;br /&gt;
&lt;br /&gt;
Official user-processes starting with 3.0.0 now use this at the end of nvdrv service init with value 0x1.&lt;br /&gt;
&lt;br /&gt;
= Ioctls =&lt;br /&gt;
The ioctl number is generated with the following primitive (see Linux kernel):&lt;br /&gt;
&lt;br /&gt;
 #define _IOC(inout, group, num, len) \&lt;br /&gt;
    (inout | ((len &amp;amp; IOCPARM_MASK) &amp;lt;&amp;lt; 16) | ((group) &amp;lt;&amp;lt; 8) | (num))&lt;br /&gt;
&lt;br /&gt;
The following table contains known ioctls.&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080014 || Inout || 8 || [[#NVHOST_IOCTL_CTRL_SYNCPT_READ]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040015 || In || 4 || [[#NVHOST_IOCTL_CTRL_SYNCPT_INCR]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC00C0016 || Inout || 12 || [[#NVHOST_IOCTL_CTRL_SYNCPT_WAIT]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080017 || In || 8 || [[#NVHOST_IOCTL_CTRL_MODULE_MUTEX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0180018 || Inout || 24 || [[#NVHOST_IOCTL_CTRL_MODULE_REGRDWR]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0100019 || Inout || 16 || [[#NVHOST_IOCTL_CTRL_SYNCPT_WAITEX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC008001A || Inout || 8 || [[#NVHOST_IOCTL_CTRL_SYNCPT_READ_MAX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC183001B || Inout || 387 || [[#NVHOST_IOCTL_CTRL_GET_CONFIG]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004001C || Inout || 4 || [[#NVHOST_IOCTL_CTRL_EVENT_SIGNAL]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010001D || Inout || 16 || [[#NVHOST_IOCTL_CTRL_EVENT_WAIT]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010001E || Inout || 16 || [[#NVHOST_IOCTL_CTRL_EVENT_WAIT_ASYNC]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004001F || Inout || 4 || [[#NVHOST_IOCTL_CTRL_EVENT_REGISTER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0040020 || Inout || 4 || [[#NVHOST_IOCTL_CTRL_EVENT_UNREGISTER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080021 || In || 8 || [[#NVHOST_IOCTL_CTRL_EVENT_KILL]] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_READ ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 id;&lt;br /&gt;
    __out u32 value;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_INCR ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_WAIT ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
    __in u32 thresh;&lt;br /&gt;
    __in s32 timeout;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_MODULE_MUTEX ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
    __in u32 lock;        // (0==unlock; 1==lock)&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_MODULE_REGRDWR ===&lt;br /&gt;
Identical to Linux driver. Uses 32-bit version and doesn&#039;t work.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
    __in u32 num_offsets;&lt;br /&gt;
    __in u32 block_size;&lt;br /&gt;
    __in u32 offsets;&lt;br /&gt;
    __in u32 values;&lt;br /&gt;
    __in u32 write;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_WAITEX ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 id;&lt;br /&gt;
    __in  u32 thresh;&lt;br /&gt;
    __in  s32 timeout;&lt;br /&gt;
    __out u32 value;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_READ_MAX ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 id;&lt;br /&gt;
    __out u32 value;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_GET_CONFIG ===&lt;br /&gt;
Gets configured settings. Not available in production mode.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in char domain_str[0x41];       // &amp;quot;nv&amp;quot;&lt;br /&gt;
    __in char param_str[0x41];&lt;br /&gt;
    __out char config_str[0x101];&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_SIGNAL ===&lt;br /&gt;
Signals an user event. Exclusive to the Switch.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 user_event_id;      // ranges from 0x00 to 0x3F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_WAIT ===&lt;br /&gt;
Waits on an event. If waiting fails, returns error code 0x05 (Timeout) and sets &#039;&#039;&#039;value&#039;&#039;&#039; to ((&#039;&#039;&#039;syncpt_id&#039;&#039;&#039; &amp;lt;&amp;lt; 0x10) | 0x10000000).&lt;br /&gt;
&lt;br /&gt;
Depending on &#039;&#039;&#039;threshold&#039;&#039;&#039;, an &#039;&#039;&#039;user_event_id&#039;&#039;&#039; may be returned for using with other event ioctls.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u32 syncpt_id;&lt;br /&gt;
    __in    u32 threshold;&lt;br /&gt;
    __in    s32 timeout;&lt;br /&gt;
    __inout u32 value;           // in=user_event_id (ignored); out=syncpt_value or user_event_id&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_WAIT_ASYNC ===&lt;br /&gt;
Waits on an event (async version). If waiting fails, returns error code 0x0B (BadValue).&lt;br /&gt;
&lt;br /&gt;
Depending on &#039;&#039;&#039;threshold&#039;&#039;&#039;, an &#039;&#039;&#039;user_event_id&#039;&#039;&#039; may be returned for using with other event ioctls.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u32 syncpt_id;&lt;br /&gt;
    __in    u32 threshold;&lt;br /&gt;
    __in    u32 timeout;&lt;br /&gt;
    __inout u32 value;           // in=user_event_id (ignored); out=syncpt_value or user_event_id&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_REGISTER ===&lt;br /&gt;
Registers an user event. Exclusive to the Switch. &lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 user_event_id;      // ranges from 0x00 to 0x3F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_UNREGISTER ===&lt;br /&gt;
Unregisters an user event. Exclusive to the Switch. &lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 user_event_id;      // ranges from 0x00 to 0x3F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_KILL ===&lt;br /&gt;
Kills user events. Exclusive to the Switch. &lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 user_events;       // 64-bit bitfield where each bit represents one event&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
== /dev/nvmap ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080101 || Inout || 8 || [[#NVMAP_IOC_CREATE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000102 || - || 0 || NVMAP_IOC_CLAIM || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080103 || Inout || 8 || [[#NVMAP_IOC_FROM_ID]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0200104 || Inout || 32 || [[#NVMAP_IOC_ALLOC]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0180105 || Inout || 24 || [[#NVMAP_IOC_FREE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0280106 || Inout || 40 || NVMAP_IOC_MMAP || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0280107 || Inout || 40 || NVMAP_IOC_WRITE || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0280108 || Inout || 40 || NVMAP_IOC_READ || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC00C0109 || Inout || 12 || [[#NVMAP_IOC_PARAM]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010010A || Inout || 16 || NVMAP_IOC_PIN_MULT || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010010B || Inout || 16 || NVMAP_IOC_UNPIN_MULT || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC008010C || Inout || 8 || NVMAP_IOC_CACHE || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004010D || Inout || 4 || || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC008010E || Inout || 8 || [[#NVMAP_IOC_GET_ID]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004010F || Inout || 4 || || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040110 || In || 4 || || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000111 || - || 0 || || Returns NotSupported&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_CREATE ===&lt;br /&gt;
Creates an nvmap object. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 size;&lt;br /&gt;
    __out u32 handle;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_FROM_ID ===&lt;br /&gt;
Get handle to an existing nvmap object. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 id;&lt;br /&gt;
    __out u32 handle;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_ALLOC ===&lt;br /&gt;
Allocate memory for the nvmap object. Nintendo extended this one with 16 bytes, and changed it from in to inout.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 handle;&lt;br /&gt;
    __in u32 heapmask;&lt;br /&gt;
    __in u32 flags;    // (0=read-only, 1=read-write)&lt;br /&gt;
    __in u32 align;&lt;br /&gt;
    __in u8  kind;&lt;br /&gt;
    u8       pad[7];&lt;br /&gt;
    __in u64 addr;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_FREE ===&lt;br /&gt;
This one is completely custom. Partly because the Linux driver passed the handle as the ioctl &amp;quot;arg-ptr&amp;quot;, and HIPC can&#039;t handle that voodoo.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 handle;&lt;br /&gt;
    u32       pad;&lt;br /&gt;
    __out u64 refcount;&lt;br /&gt;
    __out u32 size;&lt;br /&gt;
    __out u32 flags;    // 1=NOT_FREED_YET&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_PARAM ===&lt;br /&gt;
Returns info about a nvmap object. Identical to Linux driver, but extended with further params.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 handle;&lt;br /&gt;
    __in  u32 param;  // 1=SIZE, 2=ALIGNMENT, 3=BASE (returns error), 4=HEAP (always 0x40000000), 5=KIND, 6=COMPR (unused)&lt;br /&gt;
    __out u32 result;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_GET_ID ===&lt;br /&gt;
Returns an id for a nvmap object. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u32 id; //~0 indicates error&lt;br /&gt;
    __in  u32 handle;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
== /dev/nvdisp-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x80040212 || Out || 4 || TEGRA_DC_EXT_CONTROL_GET_NUM_OUTPUTS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0140213 || Inout || 20 || TEGRA_DC_EXT_CONTROL_GET_OUTPUT_PROPERTIES ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC1100214 || Inout || 272 || TEGRA_DC_EXT_CONTROL_GET_OUTPUT_EDID ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0040216 || Inout || 4 || TEGRA_DC_EXT_CONTROL_SET_EVENT0 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0040217 || Inout || 4 || TEGRA_DC_EXT_CONTROL_SET_EVENT1 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0100218 || Inout || 16 || TEGRA_DC_EXT_CONTROL_SET_EVENT2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0100219 || Inout || 16 || TEGRA_DC_EXT_CONTROL_SET_EVENT3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0040220 || Inout || 4 || TEGRA_DC_EXT_CONTROL_SET_EVENT4 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvdisp-disp0, /dev/nvdisp-disp1 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040201 || In || 4 || TEGRA_DC_EXT_GET_WINDOW ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040202 || In || 4 || TEGRA_DC_EXT_PUT_WINDOW ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC4C80203 || In || 1224 || TEGRA_DC_EXT_FLIP ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80380204 || Out || 56 || TEGRA_DC_EXT_GET_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40380205 || Out || 56 || TEGRA_DC_EXT_SET_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x430C0206 || In || 780 || TEGRA_DC_EXT_SET_LUT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010207 || In || 1 || TEGRA_DC_EXT_ENABLE_DISABLE_CRC ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80040208 || Out || 4 || TEGRA_DC_EXT_GET_CRC ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80040209 || Out || 4 || TEGRA_DC_EXT_GET_HEAD_STATUS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC038020A || Inout || 56 || TEGRA_DC_EXT_VALIDATE_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4018020B || In || 24 || TEGRA_DC_EXT_SET_CSC ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004020C || Inout || 4 || TEGRA_DC_EXT_GET_VBLANK_SYNCPT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8040020D || Out || 64 || TEGRA_DC_EXT_GET_UNDERFLOWS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC99A020E || Inout || 2458 || TEGRA_DC_EXT_SET_CMU ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004020F || Inout || 4 || TEGRA_DC_EXT_DPMS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80600210 || Out || 96 || TEGRA_DC_EXT_GET_AVI_INFOFRAME ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40600211 || In || 96 || TEGRA_DC_EXT_SET_AVI_INFOFRAME ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xEBFC0215 || Inout || 11260 || TEGRA_DC_EXT_GET_MODE_DB ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC003021A || Inout || 3 || TEGRA_DC_EXT_PANEL_GET_VENDOR_ID ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x803C021B || Out || 60 || TEGRA_DC_EXT_GET_MODE2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x403C021C || In || 60 || TEGRA_DC_EXT_SET_MODE2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC03C021D || Inout || 60  || TEGRA_DC_EXT_VALIDATE_MODE2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xEF20021E || Inout || 12064 || TEGRA_DC_EXT_GET_MODE_DB2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004021F || Inout || 4 || TEGRA_DC_EXT_GET_WINMASK ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvcec-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010300 || In || 1 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010301 || In || 1 || NVCEC_CTRL_ENABLE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x804C0302 || Out || 76 || NVCEC_CTRL_GET_PADDR ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040303 || In || 4 || NVCEC_CTRL_SET_LADDR ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC04C0304 || Inout || 76 || NVCEC_CTRL_WRITE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC04C0305 || Inout || 76 || NVCEC_CTRL_READ ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x804C0306 || Out || 76 || NVCEC_CTRL_GET_CONNECTION_STATUS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x804C0307 || Out || 76 || NVCEC_CTRL_GET_WRITE_STATUS ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhdcp_up-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC4880401 || Inout || 1160 || TEGRAIO_NVHDCP_READ_M ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC4880402 || Inout || 1160 || TEGRAIO_NVHDCP_READ_S ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010403 || In || 1 || TEGRAIO_NVHDCP_ON_OFF ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvdcutil-disp0, /dev/nvdcutil-disp1 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010501 || In || 1 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010502 || In || 1 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x42040503 || In || 1056 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x803C0504 || Out || 60 || NVDCUTIL_DISP_IOCTL_GET_DISPLAY_INFO ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvsched-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000601 || - || 0 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000602 || - || 0 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40180603 || In || 1056 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40180604 || In || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080605 || In || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80080606 || Out || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80080607 || Out || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40180608 || In || 24 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100609 || In || 16 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4010060A || In || 16 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008060B || In || 8 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8001060C || Out || 1 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8010060D || Out || 16 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x400C060E || In || 12 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008060F || In || 8 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100610 || In || 16 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100611 || In || 16 || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nverpt-ctrl ==&lt;br /&gt;
Added in firmware version 4.0.0.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC1280701 || Inout || 296 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xCF580702 || Inout || 3928 || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-as-gpu ==&lt;br /&gt;
Each fd opened to this device creates an address space. An address space is then later bound with a channel.&lt;br /&gt;
&lt;br /&gt;
Once a nvgpu channel has been bound to an address space it cannot be unbound. There is no support for allowing an nvgpu channel to change from one address space to another (or from one to none).&lt;br /&gt;
                                                                                                                              &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044101 || In || 4 || [[#NVGPU_AS_IOCTL_BIND_CHANNEL]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0184102 || Inout || 24 || [[#NVGPU_AS_IOCTL_ALLOC_SPACE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0104103 || Inout || 16 || [[#NVGPU_AS_IOCTL_FREE_SPACE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0184104 || Inout || 24 || [[#NVGPU_AS_IOCTL_MAP_BUFFER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0084105 || Inout || 8 || [[#NVGPU_AS_IOCTL_UNMAP_BUFFER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0284106 || Inout || 40 || [[#NVGPU_AS_IOCTL_MAP_BUFFER_EX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40104107 || In || 16 || [[#NVGPU_AS_IOCTL_INITIALIZE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0404108 || Inout || 64 || [[#NVGPU_AS_IOCTL_GET_VA_REGIONS]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40284109 || In || 40 || [[#NVGPU_AS_IOCTL_INITIALIZE_EX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??4114 || Inout || Variable || [[#NVGPU_AS_IOCTL_REMAP]] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_BIND_CHANNEL ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 fd;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_ALLOC_SPACE ===&lt;br /&gt;
This one reserves pages in the device address space.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 pages;&lt;br /&gt;
    __in u32 page_size;&lt;br /&gt;
    __in u32 flags;&lt;br /&gt;
    u32      pad;&lt;br /&gt;
    union {&lt;br /&gt;
      __out u64 offset;&lt;br /&gt;
      __in  u64 align;&lt;br /&gt;
    };&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_FREE_SPACE ===&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 offset;&lt;br /&gt;
    __in u32 pages;&lt;br /&gt;
    __in u32 page_size;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_MAP_BUFFER ===&lt;br /&gt;
Map a memory region in the device address space. Identical to Linux driver pretty much.&lt;br /&gt;
&lt;br /&gt;
On success, the mapped memory region is locked by having [[SVC#MemoryState]] bit34 set.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u32 flags;        // bit0: fixed_offset, bit2: cacheable&lt;br /&gt;
    u32         pad;&lt;br /&gt;
    __in    u32 nvmap_handle;&lt;br /&gt;
    __inout u32 page_size;    // 0 means don&#039;t care&lt;br /&gt;
    union {&lt;br /&gt;
      __out u64 offset;&lt;br /&gt;
      __in  u64 align;&lt;br /&gt;
    };&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_MAP_BUFFER_EX ===&lt;br /&gt;
Map a memory region in the device address space. Identical to Linux driver pretty much.&lt;br /&gt;
&lt;br /&gt;
On success, the mapped memory region is locked by having [[SVC#MemoryState]] bit34 set.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u32 flags;          // bit0: fixed_offset, bit2: cacheable&lt;br /&gt;
    __in    u32 kind;           // -1 is default&lt;br /&gt;
    __in    u32 nvmap_handle;&lt;br /&gt;
    __inout u32 page_size;      // 0 means don&#039;t care&lt;br /&gt;
    __in    u64 buffer_offset;&lt;br /&gt;
    __in    u64 mapping_size;&lt;br /&gt;
    __inout   u64 offset;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_UNMAP_BUFFER ===&lt;br /&gt;
Unmap a memory region from the device address space.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __in u64 offset;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_INITIALIZE ===&lt;br /&gt;
Nintendo&#039;s custom implementation of NVGPU_GPU_IOCTL_ALLOC_AS (unavailable).&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 big_page_size;   // depends on GPU&#039;s available_big_page_sizes; 0=default&lt;br /&gt;
    __in s32 as_fd;           // ignored; passes 0&lt;br /&gt;
    __in u32 flags;           // ignored; passes 0&lt;br /&gt;
    __in u32 reserved;        // ignored; passes 0&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_GET_VA_REGIONS ===&lt;br /&gt;
Nintendo modified to get rid of pointer in struct.&lt;br /&gt;
&lt;br /&gt;
  struct va_region {&lt;br /&gt;
    u64 offset;&lt;br /&gt;
    u32 page_size;&lt;br /&gt;
    u32 pad;&lt;br /&gt;
    u64 pages;&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  struct {&lt;br /&gt;
    u64         not_used;   // (contained output user ptr on linux, ignored)&lt;br /&gt;
    __inout u32 bufsize;    // forced to 2*sizeof(struct va_region)&lt;br /&gt;
    u32         pad;&lt;br /&gt;
    __out struct va_region regions[2];&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_INITIALIZE_EX ===&lt;br /&gt;
Nintendo&#039;s custom implementation of NVGPU_GPU_IOCTL_ALLOC_AS (unavailable) with extra params.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 big_page_size;   // depends on GPU&#039;s available_big_page_sizes; 0=default&lt;br /&gt;
    __in s32 as_fd;           // ignored; passes 0&lt;br /&gt;
    __in u32 flags;           // passes 0&lt;br /&gt;
    __in u32 reserved;        // ignored; passes 0&lt;br /&gt;
    __in u64 unk0;&lt;br /&gt;
    __in u64 unk1;&lt;br /&gt;
    __in u64 unk2;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_REMAP ===&lt;br /&gt;
Nintendo&#039;s custom implementation of address space remapping.&lt;br /&gt;
&lt;br /&gt;
  struct remap_entry {&lt;br /&gt;
    __in u16 flags;        // 0 or 4&lt;br /&gt;
    __in u16 kind;           &lt;br /&gt;
    __in u32 nvmap_handle;&lt;br /&gt;
    __in u32 padding;&lt;br /&gt;
    __in u32 offset;       // (alloc_space_offset &amp;gt;&amp;gt; 0x10)&lt;br /&gt;
    __in u32 pages;        // alloc_space_pages&lt;br /&gt;
  };&lt;br /&gt;
 &lt;br /&gt;
 struct {&lt;br /&gt;
    __in struct remap_entry entries[];&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-dbg-gpu ==&lt;br /&gt;
Not accessible, but there is code to invoke it.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084401 || In || 8 || NVGPU_DBG_GPU_IOCTL_BIND_CHANNEL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??4402 || Inout || Variable || NVGPU_DBG_GPU_IOCTL_REG_OPS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084403 || In || 8 || NVGPU_DBG_GPU_IOCTL_EVENTS_CTRL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044404 || In || 4 || NVGPU_DBG_GPU_IOCTL_POWERGATE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044405 || In || 4 || NVGPU_DBG_GPU_IOCTL_SMPC_CTXSW_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0184407 || Inout || 24 || NVGPU_DBG_GPU_IOCTL_PERFBUF_MAP ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084408 || In || 8 || NVGPU_DBG_GPU_IOCTL_PERFBUF_UNMAP ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084409 || In || 8 || NVGPU_DBG_GPU_IOCTL_PC_SAMPLING ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008440A || In || 8 || NVGPU_DBG_GPU_IOCTL_TIMEOUT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8008440B || Out || 8 || NVGPU_DBG_GPU_IOCTL_GET_TIMEOUT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8004440C || Out || 4 || NVGPU_DBG_GPU_IOCTL_GET_GR_CONTEXT_SIZE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000440D || None || 0 || NVGPU_DBG_GPU_IOCTL_GET_GR_CONTEXT (uses Ioctl3) ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-ctrl-gpu ==&lt;br /&gt;
This device is for global (context independent) operations on the gpu.  &lt;br /&gt;
                                                                                                                                               &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x80044701 || Out || 4 || [[#NVGPU_GPU_IOCTL_ZCULL_GET_CTX_SIZE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80284702 || Out || 40 || [[#NVGPU_GPU_IOCTL_ZCULL_GET_INFO]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x402C4703 || In || 44 || [[#NVGPU_GPU_IOCTL_ZBC_SET_TABLE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0344704 || Inout || 52 || [[#NVGPU_GPU_IOCTL_ZBC_QUERY_TABLE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0B04705 || Inout || 176 || [[#NVGPU_GPU_IOCTL_GET_CHARACTERISTICS]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0184706 || Inout || 24 || NVGPU_GPU_IOCTL_GET_TPC_MASKS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084707 || In || 8 || [[#NVGPU_GPU_IOCTL_FLUSH_L2]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008470E || In || 8 || NVGPU_GPU_IOCTL_SET_MMUDEBUG_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4010470F || In || 16 || NVGPU_GPU_IOCTL_SET_SM_DEBUG_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0084710 || Inout || 8 || NVGPU_GPU_IOCTL_WAIT_FOR_PAUSE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80084711 || Out || 8 || NVGPU_GPU_IOCTL_GET_TPC_EXCEPTION_EN_STATUS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80084712 || Out || 8 || NVGPU_GPU_IOCTL_NUM_VSMS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0044713 || Inout || 4 || NVGPU_GPU_IOCTL_VSMS_MAPPING ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80084714 || Out || 8 || [[#NVGPU_GPU_IOCTL_ZBC_GET_ACTIVE_SLOT_MASK]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80044715 || Out || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8018471A || Out || 24 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC008471B || Inout || 8 || NVGPU_GPU_IOCTL_GET_ERROR_CHANNEL_USER_DATA ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010471C || Inout || 16 || NVGPU_GPU_IOCTL_GET_GPU_TIME ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC108471D || Inout || 264 || NVGPU_GPU_IOCTL_GET_CPU_TIME_CORRELATION_INFO ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZCULL_GET_CTX_SIZE ===&lt;br /&gt;
Returns the GPU&#039;s ZCULL context size. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __out u32 size;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZCULL_GET_CTX_SIZE ===&lt;br /&gt;
Returns GPU&#039;s ZCULL information. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __out u32 width_align_pixels;&lt;br /&gt;
    __out u32 height_align_pixels;&lt;br /&gt;
    __out u32 pixel_squares_by_aliquots;&lt;br /&gt;
    __out u32 aliquot_total;&lt;br /&gt;
    __out u32 region_byte_multiplier;&lt;br /&gt;
    __out u32 region_header_size;&lt;br /&gt;
    __out u32 subregion_header_size;&lt;br /&gt;
    __out u32 subregion_width_align_pixels;&lt;br /&gt;
    __out u32 subregion_height_align_pixels;&lt;br /&gt;
    __out u32 subregion_count;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZBC_SET_TABLE ===&lt;br /&gt;
Sets the active ZBC table. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __in u32 color_ds[4];&lt;br /&gt;
    __in u32 color_l2[4];&lt;br /&gt;
    __in u32 depth;&lt;br /&gt;
    __in u32 format;&lt;br /&gt;
    __in u32 type;         // 1=color, 2=depth&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZBC_QUERY_TABLE ===&lt;br /&gt;
Queries the active ZBC table. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __out u32 color_ds[4];&lt;br /&gt;
    __out u32 color_l2[4];&lt;br /&gt;
    __out u32 depth;&lt;br /&gt;
    __out u32 ref_cnt;&lt;br /&gt;
    __out u32 format;&lt;br /&gt;
    __out u32 type;&lt;br /&gt;
    __inout u32 index_size;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_GET_CHARACTERISTICS ===&lt;br /&gt;
Returns the GPU characteristics. Modified to return inline data instead of using a pointer.&lt;br /&gt;
&lt;br /&gt;
  struct gpu_characteristics {&lt;br /&gt;
    u32 arch;                           // 0x120 (NVGPU_GPU_ARCH_GM200)&lt;br /&gt;
    u32 impl;                           // 0xB (NVGPU_GPU_IMPL_GM20B)&lt;br /&gt;
    u32 rev;                            // 0xA1 (Revision A1)&lt;br /&gt;
    u32 num_gpc;                        // 0x1&lt;br /&gt;
    u64 l2_cache_size;                  // 0x40000&lt;br /&gt;
    u64 on_board_video_memory_size;     // 0x0 (not used)&lt;br /&gt;
    u32 num_tpc_per_gpc;                // 0x2&lt;br /&gt;
    u32 bus_type;                       // 0x20 (NVGPU_GPU_BUS_TYPE_AXI)&lt;br /&gt;
    u32 big_page_size;                  // 0x20000&lt;br /&gt;
    u32 compression_page_size;          // 0x20000&lt;br /&gt;
    u32 pde_coverage_bit_count;         // 0x1B&lt;br /&gt;
    u32 available_big_page_sizes;       // 0x30000&lt;br /&gt;
    u32 gpc_mask;                       // 0x1&lt;br /&gt;
    u32 sm_arch_sm_version;             // 0x503 (Maxwell Generation 5.0.3?)&lt;br /&gt;
    u32 sm_arch_spa_version;            // 0x503 (Maxwell Generation 5.0.3?)&lt;br /&gt;
    u32 sm_arch_warp_count;             // 0x80&lt;br /&gt;
    u32 gpu_va_bit_count;               // 0x28&lt;br /&gt;
    u32 reserved;                       // NULL&lt;br /&gt;
    u64 flags;                          // 0x55&lt;br /&gt;
    u32 twod_class;                     // 0x902D (FERMI_TWOD_A)&lt;br /&gt;
    u32 threed_class;                   // 0xB197 (MAXWELL_B)&lt;br /&gt;
    u32 compute_class;                  // 0xB1C0 (MAXWELL_COMPUTE_B)&lt;br /&gt;
    u32 gpfifo_class;                   // 0xB06F (MAXWELL_CHANNEL_GPFIFO_A)&lt;br /&gt;
    u32 inline_to_memory_class;         // 0xA140 (KEPLER_INLINE_TO_MEMORY_B)&lt;br /&gt;
    u32 dma_copy_class;                 // 0xB0B5 (MAXWELL_DMA_COPY_A)&lt;br /&gt;
    u32 max_fbps_count;                 // 0x1&lt;br /&gt;
    u32 fbp_en_mask;                    // 0x0 (disabled)&lt;br /&gt;
    u32 max_ltc_per_fbp;                // 0x2&lt;br /&gt;
    u32 max_lts_per_ltc;                // 0x1&lt;br /&gt;
    u32 max_tex_per_tpc;                // 0x0 (not supported)&lt;br /&gt;
    u32 max_gpc_count;                  // 0x1&lt;br /&gt;
    u32 rop_l2_en_mask_0;               // 0x21D70 (fuse_status_opt_rop_l2_fbp_r)&lt;br /&gt;
    u32 rop_l2_en_mask_1;               // 0x0&lt;br /&gt;
    u64 chipname;                       // 0x6230326D67 (&amp;quot;gm20b&amp;quot;)&lt;br /&gt;
    u64 gr_compbit_store_base_hw;       // 0x0 (not supported)&lt;br /&gt;
  };&lt;br /&gt;
 &lt;br /&gt;
  struct {&lt;br /&gt;
    __inout u64 gpu_characteristics_buf_size;   // must not be NULL, but gets overwritten with 0xA0=max_size&lt;br /&gt;
    __in    u64 gpu_characteristics_buf_addr;   // ignored, but must not be NULL&lt;br /&gt;
    __out struct gpu_characteristics gc;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_FLUSH_L2 ===&lt;br /&gt;
Flushes the GPU L2 cache.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 flush;          // l2_flush | l2_invalidate &amp;lt;&amp;lt; 1 | fb_flush &amp;lt;&amp;lt; 2&lt;br /&gt;
    u32      reserved;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZBC_GET_ACTIVE_SLOT_MASK ===&lt;br /&gt;
Returns the mask value for a ZBC slot.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u32 slot;       // always 0x07&lt;br /&gt;
    __out u32 mask;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
== Channels ==&lt;br /&gt;
Channels are a concept for  NVIDIA hardware blocks that share a common interface.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Path || Name&lt;br /&gt;
|-&lt;br /&gt;
| /dev/nvhost-gpu ||&lt;br /&gt;
|-&lt;br /&gt;
| /dev/nvhost-vic || Video Image Compositor&lt;br /&gt;
|-&lt;br /&gt;
| /dev/nvhost-nvdec || Video Decoder&lt;br /&gt;
|-&lt;br /&gt;
| /dev/nvhost-nvjpg || JPEG Decoder&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Channel Ioctls ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??0001 || Variable || NVHOST_IOCTL_CHANNEL_SUBMIT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080002 || 8 || NVHOST_IOCTL_CHANNEL_GET_SYNCPOINT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080003 || 8 || NVHOST_IOCTL_CHANNEL_GET_WAITBASE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080004 || 8 || NVHOST_IOCTL_CHANNEL_SET_TIMEOUT_EX ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040007 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080008 || 8 || NVHOST_IOCTL_CHANNEL_SET_CLK_RATE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??0009 || Variable || NVHOST_IOCTL_CHANNEL_MAP_BUFFER ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??000A || Variable || NVHOST_IOCTL_CHANNEL_UNMAP_BUFFER ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000013 || 0 || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40044801 || 4 || [[#NVGPU_IOCTL_CHANNEL_SET_NVMAP_FD]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044803 || 4 || NVGPU_IOCTL_CHANNEL_SET_TIMEOUT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084805 || 8 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0044807 || 4 || NVGPU_IOCTL_CHANNEL_CYCLE_STATS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??4808 || Variable || [[#NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0104809 || 16 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_OBJ_CTX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010480B || 16 || [[#NVGPU_IOCTL_CHANNEL_ZCULL_BIND]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC018480C || 24 || [[#NVGPU_IOCTL_CHANNEL_SET_ERROR_NOTIFIER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4004480D || 4 || [[#NVGPU_IOCTL_CHANNEL_SET_PRIORITY]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000480E || 0 || [[#NVGPU_IOCTL_CHANNEL_ENABLE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000480F || 0 || [[#NVGPU_IOCTL_CHANNEL_DISABLE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00004810 || 0 || [[#NVGPU_IOCTL_CHANNEL_PREEMPT]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00004811 || 0 || [[#NVGPU_IOCTL_CHANNEL_FORCE_RESET]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084812 || 8 || [[#NVGPU_IOCTL_CHANNEL_EVENT_ID_CONTROL]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0104813 || 16 || NVGPU_IOCTL_CHANNEL_CYCLE_STATS_SNAPSHOT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80804816 || 128 || NVGPU_IOCTL_CHANNEL_GET_ERROR_INFO ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0104817 || 16 || [[#NVGPU_IOCTL_CHANNEL_GET_ERROR_NOTIFICATION]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40204818 || 32 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??4819 || Variable || [[#NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO_RETRY]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC020481A || 32 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX2]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC018481B || 24 || (uses Ioctl2) ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC018481C || 24 || (uses Ioctl2) ||&lt;br /&gt;
|-&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40084714 || 8 || NVGPU_IOCTL_CHANNEL_SET_USER_DATA || Sets an unknown user context address&lt;br /&gt;
|-&lt;br /&gt;
| 0x80084715 || 8 || NVGPU_IOCTL_CHANNEL_GET_USER_DATA || Gets an unknown user context address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SET_NVMAP_FD ===&lt;br /&gt;
Binds a nvmap object to this channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 nvmap_fd;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO ===&lt;br /&gt;
Allocates gpfifo entries. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 num_entries;&lt;br /&gt;
    __in u32 flags;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO ===&lt;br /&gt;
Submits a gpfifo object. Modified to take inline entry objects instead of a pointer.&lt;br /&gt;
&lt;br /&gt;
  struct fence {&lt;br /&gt;
    u32 id;&lt;br /&gt;
    u32 value;&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  struct gpfifo_entry {&lt;br /&gt;
    u32 entry0;                           // gpu_va_lo&lt;br /&gt;
    u32 entry1;                           // gpu_va_hi | (unk_0x02 &amp;lt;&amp;lt; 0x08) | (size &amp;lt;&amp;lt; 0x0A) | (unk_0x01 &amp;lt;&amp;lt; 0x1F)&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 gpfifo;                      // (ignored) pointer to gpfifo fence structs&lt;br /&gt;
    __in u32 num_entries;                 // number of fence objects being submitted&lt;br /&gt;
    __in u32 flags;&lt;br /&gt;
    __out struct fence fence_out;         // returned new fence object for others to wait on&lt;br /&gt;
    __in  struct gpfifo_entry entries[];  // depends on num_entries&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ALLOC_OBJ_CTX ===&lt;br /&gt;
Allocates a graphics context object. Modified to ignore object&#039;s ID.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 class_num;    // 0x902D=2d, 0xB197=3d, 0xB1C0=compute, 0xA140=kepler, 0xB0B5=DMA, 0xB06F=channel_gpfifo&lt;br /&gt;
    __in  u32 flags;&lt;br /&gt;
    __out u64 obj_id;       // (ignored) used for FREE_OBJ_CTX ioctl, which is not supported&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ZCULL_BIND ===&lt;br /&gt;
Binds a ZCULL context to the channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __in u64 gpu_va;&lt;br /&gt;
    __in u32 mode;         // 0=global, 1=no_ctxsw, 2=separate_buffer, 3=part_of_regular_buf&lt;br /&gt;
    __in u32 padding;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SET_ERROR_NOTIFIER ===&lt;br /&gt;
Initializes the error notifier for this channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 offset;&lt;br /&gt;
    __in u64 size;&lt;br /&gt;
    __in u32 mem;       // nvmap object handle&lt;br /&gt;
    __in u32 padding;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SET_PRIORITY ===&lt;br /&gt;
Change channel&#039;s priority. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 priority;    // 0x32 is low, 0x64 is medium and 0x96 is high&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ENABLE ===&lt;br /&gt;
Enables the current channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_DISABLE ===&lt;br /&gt;
Disables the current channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_PREEMPT ===&lt;br /&gt;
Clears the FIFO pipe for this channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_FORCE_RESET ===&lt;br /&gt;
Forces the channel to reset. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_EVENT_ID_CONTROL ===&lt;br /&gt;
Controls event notifications.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 cmd;    // 0=disable, 1=enable, 2=clear&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_GET_ERROR_NOTIFICATION ===&lt;br /&gt;
Returns the current error notification caught by the error notifier. Exclusive to the Switch.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out   u64 timestamp;    // nanoseconds since Jan. 1, 1970&lt;br /&gt;
    __out   u32 info32;       // error code&lt;br /&gt;
    __out   u16 info16;       // additional error info&lt;br /&gt;
    __inout u16 status;       // always 0xFFFF&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO_RETRY ===&lt;br /&gt;
Allocates gpfifo entries with additional parameters. Exclusive to the Switch.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 num_entries;&lt;br /&gt;
    __in u32 flags;&lt;br /&gt;
    __in u32 unk0;            // 1 works&lt;br /&gt;
    __in u32 unk1;&lt;br /&gt;
    __in u32 unk2;&lt;br /&gt;
    __in u32 unk3;&lt;br /&gt;
    __in u32 unk4;&lt;br /&gt;
    __in u32 unk5;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO_EX ===&lt;br /&gt;
Submits a gpfifo object (async version). Exclusive to the Switch.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    u64 __gpfifo;                     // in (pointer to gpfifo fence structs; ignored)&lt;br /&gt;
    u32 __num_entries;                // in (number of fence objects being submitted)&lt;br /&gt;
    u32 __flags;                      // in&lt;br /&gt;
    struct fence        __fence_out;  // out (returned new fence object for others to wait on)&lt;br /&gt;
    struct gpfifo_entry __entries[];  // in (depends on __num_entries)&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX2 ===&lt;br /&gt;
Allocates gpfifo entries with additional parameters and returns a fence. Exclusive to the Switch.&lt;br /&gt;
 &lt;br /&gt;
  struct {&lt;br /&gt;
    u32 __num_entries;         // in&lt;br /&gt;
    u32 __flags;               // in&lt;br /&gt;
    u32 __unk0;                // in (1 works)&lt;br /&gt;
    struct fence __fence_out;  // out&lt;br /&gt;
    u32 __unk1;                // in&lt;br /&gt;
    u32 __unk2;                // in&lt;br /&gt;
    u32 __unk3;                // in&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
= nvmemp =&lt;br /&gt;
NVIDIA memory profiler (this service is not available on retail units).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Cmd0&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Cmd1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= nvdrvdbg =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#OpenLog]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#CloseLog]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [[#ReadLog]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== OpenLog ==&lt;br /&gt;
Takes process handle. Returns an fd.&lt;br /&gt;
&lt;br /&gt;
== CloseLog ==&lt;br /&gt;
Takes fd and closes it.&lt;br /&gt;
&lt;br /&gt;
== ReadLog ==&lt;br /&gt;
Takes fd and reads log into a type-6 buffer.&lt;br /&gt;
&lt;br /&gt;
= Errors =&lt;br /&gt;
Most nvidia driver commands return an error code apart from the normal return code.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Success&lt;br /&gt;
|-&lt;br /&gt;
| 1 || NotImplemented&lt;br /&gt;
|-&lt;br /&gt;
| 2 || NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 3 || NotInitialized&lt;br /&gt;
|-&lt;br /&gt;
| 4 || BadParameter&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| 6 || InsufficientMemory&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ReadOnlyAttribute&lt;br /&gt;
|-&lt;br /&gt;
| 8 || InvalidState&lt;br /&gt;
|-&lt;br /&gt;
| 9 || InvalidAddress&lt;br /&gt;
|-&lt;br /&gt;
| 0xA || InvalidSize&lt;br /&gt;
|-&lt;br /&gt;
| 0xB || BadValue&lt;br /&gt;
|-&lt;br /&gt;
| 0xD || AlreadyAllocated&lt;br /&gt;
|-&lt;br /&gt;
| 0xE || Busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xF || ResourceError&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || CountMismatch&lt;br /&gt;
|-&lt;br /&gt;
| 0x1000 || SharedMemoryTooSmall&lt;br /&gt;
|-&lt;br /&gt;
| 0x30003 || FileOperationFailed&lt;br /&gt;
|-&lt;br /&gt;
| 0x3000F || IoctlFailed                        &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Panic =&lt;br /&gt;
In some cases, a panic may occur. NV forces a crash by doing:&lt;br /&gt;
 (void *)0 = 0xCAFE;&lt;br /&gt;
End result is that the system hangs with a white-screen.&lt;br /&gt;
&lt;br /&gt;
== Gpfifo Panic ==&lt;br /&gt;
When the gpfifo data in the gpu_va buffers specified by the submitted gpfifo entries is invalid(?), eventually the user-process will be force-terminated after using the submit-gpfifo ioctl. It&#039;s unknown how exactly this is done.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=3424</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=3424"/>
		<updated>2018-01-14T23:15:29Z</updated>

		<summary type="html">&lt;p&gt;OgniK: Added idle tick count&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 || W0=result&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=out, X2=out&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2 || 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 || 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 || 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;
|-&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=event_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 || W0=thread_handle || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || svcBreak || X0,X1,X2=info || ?&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]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&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;
|- style=&amp;quot;border-top: double&amp;quot;&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 || W0=thread_handle, W1=[[#ThreadContext]]* || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] || X0=ptr, W1=type, X2=? X3=timeout ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] || X0=ptr, W1=type, X2=? W3=? ||&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=client_handle ?, W2=server_handle ?&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateJitMemory]] || X1=addr, X2=size || W0=result, W1=jit_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcMapJitMemory]] || W0=jit_handle, W1=[[#MapJitOperation]], 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 || W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id || 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, W1=[[#ThreadContextFlags]], X2=ThreadContext* || 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, 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;
| 0x70 || svcCreatePort || W2=max_sessions, W3=unk_bool, X4=name_ptr || W0=result, W1=clientport_handle, W2=serverport_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=srcaddr, W1=process_handle, X2=dstaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || W0=process_handle, X1=dstaddr, 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, X2=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 || 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 0x2000000.&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;
[2.0.0+] Size must be less than 0x18000000.&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;
If dstaddr &amp;gt;= LowerTreshold, the dst-range is enforced to be within the process&#039; &amp;quot;MapRegion&amp;quot;. Code can get the range of this region from [[#svcGetInfo]] id0=2,3.&lt;br /&gt;
&lt;br /&gt;
In this case, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
As long as (dstaddr+size) &amp;lt; LowerThreshold, then you can map anywhere but the mapped memory will have state 0x482907 instead.&lt;br /&gt;
&lt;br /&gt;
LowerTreshold is 0x80000000 for 36-bit address spaces, and 0x40000000 for 32-bit ones.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Support for the 0x482907 mappings outside the &amp;quot;MapRegion&amp;quot; were removed.&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;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Nano&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&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 nano=0 means &amp;quot;yield thread&amp;quot;.&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;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || 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 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || 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;
! 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 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&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;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40, error on num_handles == 0.&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;Port:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Session (server-side):&#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;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signalled before the timeout expired. Handle index is updated to indicate which object signalled.&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;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signalled within the timeout. Handle index is not updated.&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 must be 0x1000-aligned.&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 ||&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) ? || ? || ?&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When used on retail where inx0 bit31 is clear, the system will throw a [[Error_codes|fatal-error]]. Otherwise when bit31 is set, it will 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) 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;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || MapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || MapRegionSize&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 || TotalMemoryUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalHeapUsage&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+] NewMapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] NewMapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] IsVirtualAddressMemoryEnabled&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] Some size in bytes.&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+] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0+] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0 || Performance counter related.&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;
== 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;
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;
== svcCreateJitMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the JIT memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcMapJitMemory ==&lt;br /&gt;
Maps the backing memory for a JIT memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#MapJitOperation|MapJitOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#MapJitOperation|MapJitOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#MapJitOperation|MapJitOperation_UnmapOwner/MapJitOperation_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 memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&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;
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;
&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;
== 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;
== 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;
== 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 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || DstAddr&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) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || 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 [[#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 || u64 || 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;
&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;
== 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;
= Enum/Structures =&lt;br /&gt;
== ThreadContextRequestFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || NormalContext&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 ||&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;
== MapJitOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || MapJitOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MapJitOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || MapJitOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MapJitOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessEvent ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessEvent_Created&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessEvent_DebugAttached&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessEvent_DebugDetached&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessEvent_Crashed&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessEvent_Running&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessEvent_Exiting&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessEvent_Exited&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessEvent_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_ActualPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_CpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_CoreMask&lt;br /&gt;
|}&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;
| 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 || || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || Is64bit&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsSystem&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 ||&lt;br /&gt;
|}&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 || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed&lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcMapped: when IpcRefCount &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceMapped: 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_Type0&lt;br /&gt;
|-&lt;br /&gt;
| 11 || IpcSendAllowed_Type3&lt;br /&gt;
|-&lt;br /&gt;
| 12 || IpcSendAllowed_Type1&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+] JitMemoryAllowed&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_WeirdSharedMemory || 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_IpcBuffer0]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_MappedMemory || 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_IpcBuffer1]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_IpcBuffer3]] || 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_JitReadOnly || Mapped in kernel during [[#svcMapJitMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_JitWritable || Mapped in kernel during [[#svcMapJitMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&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;
&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 || u64 || Type (0=PausedThread, 1=RunningThread, 2=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 || u64 || 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 ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_Exit&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_UndefinedInstruction&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;
&lt;br /&gt;
UndefinedInstruction 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;
There is userland code for handling exceptions, however this doesn&#039;t seem to be executed on retail mode.&lt;br /&gt;
&lt;br /&gt;
When a usermode exception occurs, it jumps to the main code binary entrypoint (main_binary_address + 0 == &#039;&#039;&#039;_start&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
During normal boot &#039;&#039;&#039;_start&#039;&#039;&#039; is invoked with X0=0 and X1=main_thread_handle (triggering normal crt0 setup).&lt;br /&gt;
During an usermode exception &#039;&#039;&#039;_start&#039;&#039;&#039; is invoked with X0=exception_info0_ptr and X1=exception_info1_ptr instead.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;_start&#039;&#039;&#039; method determines whether to boot normally or handle an exception if X0 is set to 0 or not.&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Filesystem_services&amp;diff=3423</id>
		<title>Filesystem services</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Filesystem_services&amp;diff=3423"/>
		<updated>2018-01-14T22:48:54Z</updated>

		<summary type="html">&lt;p&gt;OgniK: Added cmd names to IDeviceOperator&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= fsp-ldr =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name || Arguments || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || MountCode || u64 TitleId + X descriptor [[#ContentPath]] || Returns an [[#IFileSystem]].&lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsCodeMounted || u64 ProcessId || Returns a bool (1 if code is mounted).&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [4.0.0+] Initialize || PID descriptor ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= fsp-pr =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#SetFsPermissions]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#ClearFsPermissions]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [4.0.0+] Initialize ||&lt;br /&gt;
|-&lt;br /&gt;
| 256 || [[#SetEnabledProgramVerification]] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SetFsPermissions ==&lt;br /&gt;
Takes a storageID, a pid, a titleID, a 0x1C type-A buffer for the [[NPDM#FS_Access_Header| FS Access Header]], and a 0x2C type-A buffer for the [[NPDM#FS_Access_Control| FS Access Control]]&lt;br /&gt;
&lt;br /&gt;
Final FS permissions are stored as (ACI0_perms &amp;amp; ACID_perms). Will panic(svcBreak) when buffer sizes from ipc-rawdata are invalid.&lt;br /&gt;
&lt;br /&gt;
== ClearFsPermissions ==&lt;br /&gt;
Takes a pid. Removes registered FS permissions for that PID.&lt;br /&gt;
&lt;br /&gt;
== SetEnabledProgramVerification ==&lt;br /&gt;
Seems to sets a global flag to inputval &amp;amp; 1.&lt;br /&gt;
&lt;br /&gt;
When the flag is zero, it will set ret=0 instead of ret={error} when verifying a RSA signature fails. This RSA signature seems to be the signature in the [[NPDM]] ACID. It then skips verifying what seems to be the second signature in the [[NCA_Format|NCA header]]. Note that if verifying the NPDM(?) signature is successful, and verifying that second signature fails, it will throw an error and abort.&lt;br /&gt;
&lt;br /&gt;
= fsp-srv =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [1.0.0] [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#Initialize]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || OpenDataFileSystemByCurrentProcess&lt;br /&gt;
|-&lt;br /&gt;
| 7 || [2.0.0+] [[#MountContent7]]&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [2.0.0+] [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || [3.0.0+] OpenDataFileSystemByApplicationId&lt;br /&gt;
|-&lt;br /&gt;
| 11 || [[#MountBis]]&lt;br /&gt;
|-&lt;br /&gt;
| 12 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 13 || InvalidateBisCache&lt;br /&gt;
|-&lt;br /&gt;
| 17 || OpenHostFileSystemImpl&lt;br /&gt;
|-&lt;br /&gt;
| 18 || MountSdCard&lt;br /&gt;
|-&lt;br /&gt;
| 19 || [2.0.0+] FormatSdCard&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#DeleteSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || [[#CreateSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#CreateSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || RegisterSaveDataAtomicDeletion&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [2.0.0+] DeleteSaveDataWithSpaceId&lt;br /&gt;
|-&lt;br /&gt;
| 26 || [2.0.0+] FormatSdCardDryRun&lt;br /&gt;
|-&lt;br /&gt;
| 27 || [2.0.0+] IsExFatSupported&lt;br /&gt;
|-&lt;br /&gt;
| 28 || [4.0.0+] DeleteSystemSaveData&lt;br /&gt;
|-&lt;br /&gt;
| 30 || [[#OpenGameCardPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 31 || [[#MountGameCardPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 32 || [3.0.0+] ExtendSaveData&lt;br /&gt;
|-&lt;br /&gt;
| 51 || [[#MountSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 52 || [[#MountSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 53 || [2.0.0+] MountSaveDataReadOnly&lt;br /&gt;
|-&lt;br /&gt;
| 57 || [3.0.0+] ReadSaveDataFileSystemExtraDataWithSpaceId&lt;br /&gt;
|-&lt;br /&gt;
| 58 || ReadSaveDataFileSystemExtraData&lt;br /&gt;
|-&lt;br /&gt;
| 59 || [2.0.0+] WriteSaveDataFileSystemExtraData&lt;br /&gt;
|-&lt;br /&gt;
| 60 || OpenSaveDataInfoReader&lt;br /&gt;
|-&lt;br /&gt;
| 61 || OpenSaveDataIterator&lt;br /&gt;
|-&lt;br /&gt;
| 80 || OpenSaveDataThumbnailFile&lt;br /&gt;
|-&lt;br /&gt;
| 81 || [4.0.0+] OpenSaveDataTransferManager&lt;br /&gt;
|-&lt;br /&gt;
| 100 || MountImageDirectory&lt;br /&gt;
|-&lt;br /&gt;
| 110 || [[#MountContentStorage]]&lt;br /&gt;
|-&lt;br /&gt;
| 200 || OpenDataStorageByCurrentProcess&lt;br /&gt;
|-&lt;br /&gt;
| 201 || [3.0.0+] OpenDataStorageByApplicationId&lt;br /&gt;
|-&lt;br /&gt;
| 202 || [[#OpenDataStorageByDataId]]&lt;br /&gt;
|-&lt;br /&gt;
| 203 || Returns an [[#IStorage]]&lt;br /&gt;
|-&lt;br /&gt;
| 400 || [[#OpenDeviceOperator]]&lt;br /&gt;
|-&lt;br /&gt;
| 500 || [[#OpenSdCardDetectionEventNotifier]]&lt;br /&gt;
|-&lt;br /&gt;
| 501 || [[#OpenGameCardDetectionEventNotifier]]&lt;br /&gt;
|-&lt;br /&gt;
| 600 || [1.0.0-3.0.2] SetCurrentPosixTime&lt;br /&gt;
|-&lt;br /&gt;
| 601 || QuerySaveDataTotalSize&lt;br /&gt;
|-&lt;br /&gt;
| 602 || [[#VerifySaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 603 || CorruptSaveDataForDebug&lt;br /&gt;
|-&lt;br /&gt;
| 604 || CreatePaddingFile&lt;br /&gt;
|-&lt;br /&gt;
| 605 || DeleteAllPaddingFiles&lt;br /&gt;
|-&lt;br /&gt;
| 606 || [2.0.0+] GetRightsId&lt;br /&gt;
|-&lt;br /&gt;
| 607 || [2.0.0+] RegisterExternalKey&lt;br /&gt;
|-&lt;br /&gt;
| 608 || [2.0.0+] UnregisterExternalKey&lt;br /&gt;
|-&lt;br /&gt;
| 609 || [2.0.0+] GetRightsIdByPath&lt;br /&gt;
|-&lt;br /&gt;
| 610 || [3.0.0+] GetRightsIdByPath2 (returns extra byte)&lt;br /&gt;
|-&lt;br /&gt;
| 611 || [4.0.0+] SetCurrentPosixTime&lt;br /&gt;
|-&lt;br /&gt;
| 612 || [4.0.0+] GetFreeSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| 613 || [4.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 614 || [4.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 620 || [2.0.0+] [[#SetSdCardEncryptionSeed]]&lt;br /&gt;
|-&lt;br /&gt;
| 630 || [4.0.0+] SetSdCardAccessibility&lt;br /&gt;
|-&lt;br /&gt;
| 631 || [4.0.0+] IsSdCardAccessible&lt;br /&gt;
|-&lt;br /&gt;
| 640 || [4.0.0+] IsSignedSystemPartitionOnSdCardValid&lt;br /&gt;
|-&lt;br /&gt;
| 800 || [2.0.0+] GetAndClearFileSystemProxyErrorInfo&lt;br /&gt;
|-&lt;br /&gt;
| 1000 || SetBisRootForHost&lt;br /&gt;
|-&lt;br /&gt;
| 1001 || SetSaveDataSize&lt;br /&gt;
|-&lt;br /&gt;
| 1002 || SetSaveDataRootPath&lt;br /&gt;
|-&lt;br /&gt;
| 1003 || DisableAutoSaveDataCreation&lt;br /&gt;
|-&lt;br /&gt;
| 1004 || [[#SetGlobalAccessLogMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 1005 || [[#GetGlobalAccessLogMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 1006 || [[#OutputAccessLogToSdCard]]&lt;br /&gt;
|-&lt;br /&gt;
| 1007 || [4.0.0+] RegisterUpdatePartition&lt;br /&gt;
|-&lt;br /&gt;
| 1008 || [4.0.0+] MountRegisteredUpdatePartition&lt;br /&gt;
|-&lt;br /&gt;
| 1009 || [4.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 1100 || [4.0.0+] OverrideSaveDataTransferTokenSignVerificationKey&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Permissions ==&lt;br /&gt;
Every time permissions are checked, the process registration [[#fsp-pr]] is loaded using the session processID. The permission data is populated with data from the [[NPDM]],&lt;br /&gt;
&lt;br /&gt;
If the processID is &amp;lt;= 6 (which happens only for built-in sysmodules), it will use a hardcoded registration data. The default mask in this case is 0x8000000000000000.&lt;br /&gt;
&lt;br /&gt;
Note that the functions check whether or not at least one bit is set in the mask. This means that, you don&#039;t need to set 0xFFFFFFFFFFFFFFFF to get all permissions: it suffices to set 0x8000000000000000.&lt;br /&gt;
&lt;br /&gt;
If the code were to request an invalid input type, panic. But this never happens.&lt;br /&gt;
&lt;br /&gt;
=== RwPermissions ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type(s) || Mask || Name || Value || Used by&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x8000000000000801 || MountContentType2 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || 0x8000000000000801 || MountContentType5 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || 0x8000000000000801 || MountContentType3 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x3 || 0x8000000000000801 || MountContentType4 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || 0x8000000000000801 || MountContentType6 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x5 || 0x8000000000000801 || MountContentType7 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x6 || 0x8000000000000000 || || 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x7 || 0x8000000000000800 || ContentStorageAccess || 3 || [[#MountContentStorage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || 0x8000000000001000 || ImageDirectoryAccess || 3 || [[#MountImageDirectory]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x9 || 0x8000000000000084 || MountBisType28 || 3 || [[#MountBis]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xA || 0x8000000000000080 || MountBisType29 || 3 || [[#MountBis]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xB || 0x8000000000008080 || MountBisType30 || 3 || [[#MountBis]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xC || 0x8000000000008080 || MountBisType31 || 3 || [[#MountBis]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xD || 0x8000000000000080 || || 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xE || 0xC000000000200000 || SdCardAccess || 3 || [[#MountSdCard]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xF || 0x8000000000000010 || GameCardUser || 3 || [[#MountGameCardPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 0x8000000000040020 || SaveDataAccess0 || 3 || [[#MountSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || 0x8000000000000028 || SystemSaveDataAccess0 || 3 || [[#MountSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || 0x8000000000000020 || SaveDataAccess1 || 3 || [[#MountSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || 0x8000000000000020 || SystemSaveDataAccess1 || 3 || [[#MountSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 0x8000000000010082 || BisPartition0 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || 0x8000000000010080 || BisPartition10 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || 0x8000000000010080 || BisPartition20 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 0x8000000000010080 || BisPartition21 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || 0x8000000000010080 || BisPartition22 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || 0x8000000000010080 || BisPartition23 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || 0x8000000000010080 || BisPartition24 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 0x8000000000010080 || BisPartition25 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || 0x8000000000000080 || BisPartition26 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || 0x8000000000000084 || BisPartition27 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || 0x8000000000000084 || BisPartition28 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || 0x8000000000000080 || BisPartition29 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x8000000000000080 || BisPartition30 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || 0x8000000000000080 || BisPartition31 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || 0x8000000000000080 || BisPartition32 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || 0xC000000000200000 || || 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x8000000000000100 || GameCard_System || 3 || [[#OpenGameCardPartition]],  [[#EraseGameCard]] (bit1), [[#WriteToGameCard]] (bit1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || 0x8000000000100008 || MountContent_System || 1 || [[#MountContent]], [[#OpenDataStorageByDataId]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || 0xC000000000400000 || HostAccess || 3 || [[#OpenHostFileSystemImpl]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== BoolPermissions ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type(s) || Mask || Name || Used by&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x8000000000000080 || BisCache || [[#InvalidateBisCache]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || 0x8000000000000080 || EraseMmc || [[#EraseMmc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || 0x8000000000000010 || GameCardCertificate || [[#GetGameCardDeviceCertificate]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x3 || 0x8000000000000010 || GameCardIdSet || [[#GetGameCardIdSet]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || 0x8000000000000200 || GameCardDriver || [[#FinalizeGameCardDriver]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x5 || 0x8000000000000200 || GameCardAsic || [[#GetGameCardAsicInfo]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x6 || 0x8000000000002020 || SaveDataCreate || [[#CreateSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7 || 0x8000000000000060 || SaveDataDelete0 || [[#DeleteSaveData]], [[#RegisterSaveDataAtomicDeletion]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || 0x8000000000000028 || SystemSaveDataCreate0 || [[#CreateSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x9 || 0x8000000000000020 || SystemSaveDataCreate1 || [[#CreateSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xA || 0x8000000000004028 || SaveDataDelete1 || [[#DeleteSaveData]], [[#RegisterSaveDataAtomicDeletion]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xB || 0x8000000000000060 || SaveDataIterators0 || [[#OpenSaveDataIterator]], [[#OpenSaveDataInfoIterator]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xC || 0x8000000000004020 || SaveDataIterators1 || [[#OpenSaveDataIterator]], [[#OpenSaveDataInfoIterator]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xD || 0x8000000000020000 || SaveThumbnails || [[#OpenSaveDataThumbnailFile]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xE || 0x8000000000000400 || PosixTime || [[#SetCurrentPosixTime]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xF || 0x8000000000004060 || SaveDataExtraData || [[#ReadSaveDataFileSystemExtraData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 0x8000000000080000 || GlobalMode || [[#SetGlobalAccessMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || 0x8000000000080000 || SpeedEmulation || [[#SetSpeedEmulationMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || Invalid || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || 0xC000000000800000 || PaddingFiles || [[#CreatePaddingFile]], [[#DeletePaddingFiles]] &lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 0xC000000001000000 || SaveData_Debug || [[#CorruptSaveDataForDebug]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || 0xC000000002000000 || SaveData_SystemManagement || [[#CreateSaveData]], [[#MountSaveData]], [[#SetSaveDataRootPath]]&lt;br /&gt;
|-&lt;br /&gt;
| [2.0.0+] 0x16 || 0x8000000004000000 || || &lt;br /&gt;
|-&lt;br /&gt;
| [2.0.0+] 0x17 || 0x8000000008000000 || || &lt;br /&gt;
|-&lt;br /&gt;
| [2.0.0+] 0x18 || 0x8000000010000000 || || &lt;br /&gt;
|-&lt;br /&gt;
| [2.0.0+] 0x19 || 0x8000000000000800 || || &lt;br /&gt;
|-&lt;br /&gt;
| [2.0.0+] 0x1A || 0x8000000000004020 || || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Initialize ==&lt;br /&gt;
Takes a pid-descriptor.&lt;br /&gt;
&lt;br /&gt;
== MountContent7 ==&lt;br /&gt;
Takes an input u32 (same as [[#MountContent]]) and an u64 title-id. Web-applet loads the u32 from u32_table[inparam]. The in32 must be 4.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
Note: web-applet strings refer to both this cmd and the below &amp;quot;MountContent&amp;quot; as &amp;quot;MountContent&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== MountContent ==&lt;br /&gt;
Takes a type-0x19 input buffer, an in32, and an input title-id.&lt;br /&gt;
&lt;br /&gt;
The in32 must be 5 if the NCA type is 0 (control).&lt;br /&gt;
&lt;br /&gt;
The in32 must be 2..7.&lt;br /&gt;
&lt;br /&gt;
The input buffer is the output string path from nsam [[NS_Services#GetContentNcaPath|GetContentNcaPath]].&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
May return errors when attempting to access NCA-paths for an update-title with a gamecard, when the gamecard isn&#039;t inserted. May return error 0x7D402 in some cases with update-titles. Non-val2 in32 values with NCA-type1 are unusable, even for normal titles.&lt;br /&gt;
&lt;br /&gt;
The official &amp;quot;MountApplicationPackage&amp;quot; func uses this with in64=0 and in32=7.&lt;br /&gt;
&lt;br /&gt;
After the in32-specific permissions are checked, it then gets the func retval for permissions-type 0x25 and func0.&lt;br /&gt;
&lt;br /&gt;
When in32=5, it uses in64=0xffffffffffffffff internally, otherwise it checks if in64 is set to 0xffffffffffffffff then throws an error if so. When the in64 used internally is not 0xffffffffffffffff, it&#039;s compared with the NCA titleID, then an error is thrown on mismatch.&lt;br /&gt;
&lt;br /&gt;
== MountBis ==&lt;br /&gt;
Takes a type-0x19 input buffer string and a u32 Bis partitionID(see below). Official user-process code sets instr[0] = 0 normally.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
Only partitionIDs for FAT partitions are usable with this, otherwise error 0x2EE202 is returned. Seems to be about the same as [[#OpenBisPartition]] except this mounts the partition filesystem instead of allowing direct access to the partition sectors.&lt;br /&gt;
&lt;br /&gt;
== OpenBisPartition ==&lt;br /&gt;
Takes a u32 partition ID, returns 0x2EE202 for partitions which do not exist, 0x320002 for partitions which cannot be opened and a valid [[#IStorage]] handle otherwise.&lt;br /&gt;
&lt;br /&gt;
== InvalidateBisCache ==&lt;br /&gt;
Seems to invalidate the Bis cache for MBR/GPT after overwriting that data via the OpenBisPartition IStorage. Used by [[SystemInitializer]].&lt;br /&gt;
&lt;br /&gt;
== DeleteSaveData ==&lt;br /&gt;
Takes an input u64.&lt;br /&gt;
&lt;br /&gt;
== CreateSaveData ==&lt;br /&gt;
Takes a 0x40-byte Save-struct entry, a 0x40-byte SaveCreate-struct entry, and a 0x10-byte input struct.&lt;br /&gt;
&lt;br /&gt;
Only the first 0x5-bytes in the 0x10-byte struct are initialized: all-zero when automatically creating savedata during savecommon mount by official user-processes. In the dedicated save-creation code in official user-processes: +0 u32 = 0x40060, +4 u8 = 1.&lt;br /&gt;
&lt;br /&gt;
Creates regular savedata.&lt;br /&gt;
&lt;br /&gt;
== CreateSystemSaveData ==&lt;br /&gt;
Takes a 0x40-byte Save-struct entry and a 0x40-byte SaveCreate-struct entry.&lt;br /&gt;
&lt;br /&gt;
Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.&lt;br /&gt;
&lt;br /&gt;
== OpenGameCardPartition ==&lt;br /&gt;
&lt;br /&gt;
Takes an input u32 (partition ID), and returns an [[#IStorage]] for the [[Gamecard_Format|partition]].&lt;br /&gt;
&lt;br /&gt;
== MountGameCardPartition ==&lt;br /&gt;
Takes two input u32s, with the second u32 located at +4 in rawdata after the first u32.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
Mounts a gamecard [[Gamecard_Partition|partition]].&lt;br /&gt;
&lt;br /&gt;
== MountSaveData ==&lt;br /&gt;
Takes an input u8 and a 0x40-byte Save-struct entry. Official user-process code is only known to use value 1 for the u8.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
Permissions aren&#039;t checked until the specified save is successfully found.&lt;br /&gt;
&lt;br /&gt;
Only one process can mount a given savedata at any given time (this includes systemsavedata).&lt;br /&gt;
&lt;br /&gt;
== MountSystemSaveData ==&lt;br /&gt;
Takes an input u8 and a 0x40-byte Save-struct entry. Web-applet only uses value0 for the input u8.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
Mounts savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.&lt;br /&gt;
&lt;br /&gt;
== MountContentStorage ==&lt;br /&gt;
Takes a [[#ContentStorageId]]. Invalid values return 0x2EE202.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]] with NCA files. The read data from these files is identical to the data read by [[Content_Manager_services#ReadEntryRaw]].&lt;br /&gt;
&lt;br /&gt;
== OpenDataStorageByDataId ==&lt;br /&gt;
Takes a [[#StorageId]] and a TitleID.&lt;br /&gt;
&lt;br /&gt;
Returns a [[IPC_Marshalling#Domain_message|domain object ID]] implementing the [[#IStorage]] interface for data archives.&lt;br /&gt;
&lt;br /&gt;
== OpenDeviceOperator ==&lt;br /&gt;
This command returns a session to a port implementing the [[#IDeviceOperator]] interface.&lt;br /&gt;
&lt;br /&gt;
== OpenSdCardDetectionEventNotifier ==&lt;br /&gt;
This command returns a session to a port implementing the [[#IEventNotifier]] interface.&lt;br /&gt;
&lt;br /&gt;
== OpenGameCardDetectionEventNotifier ==&lt;br /&gt;
This command returns a session to a port implementing the [[#IEventNotifier]] interface.&lt;br /&gt;
&lt;br /&gt;
== VerifySaveData ==&lt;br /&gt;
Takes an unknown input u64 and a type-0x6 output buffer.&lt;br /&gt;
&lt;br /&gt;
The input u64 high-byte must be non-zero, otherwise an [[Error_codes|error]] is returned(0xE02).&lt;br /&gt;
&lt;br /&gt;
== SetSdCardEncryptionSeed ==&lt;br /&gt;
Takes 0x10-bytes of input.&lt;br /&gt;
&lt;br /&gt;
Appears to be used to load the seed into FS-module state, since FS-module itself doesn&#039;t seem to have file-reading code to handle this itself.&lt;br /&gt;
&lt;br /&gt;
[[NS_Services|NS]]-module uses this with data read from a file.&lt;br /&gt;
&lt;br /&gt;
== SetGlobalAccessLogMode ==&lt;br /&gt;
Takes an input u32.&lt;br /&gt;
&lt;br /&gt;
== GetGlobalAccessLogMode ==&lt;br /&gt;
Returns an output u32.&lt;br /&gt;
&lt;br /&gt;
GlobalAccessLogMode is normally 0.&lt;br /&gt;
&lt;br /&gt;
== OutputAccessLogToSdCard ==&lt;br /&gt;
Takes a type-0x5 input buffer.&lt;br /&gt;
&lt;br /&gt;
The input buffer is the string to output to the log. User-processes normally include a newline at the end.&lt;br /&gt;
&lt;br /&gt;
User-processes only use this when the value previously loaded from [[#GetGlobalAccessLogMode]] has bit1 set.&lt;br /&gt;
&lt;br /&gt;
When bit1 in GlobalAccessLogMode is clear, FS-module will just return 0 for OutputAccessLogToSdCard. However even with that set the log doesn&#039;t show up SD, unknown why.&lt;br /&gt;
&lt;br /&gt;
The input buffer is written to the &amp;quot;$FsAccessLog:/FsAccessLog.txt&amp;quot; file, where &amp;quot;$FsAccessLog&amp;quot; is the SD-card mount-name. It&#039;s written to the current end of the file(appended).&lt;br /&gt;
&lt;br /&gt;
= IStorage =&lt;br /&gt;
This is the interface for a raw device, usually a block device.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name || Arguments&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Read || Takes a type-0x46 buffer, an offset and length &lt;br /&gt;
|-&lt;br /&gt;
| 1 || Write || Takes a type-0x45 buffer, an offset and length &lt;br /&gt;
|-&lt;br /&gt;
| 2 || Flush || None&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SetSize || Takes a size&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GetSize || None&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [4.0.0+] OperateRange ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= IFileSystem =&lt;br /&gt;
There are two main implementations of this interface:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RomFS&#039;&#039;&#039;: Filesystem implementation statically linked in the binary. Uses an [[#IStorage]] interface as underlying raw device.&lt;br /&gt;
* &#039;&#039;&#039;IPC proxy&#039;&#039;&#039;: Used for all non-RomFS filesystems. In this case, actual filesystem implementation is in the FS process.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CreateFile&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeleteFile&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CreateDirectory&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeleteDirectory&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeleteDirectoryRecursively&lt;br /&gt;
|-&lt;br /&gt;
| 5 || RenameFile&lt;br /&gt;
|-&lt;br /&gt;
| 6 || RenameDirectory&lt;br /&gt;
|-&lt;br /&gt;
| 7 || [[#GetEntryType]]&lt;br /&gt;
|-&lt;br /&gt;
| 8 || OpenFile&lt;br /&gt;
|-&lt;br /&gt;
| 9 || [[#OpenDirectory]]&lt;br /&gt;
|-&lt;br /&gt;
| 10 || [[#Commit]]&lt;br /&gt;
|-&lt;br /&gt;
| 11 || [[#GetFreeSpaceSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 12 || [[#GetTotalSpaceSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 13 || CleanDirectoryRecursively [3.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GetFileTimeStampRaw [3.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [4.0.0+] QueryEntry&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GetEntryType ==&lt;br /&gt;
Takes a type-0x9 input buffer for the path and returns [[#DirectoryEntryType]] as an output u32.&lt;br /&gt;
&lt;br /&gt;
==OpenDirectory==&lt;br /&gt;
Takes a type-0x9 input buffer for the path and an u64 &#039;&#039;&#039;filter_flags&#039;&#039;&#039;. &#039;&#039;&#039;filter_flags&#039;&#039;&#039; controls what type of entries are read by the [[#IDirectory]]: bitmask 0x1 = directories, bitmask 0x2 = files.&lt;br /&gt;
&lt;br /&gt;
== Commit ==&lt;br /&gt;
Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect.&lt;br /&gt;
&lt;br /&gt;
== GetFreeSpaceSize ==&lt;br /&gt;
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total free space with this FS.&lt;br /&gt;
&lt;br /&gt;
== GetTotalSpaceSize ==&lt;br /&gt;
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total space available with this FS(free+used).&lt;br /&gt;
&lt;br /&gt;
= IDirectory =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#Read]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#GetEntryCount]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
Takes a type-0x6 output buffer and an input u64. Unknown what the u64 is for, doesn&#039;t(?) seem to affect output. Returns an output u64(?) for the total number of read entries, this is 0 when no more entries are available.&lt;br /&gt;
&lt;br /&gt;
The output buffer contains the read array of [[#DirectoryEntry]]. This doesn&#039;t include entries for &amp;quot;.&amp;quot; and &amp;quot;..&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== GetEntryCount ==&lt;br /&gt;
Returns an u64 for the total number of readable entries.&lt;br /&gt;
&lt;br /&gt;
= DirectoryEntry =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Size || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x300 || Path&lt;br /&gt;
|-&lt;br /&gt;
| 0x300 || 0x4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x304 || 0x1 || [[#DirectoryEntryType]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x305 || 0x3 || Padding?&lt;br /&gt;
|-&lt;br /&gt;
| 0x308 || 0x8? || Filesize, 0 for directories.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= DirectoryEntryType =&lt;br /&gt;
s8 type: 0 = directory, 1 = file.&lt;br /&gt;
&lt;br /&gt;
= IFile =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Read&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Write&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Flush&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GetSize&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [4.0.0+]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ISaveDataInfoReader =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= IDeviceOperator =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsSdCardInserted&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GetSdCardSpeedMode&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [2.0.0+] GetSdCardCid&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] GetSdCardUserAreaSize&lt;br /&gt;
|-&lt;br /&gt;
| 4 || [2.0.0+] GetSdCardProtectedAreaSize&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [2.0.0+] GetAndClearSdCardErrorInfo&lt;br /&gt;
|-&lt;br /&gt;
| 6 || [2.0.0-&amp;gt;3.0.0]&lt;br /&gt;
|-&lt;br /&gt;
| 100 || GetMmcCid&lt;br /&gt;
|-&lt;br /&gt;
| 101 || GetMmcSpeedMode&lt;br /&gt;
|-&lt;br /&gt;
| 110 || EraseMmc&lt;br /&gt;
|-&lt;br /&gt;
| 111 || GetMmcPartitionSize&lt;br /&gt;
|-&lt;br /&gt;
| 112 || [2.0.0+] GetMmcPatrolCount&lt;br /&gt;
|-&lt;br /&gt;
| 113 || [2.0.0+] GetAndClearMmcErrorInfo&lt;br /&gt;
|-&lt;br /&gt;
| 114 || [2.0.0+] GetMmcExtendedCsd&lt;br /&gt;
|-&lt;br /&gt;
| 115 || [4.0.0+] SuspendMmcPatrol&lt;br /&gt;
|-&lt;br /&gt;
| 116 || [4.0.0+] ResumeMmcPatrol&lt;br /&gt;
|-&lt;br /&gt;
| 200 || IsGameCardInserted&lt;br /&gt;
|-&lt;br /&gt;
| 201 || EraseGameCard&lt;br /&gt;
|-&lt;br /&gt;
| 202 || GetGameCardHandle&lt;br /&gt;
|-&lt;br /&gt;
| 203 || [[#GetGameCardUpdatePartitionInfo]]&lt;br /&gt;
|-&lt;br /&gt;
| 204 || FinalizeGameCardDriver&lt;br /&gt;
|-&lt;br /&gt;
| 205 || GetGameCardAttribute&lt;br /&gt;
|-&lt;br /&gt;
| 206 || GetGameCardDeviceCertificate&lt;br /&gt;
|-&lt;br /&gt;
| 207 || GetGameCardAsicInfo&lt;br /&gt;
|-&lt;br /&gt;
| 208 || GetGameCardIdSet&lt;br /&gt;
|-&lt;br /&gt;
| 209 || WriteToGameCard&lt;br /&gt;
|-&lt;br /&gt;
| 210 || SetVerifyWriteEnalbleFlag&lt;br /&gt;
|-&lt;br /&gt;
| 211 || GetGameCardImageHash&lt;br /&gt;
|-&lt;br /&gt;
| 212 || [2.0.0+] GetGameCardErrorInfo&lt;br /&gt;
|-&lt;br /&gt;
| 213 || [2.0.0+] EraseAndWriteParamDirectly&lt;br /&gt;
|-&lt;br /&gt;
| 214 || [2.0.0+] ReadParamDirectly&lt;br /&gt;
|-&lt;br /&gt;
| 215 || [2.0.0+] ForceEraseGameCard&lt;br /&gt;
|-&lt;br /&gt;
| 216 || [2.0.0+] GetGameCardErrorInfo&lt;br /&gt;
|-&lt;br /&gt;
| 217 || [2.1.0+] GetGameCardErrorReportInfo&lt;br /&gt;
|-&lt;br /&gt;
| 218 || [3.0.1+]&lt;br /&gt;
|-&lt;br /&gt;
| 300 || SetSpeedEmulationMode&lt;br /&gt;
|-&lt;br /&gt;
| 301 || GetSpeedEmulationMode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GetGameCardUpdatePartitionInfo ==&lt;br /&gt;
&lt;br /&gt;
Returns a titleID and the title-version for it.&lt;br /&gt;
&lt;br /&gt;
* Output u32 with ARMS-gamecard: title-version v131162. This is the title-version for [[2.1.0]], which is the sysupdate included with this gamecard. Launch-day gamecards return title-version v450.&lt;br /&gt;
* Output u64 with ARMS-gamecard: titleID 0100000000000816.&lt;br /&gt;
&lt;br /&gt;
[[NS_Services|NS]] appears to only use this with [[Content_Manager_services#GetTitleIdInfo]] and [[Content_Manager_services#GetUpdateTitleList]] with storageid=nandsys, for checking whether a sysupdate is required.&lt;br /&gt;
&lt;br /&gt;
= IEventNotifier =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || BindEvent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= StorageId =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || None&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Host&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GameCard&lt;br /&gt;
|-&lt;br /&gt;
| 3 || NandSystem&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NandUser&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SdCard&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ContentStorageId =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || NandSystem&lt;br /&gt;
|-&lt;br /&gt;
| 1 || NandUser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SdCard&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ContentPath =&lt;br /&gt;
These are the 0x300 paths to NCA files for the various filesystems FS can access, beginning with @. They&#039;re passed via X descriptors, and returned via various [[Location Resolver services|ncm/lr]] commands.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Path || Notes&lt;br /&gt;
|-&lt;br /&gt;
| @SystemContent ||&lt;br /&gt;
|- &lt;br /&gt;
| @UserContent ||&lt;br /&gt;
|-&lt;br /&gt;
| @SdCardContent ||&lt;br /&gt;
|-&lt;br /&gt;
| @CalibFile ||&lt;br /&gt;
|-&lt;br /&gt;
| @Safe ||&lt;br /&gt;
|-&lt;br /&gt;
| @User ||&lt;br /&gt;
|-&lt;br /&gt;
| @System ||&lt;br /&gt;
|-&lt;br /&gt;
| @Sdcard ||&lt;br /&gt;
|-&lt;br /&gt;
| @Host ||&lt;br /&gt;
|-&lt;br /&gt;
| @GcApp || Gamecard App partition (Partition 2)&lt;br /&gt;
|-&lt;br /&gt;
| @GcS00000001 || Gamecard Contents.&lt;br /&gt;
|-&lt;br /&gt;
| @upp || Gamecard update partition (Partition 0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=BisPartitionID=&lt;br /&gt;
* 0: Raw NAND sectors access for MMC [[Flash_Filesystem|boot]] partition 0.&lt;br /&gt;
* 10: Raw NAND sectors access for MMC [[Flash_Filesystem|boot]] partition 1.&lt;br /&gt;
* Rest: see [[Flash_Filesystem|here]].&lt;br /&gt;
&lt;br /&gt;
=Save Struct=&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0 for SystemSaveData. SaveData: 0 can be used for accessing the savedata associated with the current FS session titleID, otherwise when set this is the titleID associated with the savedata to access.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x10&lt;br /&gt;
| userID for user-specific savedata(saveuser) when set, otherwise when zero this indicates the common savedata(savecommon). This is loaded from [[Account_services]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x8&lt;br /&gt;
| u64 [[Flash_Filesystem|saveID]]. 0 for SaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x8&lt;br /&gt;
| ContentStorageId? 0 for SystemSaveData. 1 for SaveData. 2 for DeviceSaveData(with official user-processes all other fields are 0 for DeviceSaveData).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0 for SystemSaveData/SaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0 for SystemSaveData/SaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0 for SystemSaveData/SaveData.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Total size is 0x40-bytes.&lt;br /&gt;
&lt;br /&gt;
=SaveCreate Struct=&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x8&lt;br /&gt;
| [[Savegames|IVFC]] level4 size?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| Same as offset 0x0 normally? Hard-coded to 0x80000 for BcatSaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x4000 for SystemSaveData/SaveData/DeviceSaveData/BcatSaveData. [[Savegames|IVFC]] level4 block-size in bytes?&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x8&lt;br /&gt;
| Official user-processes only uses 0 here for SystemSaveData/SaveData. For the dedicated save-creation code with SaveData/DeviceSaveData, this value comes from an input param with official user-processes. For BcatSaveData, this is the hard-coded [[Title_list|titleID]] of the bcat-sysmodule.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x4&lt;br /&gt;
| Written using an input param for official user-processes. Hard-coded 0 for BcatSaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 0x1&lt;br /&gt;
| Official user-processes only uses 0 here for SystemSaveData, 1 for SaveData/DeviceSaveData/BcatSaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x25&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0 for SystemSaveData/SaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26&lt;br /&gt;
| 0x1A&lt;br /&gt;
| Not initialized for SystemSaveData/SaveData.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Total size is 0x40-bytes.&lt;br /&gt;
&lt;br /&gt;
=DeviceSaveData=&lt;br /&gt;
This is accessed using the same commands for SaveData with the same input u8, the only difference compared to SaveData is the Save-struct.&lt;br /&gt;
&lt;br /&gt;
=BcatSaveData=&lt;br /&gt;
This is accessed using the same commands for SaveData with the same input u8. The Save-struct is the same as DeviceSaveData, except that the titleID field is set to &amp;lt;input titleID&amp;gt;. See above regarding SaveCreate-struct.&lt;br /&gt;
&lt;br /&gt;
The 0x10-byte struct passed to [[#CreateSaveData]] has the first 0x5-bytes set to all-zero.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Filesystem_services&amp;diff=3416</id>
		<title>Filesystem services</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Filesystem_services&amp;diff=3416"/>
		<updated>2018-01-14T01:58:05Z</updated>

		<summary type="html">&lt;p&gt;OgniK: Added cmd#0 for ISaveDataInfoReader&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= fsp-ldr =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name || Arguments || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || MountCode || u64 TitleId + X descriptor [[#ContentPath]] || Returns an [[#IFileSystem]].&lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsCodeMounted || u64 ProcessId || Returns a bool (1 if code is mounted).&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [4.0.0+] Initialize || PID descriptor ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= fsp-pr =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#SetFsPermissions]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#ClearFsPermissions]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [4.0.0+] Initialize ||&lt;br /&gt;
|-&lt;br /&gt;
| 256 || [[#SetEnabledProgramVerification]] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SetFsPermissions ==&lt;br /&gt;
Takes a storageID, a pid, a titleID, a 0x1C type-A buffer for the [[NPDM#FS_Access_Header| FS Access Header]], and a 0x2C type-A buffer for the [[NPDM#FS_Access_Control| FS Access Control]]&lt;br /&gt;
&lt;br /&gt;
Final FS permissions are stored as (ACI0_perms &amp;amp; ACID_perms). Will panic(svcBreak) when buffer sizes from ipc-rawdata are invalid.&lt;br /&gt;
&lt;br /&gt;
== ClearFsPermissions ==&lt;br /&gt;
Takes a pid. Removes registered FS permissions for that PID.&lt;br /&gt;
&lt;br /&gt;
== SetEnabledProgramVerification ==&lt;br /&gt;
Seems to sets a global flag to inputval &amp;amp; 1.&lt;br /&gt;
&lt;br /&gt;
When the flag is zero, it will set ret=0 instead of ret={error} when verifying a RSA signature fails. This RSA signature seems to be the signature in the [[NPDM]] ACID. It then skips verifying what seems to be the second signature in the [[NCA_Format|NCA header]]. Note that if verifying the NPDM(?) signature is successful, and verifying that second signature fails, it will throw an error and abort.&lt;br /&gt;
&lt;br /&gt;
= fsp-srv =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [1.0.0] [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#Initialize]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || OpenDataFileSystemByCurrentProcess&lt;br /&gt;
|-&lt;br /&gt;
| 7 || [2.0.0+] [[#MountContent7]]&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [2.0.0+] [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || [3.0.0+] OpenDataFileSystemByApplicationId&lt;br /&gt;
|-&lt;br /&gt;
| 11 || [[#MountBis]]&lt;br /&gt;
|-&lt;br /&gt;
| 12 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 13 || InvalidateBisCache&lt;br /&gt;
|-&lt;br /&gt;
| 17 || OpenHostFileSystemImpl&lt;br /&gt;
|-&lt;br /&gt;
| 18 || MountSdCard&lt;br /&gt;
|-&lt;br /&gt;
| 19 || [2.0.0+] FormatSdCard&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#DeleteSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || [[#CreateSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#CreateSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || RegisterSaveDataAtomicDeletion&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [2.0.0+] DeleteSaveDataWithSpaceId&lt;br /&gt;
|-&lt;br /&gt;
| 26 || [2.0.0+] FormatSdCardDryRun&lt;br /&gt;
|-&lt;br /&gt;
| 27 || [2.0.0+] IsExFatSupported&lt;br /&gt;
|-&lt;br /&gt;
| 28 || [4.0.0+] DeleteSystemSaveData&lt;br /&gt;
|-&lt;br /&gt;
| 30 || [[#OpenGameCardPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 31 || [[#MountGameCardPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 32 || [3.0.0+] ExtendSaveData&lt;br /&gt;
|-&lt;br /&gt;
| 51 || [[#MountSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 52 || [[#MountSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 53 || [2.0.0+] MountSaveDataReadOnly&lt;br /&gt;
|-&lt;br /&gt;
| 57 || [3.0.0+] ReadSaveDataFileSystemExtraDataWithSpaceId&lt;br /&gt;
|-&lt;br /&gt;
| 58 || ReadSaveDataFileSystemExtraData&lt;br /&gt;
|-&lt;br /&gt;
| 59 || [2.0.0+] WriteSaveDataFileSystemExtraData&lt;br /&gt;
|-&lt;br /&gt;
| 60 || OpenSaveDataInfoReader&lt;br /&gt;
|-&lt;br /&gt;
| 61 || OpenSaveDataIterator&lt;br /&gt;
|-&lt;br /&gt;
| 80 || OpenSaveDataThumbnailFile&lt;br /&gt;
|-&lt;br /&gt;
| 81 || [4.0.0+] OpenSaveDataTransferManager&lt;br /&gt;
|-&lt;br /&gt;
| 100 || MountImageDirectory&lt;br /&gt;
|-&lt;br /&gt;
| 110 || [[#MountContentStorage]]&lt;br /&gt;
|-&lt;br /&gt;
| 200 || OpenDataStorageByCurrentProcess&lt;br /&gt;
|-&lt;br /&gt;
| 201 || [3.0.0+] OpenDataStorageByApplicationId&lt;br /&gt;
|-&lt;br /&gt;
| 202 || [[#OpenDataStorageByDataId]]&lt;br /&gt;
|-&lt;br /&gt;
| 203 || Returns an [[#IStorage]]&lt;br /&gt;
|-&lt;br /&gt;
| 400 || [[#OpenDeviceOperator]]&lt;br /&gt;
|-&lt;br /&gt;
| 500 || [[#OpenSdCardDetectionEventNotifier]]&lt;br /&gt;
|-&lt;br /&gt;
| 501 || [[#OpenGameCardDetectionEventNotifier]]&lt;br /&gt;
|-&lt;br /&gt;
| 600 || [1.0.0-3.0.2] SetCurrentPosixTime&lt;br /&gt;
|-&lt;br /&gt;
| 601 || QuerySaveDataTotalSize&lt;br /&gt;
|-&lt;br /&gt;
| 602 || [[#VerifySaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 603 || CorruptSaveDataForDebug&lt;br /&gt;
|-&lt;br /&gt;
| 604 || CreatePaddingFile&lt;br /&gt;
|-&lt;br /&gt;
| 605 || DeleteAllPaddingFiles&lt;br /&gt;
|-&lt;br /&gt;
| 606 || [2.0.0+] GetRightsId&lt;br /&gt;
|-&lt;br /&gt;
| 607 || [2.0.0+] RegisterExternalKey&lt;br /&gt;
|-&lt;br /&gt;
| 608 || [2.0.0+] UnregisterExternalKey&lt;br /&gt;
|-&lt;br /&gt;
| 609 || [2.0.0+] GetRightsIdByPath&lt;br /&gt;
|-&lt;br /&gt;
| 610 || [3.0.0+] GetRightsIdByPath2 (returns extra byte)&lt;br /&gt;
|-&lt;br /&gt;
| 611 || [4.0.0+] SetCurrentPosixTime&lt;br /&gt;
|-&lt;br /&gt;
| 612 || [4.0.0+] GetFreeSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| 613 || [4.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 614 || [4.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 620 || [2.0.0+] [[#SetSdCardEncryptionSeed]]&lt;br /&gt;
|-&lt;br /&gt;
| 630 || [4.0.0+] SetSdCardAccessibility&lt;br /&gt;
|-&lt;br /&gt;
| 631 || [4.0.0+] IsSdCardAccessible&lt;br /&gt;
|-&lt;br /&gt;
| 640 || [4.0.0+] IsSignedSystemPartitionOnSdCardValid&lt;br /&gt;
|-&lt;br /&gt;
| 800 || [2.0.0+] GetAndClearFileSystemProxyErrorInfo&lt;br /&gt;
|-&lt;br /&gt;
| 1000 || SetBisRootForHost&lt;br /&gt;
|-&lt;br /&gt;
| 1001 || SetSaveDataSize&lt;br /&gt;
|-&lt;br /&gt;
| 1002 || SetSaveDataRootPath&lt;br /&gt;
|-&lt;br /&gt;
| 1003 || DisableAutoSaveDataCreation&lt;br /&gt;
|-&lt;br /&gt;
| 1004 || [[#SetGlobalAccessLogMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 1005 || [[#GetGlobalAccessLogMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 1006 || [[#OutputAccessLogToSdCard]]&lt;br /&gt;
|-&lt;br /&gt;
| 1007 || [4.0.0+] RegisterUpdatePartition&lt;br /&gt;
|-&lt;br /&gt;
| 1008 || [4.0.0+] MountRegisteredUpdatePartition&lt;br /&gt;
|-&lt;br /&gt;
| 1009 || [4.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 1100 || [4.0.0+] OverrideSaveDataTransferTokenSignVerificationKey&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Permissions ==&lt;br /&gt;
Every time permissions are checked, the process registration [[#fsp-pr]] is loaded using the session processID. The permission data is populated with data from the [[NPDM]],&lt;br /&gt;
&lt;br /&gt;
If the processID is &amp;lt;= 6 (which happens only for built-in sysmodules), it will use a hardcoded registration data. The default mask in this case is 0x8000000000000000.&lt;br /&gt;
&lt;br /&gt;
Note that the functions check whether or not at least one bit is set in the mask. This means that, you don&#039;t need to set 0xFFFFFFFFFFFFFFFF to get all permissions: it suffices to set 0x8000000000000000.&lt;br /&gt;
&lt;br /&gt;
If the code were to request an invalid input type, panic. But this never happens.&lt;br /&gt;
&lt;br /&gt;
=== RwPermissions ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type(s) || Mask || Name || Value || Used by&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x8000000000000801 || MountContentType2 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || 0x8000000000000801 || MountContentType5 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || 0x8000000000000801 || MountContentType3 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x3 || 0x8000000000000801 || MountContentType4 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || 0x8000000000000801 || MountContentType6 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x5 || 0x8000000000000801 || MountContentType7 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x6 || 0x8000000000000000 || || 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x7 || 0x8000000000000800 || ContentStorageAccess || 3 || [[#MountContentStorage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || 0x8000000000001000 || ImageDirectoryAccess || 3 || [[#MountImageDirectory]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x9 || 0x8000000000000084 || MountBisType28 || 3 || [[#MountBis]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xA || 0x8000000000000080 || MountBisType29 || 3 || [[#MountBis]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xB || 0x8000000000008080 || MountBisType30 || 3 || [[#MountBis]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xC || 0x8000000000008080 || MountBisType31 || 3 || [[#MountBis]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xD || 0x8000000000000080 || || 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xE || 0xC000000000200000 || SdCardAccess || 3 || [[#MountSdCard]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xF || 0x8000000000000010 || GameCardUser || 3 || [[#MountGameCardPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 0x8000000000040020 || SaveDataAccess0 || 3 || [[#MountSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || 0x8000000000000028 || SystemSaveDataAccess0 || 3 || [[#MountSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || 0x8000000000000020 || SaveDataAccess1 || 3 || [[#MountSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || 0x8000000000000020 || SystemSaveDataAccess1 || 3 || [[#MountSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 0x8000000000010082 || BisPartition0 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || 0x8000000000010080 || BisPartition10 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || 0x8000000000010080 || BisPartition20 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 0x8000000000010080 || BisPartition21 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || 0x8000000000010080 || BisPartition22 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || 0x8000000000010080 || BisPartition23 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || 0x8000000000010080 || BisPartition24 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 0x8000000000010080 || BisPartition25 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || 0x8000000000000080 || BisPartition26 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || 0x8000000000000084 || BisPartition27 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || 0x8000000000000084 || BisPartition28 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || 0x8000000000000080 || BisPartition29 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x8000000000000080 || BisPartition30 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || 0x8000000000000080 || BisPartition31 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || 0x8000000000000080 || BisPartition32 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || 0xC000000000200000 || || 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x8000000000000100 || GameCard_System || 3 || [[#OpenGameCardPartition]],  [[#EraseGameCard]] (bit1), [[#WriteToGameCard]] (bit1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || 0x8000000000100008 || MountContent_System || 1 || [[#MountContent]], [[#OpenDataStorageByDataId]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || 0xC000000000400000 || HostAccess || 3 || [[#OpenHostFileSystemImpl]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== BoolPermissions ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type(s) || Mask || Name || Used by&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x8000000000000080 || BisCache || [[#InvalidateBisCache]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || 0x8000000000000080 || EraseMmc || [[#EraseMmc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || 0x8000000000000010 || GameCardCertificate || [[#GetGameCardDeviceCertificate]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x3 || 0x8000000000000010 || GameCardIdSet || [[#GetGameCardIdSet]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || 0x8000000000000200 || GameCardDriver || [[#FinalizeGameCardDriver]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x5 || 0x8000000000000200 || GameCardAsic || [[#GetGameCardAsicInfo]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x6 || 0x8000000000002020 || SaveDataCreate || [[#CreateSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7 || 0x8000000000000060 || SaveDataDelete0 || [[#DeleteSaveData]], [[#RegisterSaveDataAtomicDeletion]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || 0x8000000000000028 || SystemSaveDataCreate0 || [[#CreateSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x9 || 0x8000000000000020 || SystemSaveDataCreate1 || [[#CreateSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xA || 0x8000000000004028 || SaveDataDelete1 || [[#DeleteSaveData]], [[#RegisterSaveDataAtomicDeletion]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xB || 0x8000000000000060 || SaveDataIterators0 || [[#OpenSaveDataIterator]], [[#OpenSaveDataInfoIterator]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xC || 0x8000000000004020 || SaveDataIterators1 || [[#OpenSaveDataIterator]], [[#OpenSaveDataInfoIterator]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xD || 0x8000000000020000 || SaveThumbnails || [[#OpenSaveDataThumbnailFile]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xE || 0x8000000000000400 || PosixTime || [[#SetCurrentPosixTime]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xF || 0x8000000000004060 || SaveDataExtraData || [[#ReadSaveDataFileSystemExtraData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 0x8000000000080000 || GlobalMode || [[#SetGlobalAccessMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || 0x8000000000080000 || SpeedEmulation || [[#SetSpeedEmulationMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || Invalid || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || 0xC000000000800000 || PaddingFiles || [[#CreatePaddingFile]], [[#DeletePaddingFiles]] &lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 0xC000000001000000 || SaveData_Debug || [[#CorruptSaveDataForDebug]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || 0xC000000002000000 || SaveData_SystemManagement || [[#CreateSaveData]], [[#MountSaveData]], [[#SetSaveDataRootPath]]&lt;br /&gt;
|-&lt;br /&gt;
| [2.0.0+] 0x16 || 0x8000000004000000 || || &lt;br /&gt;
|-&lt;br /&gt;
| [2.0.0+] 0x17 || 0x8000000008000000 || || &lt;br /&gt;
|-&lt;br /&gt;
| [2.0.0+] 0x18 || 0x8000000010000000 || || &lt;br /&gt;
|-&lt;br /&gt;
| [2.0.0+] 0x19 || 0x8000000000000800 || || &lt;br /&gt;
|-&lt;br /&gt;
| [2.0.0+] 0x1A || 0x8000000000004020 || || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Initialize ==&lt;br /&gt;
Takes a pid-descriptor.&lt;br /&gt;
&lt;br /&gt;
== MountContent7 ==&lt;br /&gt;
Takes an input u32 (same as [[#MountContent]]) and an u64 title-id. Web-applet loads the u32 from u32_table[inparam]. The in32 must be 4.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
Note: web-applet strings refer to both this cmd and the below &amp;quot;MountContent&amp;quot; as &amp;quot;MountContent&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== MountContent ==&lt;br /&gt;
Takes a type-0x19 input buffer, an in32, and an input title-id.&lt;br /&gt;
&lt;br /&gt;
The in32 must be 5 if the NCA type is 0 (control).&lt;br /&gt;
&lt;br /&gt;
The in32 must be 2..7.&lt;br /&gt;
&lt;br /&gt;
The input buffer is the output string path from nsam [[NS_Services#GetContentNcaPath|GetContentNcaPath]].&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
May return errors when attempting to access NCA-paths for an update-title with a gamecard, when the gamecard isn&#039;t inserted. May return error 0x7D402 in some cases with update-titles. Non-val2 in32 values with NCA-type1 are unusable, even for normal titles.&lt;br /&gt;
&lt;br /&gt;
The official &amp;quot;MountApplicationPackage&amp;quot; func uses this with in64=0 and in32=7.&lt;br /&gt;
&lt;br /&gt;
After the in32-specific permissions are checked, it then gets the func retval for permissions-type 0x25 and func0.&lt;br /&gt;
&lt;br /&gt;
When in32=5, it uses in64=0xffffffffffffffff internally, otherwise it checks if in64 is set to 0xffffffffffffffff then throws an error if so. When the in64 used internally is not 0xffffffffffffffff, it&#039;s compared with the NCA titleID, then an error is thrown on mismatch.&lt;br /&gt;
&lt;br /&gt;
== MountBis ==&lt;br /&gt;
Takes a type-0x19 input buffer string and a u32 Bis partitionID(see below). Official user-process code sets instr[0] = 0 normally.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
Only partitionIDs for FAT partitions are usable with this, otherwise error 0x2EE202 is returned. Seems to be about the same as [[#OpenBisPartition]] except this mounts the partition filesystem instead of allowing direct access to the partition sectors.&lt;br /&gt;
&lt;br /&gt;
== OpenBisPartition ==&lt;br /&gt;
Takes a u32 partition ID, returns 0x2EE202 for partitions which do not exist, 0x320002 for partitions which cannot be opened and a valid [[#IStorage]] handle otherwise.&lt;br /&gt;
&lt;br /&gt;
== InvalidateBisCache ==&lt;br /&gt;
Seems to invalidate the Bis cache for MBR/GPT after overwriting that data via the OpenBisPartition IStorage. Used by [[SystemInitializer]].&lt;br /&gt;
&lt;br /&gt;
== DeleteSaveData ==&lt;br /&gt;
Takes an input u64.&lt;br /&gt;
&lt;br /&gt;
== CreateSaveData ==&lt;br /&gt;
Takes a 0x40-byte Save-struct entry, a 0x40-byte SaveCreate-struct entry, and a 0x10-byte input struct.&lt;br /&gt;
&lt;br /&gt;
Only the first 0x5-bytes in the 0x10-byte struct are initialized: all-zero when automatically creating savedata during savecommon mount by official user-processes. In the dedicated save-creation code in official user-processes: +0 u32 = 0x40060, +4 u8 = 1.&lt;br /&gt;
&lt;br /&gt;
Creates regular savedata.&lt;br /&gt;
&lt;br /&gt;
== CreateSystemSaveData ==&lt;br /&gt;
Takes a 0x40-byte Save-struct entry and a 0x40-byte SaveCreate-struct entry.&lt;br /&gt;
&lt;br /&gt;
Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.&lt;br /&gt;
&lt;br /&gt;
== OpenGameCardPartition ==&lt;br /&gt;
&lt;br /&gt;
Takes an input u32 (partition ID), and returns an [[#IStorage]] for the [[Gamecard_Format|partition]].&lt;br /&gt;
&lt;br /&gt;
== MountGameCardPartition ==&lt;br /&gt;
Takes two input u32s, with the second u32 located at +4 in rawdata after the first u32.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
Mounts a gamecard [[Gamecard_Partition|partition]].&lt;br /&gt;
&lt;br /&gt;
== MountSaveData ==&lt;br /&gt;
Takes an input u8 and a 0x40-byte Save-struct entry. Official user-process code is only known to use value 1 for the u8.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
Permissions aren&#039;t checked until the specified save is successfully found.&lt;br /&gt;
&lt;br /&gt;
Only one process can mount a given savedata at any given time (this includes systemsavedata).&lt;br /&gt;
&lt;br /&gt;
== MountSystemSaveData ==&lt;br /&gt;
Takes an input u8 and a 0x40-byte Save-struct entry. Web-applet only uses value0 for the input u8.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
Mounts savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.&lt;br /&gt;
&lt;br /&gt;
== MountContentStorage ==&lt;br /&gt;
Takes a [[#ContentStorageId]]. Invalid values return 0x2EE202.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]] with NCA files. The read data from these files is identical to the data read by [[Content_Manager_services#ReadEntryRaw]].&lt;br /&gt;
&lt;br /&gt;
== OpenDataStorageByDataId ==&lt;br /&gt;
Takes a [[#StorageId]] and a TitleID.&lt;br /&gt;
&lt;br /&gt;
Returns a [[IPC_Marshalling#Domain_message|domain object ID]] implementing the [[#IStorage]] interface for data archives.&lt;br /&gt;
&lt;br /&gt;
== OpenDeviceOperator ==&lt;br /&gt;
This command returns a session to a port implementing the [[#IDeviceOperator]] interface.&lt;br /&gt;
&lt;br /&gt;
== OpenSdCardDetectionEventNotifier ==&lt;br /&gt;
This command returns a session to a port implementing the [[#IEventNotifier]] interface.&lt;br /&gt;
&lt;br /&gt;
== OpenGameCardDetectionEventNotifier ==&lt;br /&gt;
This command returns a session to a port implementing the [[#IEventNotifier]] interface.&lt;br /&gt;
&lt;br /&gt;
== VerifySaveData ==&lt;br /&gt;
Takes an unknown input u64 and a type-0x6 output buffer.&lt;br /&gt;
&lt;br /&gt;
The input u64 high-byte must be non-zero, otherwise an [[Error_codes|error]] is returned(0xE02).&lt;br /&gt;
&lt;br /&gt;
== SetSdCardEncryptionSeed ==&lt;br /&gt;
Takes 0x10-bytes of input.&lt;br /&gt;
&lt;br /&gt;
Appears to be used to load the seed into FS-module state, since FS-module itself doesn&#039;t seem to have file-reading code to handle this itself.&lt;br /&gt;
&lt;br /&gt;
[[NS_Services|NS]]-module uses this with data read from a file.&lt;br /&gt;
&lt;br /&gt;
== SetGlobalAccessLogMode ==&lt;br /&gt;
Takes an input u32.&lt;br /&gt;
&lt;br /&gt;
== GetGlobalAccessLogMode ==&lt;br /&gt;
Returns an output u32.&lt;br /&gt;
&lt;br /&gt;
GlobalAccessLogMode is normally 0.&lt;br /&gt;
&lt;br /&gt;
== OutputAccessLogToSdCard ==&lt;br /&gt;
Takes a type-0x5 input buffer.&lt;br /&gt;
&lt;br /&gt;
The input buffer is the string to output to the log. User-processes normally include a newline at the end.&lt;br /&gt;
&lt;br /&gt;
User-processes only use this when the value previously loaded from [[#GetGlobalAccessLogMode]] has bit1 set.&lt;br /&gt;
&lt;br /&gt;
When bit1 in GlobalAccessLogMode is clear, FS-module will just return 0 for OutputAccessLogToSdCard. However even with that set the log doesn&#039;t show up SD, unknown why.&lt;br /&gt;
&lt;br /&gt;
The input buffer is written to the &amp;quot;$FsAccessLog:/FsAccessLog.txt&amp;quot; file, where &amp;quot;$FsAccessLog&amp;quot; is the SD-card mount-name. It&#039;s written to the current end of the file(appended).&lt;br /&gt;
&lt;br /&gt;
= IStorage =&lt;br /&gt;
This is the interface for a raw device, usually a block device.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name || Arguments&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Read || Takes a type-0x46 buffer, an offset and length &lt;br /&gt;
|-&lt;br /&gt;
| 1 || Write || Takes a type-0x45 buffer, an offset and length &lt;br /&gt;
|-&lt;br /&gt;
| 2 || Flush || None&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SetSize || Takes a size&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GetSize || None&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [4.0.0+] OperateRange ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= IFileSystem =&lt;br /&gt;
There are two main implementations of this interface:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RomFS&#039;&#039;&#039;: Filesystem implementation statically linked in the binary. Uses an [[#IStorage]] interface as underlying raw device.&lt;br /&gt;
* &#039;&#039;&#039;IPC proxy&#039;&#039;&#039;: Used for all non-RomFS filesystems. In this case, actual filesystem implementation is in the FS process.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CreateFile&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeleteFile&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CreateDirectory&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeleteDirectory&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeleteDirectoryRecursively&lt;br /&gt;
|-&lt;br /&gt;
| 5 || RenameFile&lt;br /&gt;
|-&lt;br /&gt;
| 6 || RenameDirectory&lt;br /&gt;
|-&lt;br /&gt;
| 7 || [[#GetEntryType]]&lt;br /&gt;
|-&lt;br /&gt;
| 8 || OpenFile&lt;br /&gt;
|-&lt;br /&gt;
| 9 || [[#OpenDirectory]]&lt;br /&gt;
|-&lt;br /&gt;
| 10 || [[#Commit]]&lt;br /&gt;
|-&lt;br /&gt;
| 11 || [[#GetFreeSpaceSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 12 || [[#GetTotalSpaceSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 13 || CleanDirectoryRecursively [3.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GetFileTimeStampRaw [3.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [4.0.0+] QueryEntry&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GetEntryType ==&lt;br /&gt;
Takes a type-0x9 input buffer for the path and returns [[#DirectoryEntryType]] as an output u32.&lt;br /&gt;
&lt;br /&gt;
==OpenDirectory==&lt;br /&gt;
Takes a type-0x9 input buffer for the path and an u64 &#039;&#039;&#039;filter_flags&#039;&#039;&#039;. &#039;&#039;&#039;filter_flags&#039;&#039;&#039; controls what type of entries are read by the [[#IDirectory]]: bitmask 0x1 = directories, bitmask 0x2 = files.&lt;br /&gt;
&lt;br /&gt;
== Commit ==&lt;br /&gt;
Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect.&lt;br /&gt;
&lt;br /&gt;
== GetFreeSpaceSize ==&lt;br /&gt;
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total free space with this FS.&lt;br /&gt;
&lt;br /&gt;
== GetTotalSpaceSize ==&lt;br /&gt;
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total space available with this FS(free+used).&lt;br /&gt;
&lt;br /&gt;
= IDirectory =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#Read]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#GetEntryCount]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
Takes a type-0x6 output buffer and an input u64. Unknown what the u64 is for, doesn&#039;t(?) seem to affect output. Returns an output u64(?) for the total number of read entries, this is 0 when no more entries are available.&lt;br /&gt;
&lt;br /&gt;
The output buffer contains the read array of [[#DirectoryEntry]]. This doesn&#039;t include entries for &amp;quot;.&amp;quot; and &amp;quot;..&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== GetEntryCount ==&lt;br /&gt;
Returns an u64 for the total number of readable entries.&lt;br /&gt;
&lt;br /&gt;
= DirectoryEntry =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Size || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x300 || Path&lt;br /&gt;
|-&lt;br /&gt;
| 0x300 || 0x4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x304 || 0x1 || [[#DirectoryEntryType]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x305 || 0x3 || Padding?&lt;br /&gt;
|-&lt;br /&gt;
| 0x308 || 0x8? || Filesize, 0 for directories.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= DirectoryEntryType =&lt;br /&gt;
s8 type: 0 = directory, 1 = file.&lt;br /&gt;
&lt;br /&gt;
= IFile =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Read&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Write&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Flush&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GetSize&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [4.0.0+]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ISaveDataInfoReader =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= IDeviceOperator =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsSdCardInserted&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GetSdCardSpeedMode&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [2.0.0+] GetSdCardCid&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] GetSdCardUserAreaSize&lt;br /&gt;
|-&lt;br /&gt;
| 4 || [2.0.0+] GetSdCardProtectedAreaSize&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [2.0.0+] GetAndClearSdCardErrorInfo&lt;br /&gt;
|-&lt;br /&gt;
| 6 || [2.0.0-&amp;gt;3.0.0]&lt;br /&gt;
|-&lt;br /&gt;
| 100 || GetMmcCid&lt;br /&gt;
|-&lt;br /&gt;
| 101 || GetMmcSpeedMode&lt;br /&gt;
|-&lt;br /&gt;
| 110 || EraseMmc&lt;br /&gt;
|-&lt;br /&gt;
| 111 || GetMmcPartitionSize&lt;br /&gt;
|-&lt;br /&gt;
| 112 || [2.0.0+] GetMmcPatrolCount&lt;br /&gt;
|-&lt;br /&gt;
| 113 || [2.0.0+] GetAndClearMmcErrorInfo&lt;br /&gt;
|-&lt;br /&gt;
| 114 || [2.0.0+] GetMmcExtendedCsd&lt;br /&gt;
|-&lt;br /&gt;
| 115 || [4.0.0+] SuspendMmcPatrol&lt;br /&gt;
|-&lt;br /&gt;
| 116 || [4.0.0+] ResumeMmcPatrol&lt;br /&gt;
|-&lt;br /&gt;
| 200 || IsGameCardInserted&lt;br /&gt;
|-&lt;br /&gt;
| 201 || EraseGameCard&lt;br /&gt;
|-&lt;br /&gt;
| 202 || GetGameCardHandle&lt;br /&gt;
|-&lt;br /&gt;
| 203 || [[#GetGameCardUpdatePartitionInfo]]&lt;br /&gt;
|-&lt;br /&gt;
| 204 || FinalizeGameCardDriver&lt;br /&gt;
|-&lt;br /&gt;
| 205 || GetGameCardAttribute&lt;br /&gt;
|-&lt;br /&gt;
| 206 || GetGameCardDeviceCertificate&lt;br /&gt;
|-&lt;br /&gt;
| 207 || GetGameCardAsicInfo&lt;br /&gt;
|-&lt;br /&gt;
| 208 || GetGameCardIdSet&lt;br /&gt;
|-&lt;br /&gt;
| 209 || WriteToGameCard&lt;br /&gt;
|-&lt;br /&gt;
| 210 || SetVerifyWriteEnalbleFlag&lt;br /&gt;
|-&lt;br /&gt;
| 211 || GetGameCardImageHash&lt;br /&gt;
|-&lt;br /&gt;
| 212 || [2.0.0+] GetGameCardErrorInfo&lt;br /&gt;
|-&lt;br /&gt;
| 213 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 214 || [2.0.0+] GetGameCardCid&lt;br /&gt;
|-&lt;br /&gt;
| 215 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 216 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 217 || [2.1.0+] Returns 0x40-bytes of output data.&lt;br /&gt;
|-&lt;br /&gt;
| 218 || [3.0.1+]&lt;br /&gt;
|-&lt;br /&gt;
| 300 || SetSpeedEmulationMode&lt;br /&gt;
|-&lt;br /&gt;
| 301 || GetSpeedEmulationMode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GetGameCardUpdatePartitionInfo ==&lt;br /&gt;
&lt;br /&gt;
Returns a titleID and the title-version for it.&lt;br /&gt;
&lt;br /&gt;
* Output u32 with ARMS-gamecard: title-version v131162. This is the title-version for [[2.1.0]], which is the sysupdate included with this gamecard. Launch-day gamecards return title-version v450.&lt;br /&gt;
* Output u64 with ARMS-gamecard: titleID 0100000000000816.&lt;br /&gt;
&lt;br /&gt;
[[NS_Services|NS]] appears to only use this with [[Content_Manager_services#GetTitleIdInfo]] and [[Content_Manager_services#GetUpdateTitleList]] with storageid=nandsys, for checking whether a sysupdate is required.&lt;br /&gt;
&lt;br /&gt;
= IEventNotifier =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || BindEvent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= StorageId =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || None&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Host&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GameCard&lt;br /&gt;
|-&lt;br /&gt;
| 3 || NandSystem&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NandUser&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SdCard&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ContentStorageId =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || NandSystem&lt;br /&gt;
|-&lt;br /&gt;
| 1 || NandUser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SdCard&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ContentPath =&lt;br /&gt;
These are the 0x300 paths to NCA files for the various filesystems FS can access, beginning with @. They&#039;re passed via X descriptors, and returned via various [[Location Resolver services|ncm/lr]] commands.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Path || Notes&lt;br /&gt;
|-&lt;br /&gt;
| @SystemContent ||&lt;br /&gt;
|- &lt;br /&gt;
| @UserContent ||&lt;br /&gt;
|-&lt;br /&gt;
| @SdCardContent ||&lt;br /&gt;
|-&lt;br /&gt;
| @CalibFile ||&lt;br /&gt;
|-&lt;br /&gt;
| @Safe ||&lt;br /&gt;
|-&lt;br /&gt;
| @User ||&lt;br /&gt;
|-&lt;br /&gt;
| @System ||&lt;br /&gt;
|-&lt;br /&gt;
| @Sdcard ||&lt;br /&gt;
|-&lt;br /&gt;
| @Host ||&lt;br /&gt;
|-&lt;br /&gt;
| @GcApp || Gamecard App partition (Partition 2)&lt;br /&gt;
|-&lt;br /&gt;
| @GcS00000001 || Gamecard Contents.&lt;br /&gt;
|-&lt;br /&gt;
| @upp || Gamecard update partition (Partition 0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=BisPartitionID=&lt;br /&gt;
* 0: Raw NAND sectors access for MMC [[Flash_Filesystem|boot]] partition 0.&lt;br /&gt;
* 10: Raw NAND sectors access for MMC [[Flash_Filesystem|boot]] partition 1.&lt;br /&gt;
* Rest: see [[Flash_Filesystem|here]].&lt;br /&gt;
&lt;br /&gt;
=Save Struct=&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0 for SystemSaveData. SaveData: 0 can be used for accessing the savedata associated with the current FS session titleID, otherwise when set this is the titleID associated with the savedata to access.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x10&lt;br /&gt;
| userID for user-specific savedata(saveuser) when set, otherwise when zero this indicates the common savedata(savecommon). This is loaded from [[Account_services]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x8&lt;br /&gt;
| u64 [[Flash_Filesystem|saveID]]. 0 for SaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x8&lt;br /&gt;
| ContentStorageId? 0 for SystemSaveData. 1 for SaveData. 2 for DeviceSaveData(with official user-processes all other fields are 0 for DeviceSaveData).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0 for SystemSaveData/SaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0 for SystemSaveData/SaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0 for SystemSaveData/SaveData.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Total size is 0x40-bytes.&lt;br /&gt;
&lt;br /&gt;
=SaveCreate Struct=&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x8&lt;br /&gt;
| [[Savegames|IVFC]] level4 size?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| Same as offset 0x0 normally? Hard-coded to 0x80000 for BcatSaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x4000 for SystemSaveData/SaveData/DeviceSaveData/BcatSaveData. [[Savegames|IVFC]] level4 block-size in bytes?&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x8&lt;br /&gt;
| Official user-processes only uses 0 here for SystemSaveData/SaveData. For the dedicated save-creation code with SaveData/DeviceSaveData, this value comes from an input param with official user-processes. For BcatSaveData, this is the hard-coded [[Title_list|titleID]] of the bcat-sysmodule.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x4&lt;br /&gt;
| Written using an input param for official user-processes. Hard-coded 0 for BcatSaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 0x1&lt;br /&gt;
| Official user-processes only uses 0 here for SystemSaveData, 1 for SaveData/DeviceSaveData/BcatSaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x25&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0 for SystemSaveData/SaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26&lt;br /&gt;
| 0x1A&lt;br /&gt;
| Not initialized for SystemSaveData/SaveData.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Total size is 0x40-bytes.&lt;br /&gt;
&lt;br /&gt;
=DeviceSaveData=&lt;br /&gt;
This is accessed using the same commands for SaveData with the same input u8, the only difference compared to SaveData is the Save-struct.&lt;br /&gt;
&lt;br /&gt;
=BcatSaveData=&lt;br /&gt;
This is accessed using the same commands for SaveData with the same input u8. The Save-struct is the same as DeviceSaveData, except that the titleID field is set to &amp;lt;input titleID&amp;gt;. See above regarding SaveCreate-struct.&lt;br /&gt;
&lt;br /&gt;
The 0x10-byte struct passed to [[#CreateSaveData]] has the first 0x5-bytes set to all-zero.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=3415</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=3415"/>
		<updated>2018-01-14T01:52:58Z</updated>

		<summary type="html">&lt;p&gt;OgniK: Made &amp;quot;arg&amp;quot; more clear for svcCreateThread&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 || W0=result&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=out, X2=out&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2 || 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 || 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 || 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;
|-&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=event_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 || W0=thread_handle || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || svcBreak || X0,X1,X2=info || ?&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]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&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;
|- style=&amp;quot;border-top: double&amp;quot;&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 || W0=thread_handle, W1=[[#ThreadContext]]* || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] || X0=ptr, W1=type, X2=? X3=timeout ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] || X0=ptr, W1=type, X2=? W3=? ||&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=client_handle ?, W2=server_handle ?&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateJitMemory]] || X1=addr, X2=size || W0=result, W1=jit_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcMapJitMemory]] || W0=jit_handle, W1=[[#MapJitOperation]], 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 || W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id || 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, W1=[[#ThreadContextFlags]], X2=ThreadContext* || 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, 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;
| 0x70 || svcCreatePort || W2=max_sessions, W3=unk_bool, X4=name_ptr || W0=result, W1=clientport_handle, W2=serverport_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=srcaddr, W1=process_handle, X2=dstaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || W0=process_handle, X1=dstaddr, 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, X2=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 || 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 0x2000000.&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;
[2.0.0+] Size must be less than 0x18000000.&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;
If dstaddr &amp;gt;= LowerTreshold, the dst-range is enforced to be within the process&#039; &amp;quot;MapRegion&amp;quot;. Code can get the range of this region from [[#svcGetInfo]] id0=2,3.&lt;br /&gt;
&lt;br /&gt;
In this case, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
As long as (dstaddr+size) &amp;lt; LowerThreshold, then you can map anywhere but the mapped memory will have state 0x482907 instead.&lt;br /&gt;
&lt;br /&gt;
LowerTreshold is 0x80000000 for 36-bit address spaces, and 0x40000000 for 32-bit ones.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Support for the 0x482907 mappings outside the &amp;quot;MapRegion&amp;quot; were removed.&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;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Nano&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&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 nano=0 means &amp;quot;yield thread&amp;quot;.&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;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || 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 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || 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;
! 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 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&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;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40, error on num_handles == 0.&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;Port:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Session (server-side):&#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;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signalled before the timeout expired. Handle index is updated to indicate which object signalled.&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;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signalled within the timeout. Handle index is not updated.&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 must be 0x1000-aligned.&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 ||&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) ? || ? || ?&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When used on retail where inx0 bit31 is clear, the system will throw a [[Error_codes|fatal-error]]. Otherwise when bit31 is set, it will 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) 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;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || MapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || MapRegionSize&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 || TotalMemoryUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalHeapUsage&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} || Unknown. Output data changes each time this SVC is used. Global and core-specific tick-count?&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+] NewMapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] NewMapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] IsVirtualAddressMemoryEnabled&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] Some size in bytes.&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+] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0+] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0 || Performance counter related.&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;
== 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;
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;
== svcCreateJitMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the JIT memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcMapJitMemory ==&lt;br /&gt;
Maps the backing memory for a JIT memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#MapJitOperation|MapJitOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#MapJitOperation|MapJitOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#MapJitOperation|MapJitOperation_UnmapOwner/MapJitOperation_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 memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&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;
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;
&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;
== 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;
== 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;
== 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 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || DstAddr&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) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || 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 [[#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.&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 || u64 || 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;
&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;
== 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;
= Enum/Structures =&lt;br /&gt;
== ThreadContextRequestFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || NormalContext&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 ||&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;
== MapJitOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || MapJitOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MapJitOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || MapJitOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MapJitOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessEvent ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessEvent_Created&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessEvent_DebugAttached&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessEvent_DebugDetached&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessEvent_Crashed&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessEvent_Running&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessEvent_Exiting&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessEvent_Exited&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessEvent_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_ActualPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_CpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_CoreMask&lt;br /&gt;
|}&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;
| 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 || || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || Is64bit&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsSystem&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 ||&lt;br /&gt;
|}&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 || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed&lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcMapped: when IpcRefCount &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceMapped: 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_Type0&lt;br /&gt;
|-&lt;br /&gt;
| 11 || IpcSendAllowed_Type3&lt;br /&gt;
|-&lt;br /&gt;
| 12 || IpcSendAllowed_Type1&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+] JitMemoryAllowed&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_WeirdSharedMemory || 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_IpcBuffer0]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_MappedMemory || 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_IpcBuffer1]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_IpcBuffer3]] || 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_JitReadOnly || Mapped in kernel during [[#svcMapJitMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_JitWritable || Mapped in kernel during [[#svcMapJitMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&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;
&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 || u64 || Type (0=PausedThread, 1=RunningThread, 2=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 || u64 || 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 ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_Exit&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_UndefinedInstruction&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;
&lt;br /&gt;
UndefinedInstruction 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;
There is userland code for handling exceptions, however this doesn&#039;t seem to be executed on retail mode.&lt;br /&gt;
&lt;br /&gt;
When a usermode exception occurs, it jumps to the main code binary entrypoint (main_binary_address + 0 == &#039;&#039;&#039;_start&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
During normal boot &#039;&#039;&#039;_start&#039;&#039;&#039; is invoked with X0=0 and X1=main_thread_handle (triggering normal crt0 setup).&lt;br /&gt;
During an usermode exception &#039;&#039;&#039;_start&#039;&#039;&#039; is invoked with X0=exception_info0_ptr and X1=exception_info1_ptr instead.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;_start&#039;&#039;&#039; method determines whether to boot normally or handle an exception if X0 is set to 0 or not.&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=3414</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=3414"/>
		<updated>2018-01-14T01:50:43Z</updated>

		<summary type="html">&lt;p&gt;OgniK: Added IsVirtualAddressMemoryEnabled&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=arg, 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 || W0=result&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=out, X2=out&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2 || 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 || 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 || 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;
|-&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=event_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 || W0=thread_handle || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || svcBreak || X0,X1,X2=info || ?&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]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&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;
|- style=&amp;quot;border-top: double&amp;quot;&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 || W0=thread_handle, W1=[[#ThreadContext]]* || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] || X0=ptr, W1=type, X2=? X3=timeout ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] || X0=ptr, W1=type, X2=? W3=? ||&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=client_handle ?, W2=server_handle ?&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateJitMemory]] || X1=addr, X2=size || W0=result, W1=jit_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcMapJitMemory]] || W0=jit_handle, W1=[[#MapJitOperation]], 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 || W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id || 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, W1=[[#ThreadContextFlags]], X2=ThreadContext* || 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, 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;
| 0x70 || svcCreatePort || W2=max_sessions, W3=unk_bool, X4=name_ptr || W0=result, W1=clientport_handle, W2=serverport_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=srcaddr, W1=process_handle, X2=dstaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || W0=process_handle, X1=dstaddr, 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, X2=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 || 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 0x2000000.&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;
[2.0.0+] Size must be less than 0x18000000.&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;
If dstaddr &amp;gt;= LowerTreshold, the dst-range is enforced to be within the process&#039; &amp;quot;MapRegion&amp;quot;. Code can get the range of this region from [[#svcGetInfo]] id0=2,3.&lt;br /&gt;
&lt;br /&gt;
In this case, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
As long as (dstaddr+size) &amp;lt; LowerThreshold, then you can map anywhere but the mapped memory will have state 0x482907 instead.&lt;br /&gt;
&lt;br /&gt;
LowerTreshold is 0x80000000 for 36-bit address spaces, and 0x40000000 for 32-bit ones.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Support for the 0x482907 mappings outside the &amp;quot;MapRegion&amp;quot; were removed.&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* || Arg&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;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Nano&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&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 nano=0 means &amp;quot;yield thread&amp;quot;.&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;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || 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 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || 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;
! 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 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&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;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40, error on num_handles == 0.&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;Port:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Session (server-side):&#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;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signalled before the timeout expired. Handle index is updated to indicate which object signalled.&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;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signalled within the timeout. Handle index is not updated.&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 must be 0x1000-aligned.&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 ||&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) ? || ? || ?&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When used on retail where inx0 bit31 is clear, the system will throw a [[Error_codes|fatal-error]]. Otherwise when bit31 is set, it will 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) 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;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || MapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || MapRegionSize&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 || TotalMemoryUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalHeapUsage&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} || Unknown. Output data changes each time this SVC is used. Global and core-specific tick-count?&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+] NewMapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] NewMapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] IsVirtualAddressMemoryEnabled&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] Some size in bytes.&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+] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0+] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0 || Performance counter related.&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;
== 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;
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;
== svcCreateJitMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the JIT memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcMapJitMemory ==&lt;br /&gt;
Maps the backing memory for a JIT memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#MapJitOperation|MapJitOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#MapJitOperation|MapJitOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#MapJitOperation|MapJitOperation_UnmapOwner/MapJitOperation_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 memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&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;
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;
&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;
== 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;
== 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;
== 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 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || DstAddr&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) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || 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 [[#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.&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 || u64 || 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;
&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;
== 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;
= Enum/Structures =&lt;br /&gt;
== ThreadContextRequestFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || NormalContext&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 ||&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;
== MapJitOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || MapJitOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MapJitOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || MapJitOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MapJitOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessEvent ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessEvent_Created&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessEvent_DebugAttached&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessEvent_DebugDetached&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessEvent_Crashed&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessEvent_Running&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessEvent_Exiting&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessEvent_Exited&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessEvent_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_ActualPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_CpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_CoreMask&lt;br /&gt;
|}&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;
| 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 || || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || Is64bit&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || IsSystem&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 ||&lt;br /&gt;
|}&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 || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed&lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcMapped: when IpcRefCount &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceMapped: 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_Type0&lt;br /&gt;
|-&lt;br /&gt;
| 11 || IpcSendAllowed_Type3&lt;br /&gt;
|-&lt;br /&gt;
| 12 || IpcSendAllowed_Type1&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+] JitMemoryAllowed&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_WeirdSharedMemory || 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_IpcBuffer0]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_MappedMemory || 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_IpcBuffer1]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_IpcBuffer3]] || 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_JitReadOnly || Mapped in kernel during [[#svcMapJitMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_JitWritable || Mapped in kernel during [[#svcMapJitMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&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;
&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 || u64 || Type (0=PausedThread, 1=RunningThread, 2=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 || u64 || 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 ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_Exit&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_UndefinedInstruction&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;
&lt;br /&gt;
UndefinedInstruction 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;
There is userland code for handling exceptions, however this doesn&#039;t seem to be executed on retail mode.&lt;br /&gt;
&lt;br /&gt;
When a usermode exception occurs, it jumps to the main code binary entrypoint (main_binary_address + 0 == &#039;&#039;&#039;_start&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
During normal boot &#039;&#039;&#039;_start&#039;&#039;&#039; is invoked with X0=0 and X1=main_thread_handle (triggering normal crt0 setup).&lt;br /&gt;
During an usermode exception &#039;&#039;&#039;_start&#039;&#039;&#039; is invoked with X0=exception_info0_ptr and X1=exception_info1_ptr instead.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;_start&#039;&#039;&#039; method determines whether to boot normally or handle an exception if X0 is set to 0 or not.&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Thread_Local_Region&amp;diff=3413</id>
		<title>Thread Local Region</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Thread_Local_Region&amp;diff=3413"/>
		<updated>2018-01-14T01:43:30Z</updated>

		<summary type="html">&lt;p&gt;OgniK: Updated thread local storage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the 0x200-byte TLS (thread local storage). It&#039;s base address is loaded via ARM threadid register tpidrro_el0. TLS for multiple threads are stored in the same page, with the first TLS normally located at page+0x200, because the first TLS spot is reserved for usermode exception handling.&lt;br /&gt;
&lt;br /&gt;
= Structure =&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x100&lt;br /&gt;
| [[IPC_Marshalling|IPC]] command buffer.&lt;br /&gt;
|-&lt;br /&gt;
| 0x100&lt;br /&gt;
| 0xF8&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F8&lt;br /&gt;
| 0x8&lt;br /&gt;
| Pointer to [[Thread_Local_Storage#Thread_context|thread context]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Userland context =&lt;br /&gt;
== Boot paramter ==&lt;br /&gt;
This is &amp;quot;nn::os::detail::g_OsBootParamter&amp;quot;.&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 0x04&lt;br /&gt;
| Main thread handle.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 0x04&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 0x30&lt;br /&gt;
| Empty.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Resource manager storage ==&lt;br /&gt;
This is &amp;quot;nn::os::detail::g_OsResourceManagerStorage&amp;quot;.&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 0x04&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 0x10&lt;br /&gt;
| Process PRNG.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x04&lt;br /&gt;
| Padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x08&lt;br /&gt;
| Always set to 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x08&lt;br /&gt;
| [[SVC#svcGetInfo|AddressSpaceStart]] right shifted by 0x0C.&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x08&lt;br /&gt;
| AddressSpaceEnd ([[SVC#svcGetInfo|AddressSpaceStart]] + [[SVC#svcGetInfo|AddressSpaceSize]]) right shifted by 0x0C and aligned to AddressSpaceAlign.&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 0x08&lt;br /&gt;
| AddressSpaceAlign right shifted by 0x0C.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 0x08&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 0x08&lt;br /&gt;
| Always set to 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 0x08&lt;br /&gt;
| [[SVC#svcGetInfo|MapRegionBased]] right shifted by 0x0C.&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| 0x08&lt;br /&gt;
| MapRegionEnd ([[SVC#svcGetInfo|MapRegionBased]] + [[SVC#svcGetInfo|MapRegionSize]]) right shifted by 0x0C and aligned to MapRegionAlign.&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| 0x08&lt;br /&gt;
| MapRegionAlign right shifted by 0x0C.&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| 0x08&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| 0x08&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| 0x1D0&lt;br /&gt;
| Main [[Thread_Local_Storage#Thread_context|thread context]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x240&lt;br /&gt;
| 0x08&lt;br /&gt;
| Pointer to main [[Thread_Local_Storage#Thread_context|thread context]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x248&lt;br /&gt;
| 0x08&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x250&lt;br /&gt;
| 0x08&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x258&lt;br /&gt;
| 0x130&lt;br /&gt;
| Always empty?&lt;br /&gt;
|-&lt;br /&gt;
| 0x388&lt;br /&gt;
| 0x08&lt;br /&gt;
| Pointer to [[Thread_Local_Storage#Resource_manager_storage|resource manager storage]] + 0x388.&lt;br /&gt;
|-&lt;br /&gt;
| 0x390&lt;br /&gt;
| 0x08&lt;br /&gt;
| Pointer to [[Thread_Local_Storage#Resource_manager_storage|resource manager storage]] + 0x388.&lt;br /&gt;
|-&lt;br /&gt;
| 0x398&lt;br /&gt;
| 0x08&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A0&lt;br /&gt;
| 0x08&lt;br /&gt;
| Always 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Thread context ==&lt;br /&gt;
This structure is used for describing each thread&#039;s context. In the main thread&#039;s case, this structure comes from the [[Thread_Local_Storage#Resource_manager_storage|resource manager storage]].&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 0x08&lt;br /&gt;
| Pointer to [[Thread_Local_Storage#Thread_context|thread context]] + 0x1C8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 0x08&lt;br /&gt;
| Pointer to [[Thread_Local_Storage#Thread_context|thread context]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x08&lt;br /&gt;
| Pointer to [[Thread_Local_Storage#Thread_context|thread context]] + 0x10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x08&lt;br /&gt;
| Pointer to [[Thread_Local_Storage#Thread_context|thread context]] + 0x10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x20&lt;br /&gt;
| Empty.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 0x04&lt;br /&gt;
| Thread status.&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| 0x04&lt;br /&gt;
| Thread priority minus 0x1C.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 0x08&lt;br /&gt;
| Thread stack base address.&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| 0x08&lt;br /&gt;
| Thread stack base address mirror.&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| 0x08&lt;br /&gt;
| Thread stack size.&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| 0x08&lt;br /&gt;
| Thread stub pointer.&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| 0x08&lt;br /&gt;
| Thread ID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| 0x08&lt;br /&gt;
| Always 0?&lt;br /&gt;
|-&lt;br /&gt;
| 0x78&lt;br /&gt;
| 0x08&lt;br /&gt;
| Always 0?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x08&lt;br /&gt;
| Always 0?&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 0x100&lt;br /&gt;
| Initially empty (contains unknown pointers).&lt;br /&gt;
|-&lt;br /&gt;
| 0x188&lt;br /&gt;
| 0x20&lt;br /&gt;
| Thread name.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A8&lt;br /&gt;
| 0x08&lt;br /&gt;
| Thread name address.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B0&lt;br /&gt;
| 0x04&lt;br /&gt;
| Critical Section.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B4&lt;br /&gt;
| 0x04&lt;br /&gt;
| Conditional Variable.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B8&lt;br /&gt;
| 0x04&lt;br /&gt;
| Thread handle.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1BC&lt;br /&gt;
| 0x04&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C0&lt;br /&gt;
| 0x08&lt;br /&gt;
| Thread global mutex.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C8&lt;br /&gt;
| 0x08&lt;br /&gt;
| Unknown.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Error_codes&amp;diff=3412</id>
		<title>Error codes</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Error_codes&amp;diff=3412"/>
		<updated>2018-01-14T01:37:12Z</updated>

		<summary type="html">&lt;p&gt;OgniK: Added invalid nca key index error&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-%04x&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 || NVIDIA, TransferMemory&lt;br /&gt;
|-&lt;br /&gt;
| 5 || NCM&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DD&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;
| 18 || HTC&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;
| 26 || SPL&lt;br /&gt;
|-&lt;br /&gt;
| 100 || ETHC&lt;br /&gt;
|-&lt;br /&gt;
| 101 || I2C&lt;br /&gt;
|-&lt;br /&gt;
| 105 || Settings&lt;br /&gt;
|-&lt;br /&gt;
| 110 || NIFM&lt;br /&gt;
|-&lt;br /&gt;
| 114 || Display&lt;br /&gt;
|-&lt;br /&gt;
| 116 || NTC&lt;br /&gt;
|-&lt;br /&gt;
| 117 || FGM&lt;br /&gt;
|-&lt;br /&gt;
| 120 || PCIE&lt;br /&gt;
|-&lt;br /&gt;
| 121 || Friends&lt;br /&gt;
|-&lt;br /&gt;
| 123 || SSL&lt;br /&gt;
|-&lt;br /&gt;
| 124 || Account&lt;br /&gt;
|-&lt;br /&gt;
| 126 || Mii&lt;br /&gt;
|-&lt;br /&gt;
| 128 || AM&lt;br /&gt;
|-&lt;br /&gt;
| 129 || Play Report&lt;br /&gt;
|-&lt;br /&gt;
| 133 || PCV&lt;br /&gt;
|-&lt;br /&gt;
| 134 || OMM&lt;br /&gt;
|-&lt;br /&gt;
| 137 || NIM&lt;br /&gt;
|-&lt;br /&gt;
| 138 || PSC&lt;br /&gt;
|-&lt;br /&gt;
| 140 || USB&lt;br /&gt;
|-&lt;br /&gt;
| 143 || BTM&lt;br /&gt;
|-&lt;br /&gt;
| 147 || ERPT&lt;br /&gt;
|-&lt;br /&gt;
| 148 || APM&lt;br /&gt;
|-&lt;br /&gt;
| 153 || Audio&lt;br /&gt;
|-&lt;br /&gt;
| 154 || NPNS&lt;br /&gt;
|-&lt;br /&gt;
| 157 || ARP&lt;br /&gt;
|-&lt;br /&gt;
| 158 || BOOT&lt;br /&gt;
|-&lt;br /&gt;
| 161 || NFC&lt;br /&gt;
|-&lt;br /&gt;
| 162 || Userland assert&lt;br /&gt;
|-&lt;br /&gt;
| 168 || Userland crash&lt;br /&gt;
|-&lt;br /&gt;
| 203 || HID&lt;br /&gt;
|-&lt;br /&gt;
| 206 || Capture&lt;br /&gt;
|-&lt;br /&gt;
| 345 || libnx&lt;br /&gt;
|-&lt;br /&gt;
| 346 || HomebrewLoader&lt;br /&gt;
|-&lt;br /&gt;
| 651 || TC&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;
= Error codes =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Description || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C01 || 14 || Invalid kernel capability descriptor&lt;br /&gt;
|-&lt;br /&gt;
| 0x4201 || 33 || [[SPL_services#GetConfig|IsDebugMode]] isn&#039;t set.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCA01 || 101 || Invalid size&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC01 || 102 || Invalid address&lt;br /&gt;
|-&lt;br /&gt;
| 0xCE01 || 103 || Slabheap full&lt;br /&gt;
|-&lt;br /&gt;
| 0xD001 || 104 || Memory full&lt;br /&gt;
|-&lt;br /&gt;
| 0xD201 || 105 || Handle-table full.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD401 || 106 || Invalid memory state / invalid memory permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD801 || 108 || Invalid memory permissions.&lt;br /&gt;
|-&lt;br /&gt;
| 0xDC01 || 110 || Invalid memory range&lt;br /&gt;
|-&lt;br /&gt;
| 0xE001 || 112 || Invalid thread priority.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE201 || 113 || Invalid processor id.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE401 || 114 || Invalid handle.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE601 || 115 || Syscall copy from user failed.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE801 || 116 || Invalid combination&lt;br /&gt;
|-&lt;br /&gt;
| 0xEA01 || 117 || Time out. Also when you give 0 handles to svcWaitSynchronizationN.&lt;br /&gt;
|-&lt;br /&gt;
| 0xEC01 || 118 || Canceled/interrupted [?]&lt;br /&gt;
|-&lt;br /&gt;
| 0xEE01 || 119 || Exceeding maximum&lt;br /&gt;
|-&lt;br /&gt;
| 0xF001 || 120 || Invalid enum&lt;br /&gt;
|-&lt;br /&gt;
| 0xF201 || 121 || No such entry&lt;br /&gt;
|-&lt;br /&gt;
| 0xF401 || 122 || Irq/DeviceAddressSpace/{...} already registered&lt;br /&gt;
|-&lt;br /&gt;
| 0xF601 || 123 || Port remote dead&lt;br /&gt;
|-&lt;br /&gt;
| 0xF801 || 124 || [Usermode] Unhandled interrupt&lt;br /&gt;
|-&lt;br /&gt;
| 0xFA01 || 125 || Wrong memory permission?&lt;br /&gt;
|-&lt;br /&gt;
| 0xFC01 || 126 || Reserved value&lt;br /&gt;
|-&lt;br /&gt;
| 0xFE01 || 127 || Invalid hardware breakpoint&lt;br /&gt;
|-&lt;br /&gt;
| 0x10001 || 128 || [Usermode] Fatal exception&lt;br /&gt;
|-&lt;br /&gt;
| 0x10201 || 129 || Last thread didn&#039;t belong to your process&lt;br /&gt;
|-&lt;br /&gt;
| 0x10601 || 131 || Port max sessions exceeded&lt;br /&gt;
|-&lt;br /&gt;
| 0x10801 || 132 || Resource limit exceeded&lt;br /&gt;
|-&lt;br /&gt;
| 0x20801 || 260 || Command buffer too small&lt;br /&gt;
|-&lt;br /&gt;
| 0x41001 || 520 || Process not being debugged&lt;br /&gt;
|-&lt;br /&gt;
| 0xE02 || 7 || Savedata [[Filesystem_services|already]] mounted&lt;br /&gt;
|-&lt;br /&gt;
| 0x7802 || 60 || The specified [[NCA]]-type doesn&#039;t exist for this title.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D202 || 1001 || Process does not have RomFs &lt;br /&gt;
|-&lt;br /&gt;
| 0x7D402 || 1002 || Title-id not found / savedata not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0xFA202 || 2001 || SD card not inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x13B002 || 2520 || Gamecard not inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x13DA02 || 2541 || Version check failed when mounting gamecard sysupdate partition?&lt;br /&gt;
|-&lt;br /&gt;
| 0x171402 || 2954 || Invalid gamecard handle.&lt;br /&gt;
|-&lt;br /&gt;
| 0x196002 || 3248 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x196202 || 3249 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A4A02 || 3365 || Out of memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x235E02 || 4527 || NCA-path used with the wrong titleID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x235202 || || Invalid NCA Key index&lt;br /&gt;
|-&lt;br /&gt;
| 0x250E02 || 4743 || [[NAX0|Corrupted]] NAX0 header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x251002 || 4744 || Invalid [[NAX0]] magicnum.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE202 || 6001 || Invalid input&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE602 || 6003 || Path too long&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F5A02 || 6061 || Offset outside storage&lt;br /&gt;
|-&lt;br /&gt;
| 0x313802 || 6300 || Operation not supported&lt;br /&gt;
|-&lt;br /&gt;
| 0x320002 || 6400 || Permission denied&lt;br /&gt;
|-&lt;br /&gt;
| 0x326602 || 6451 || Missing titlekey(?) required to mount content&lt;br /&gt;
|-&lt;br /&gt;
| 0x3EA03 || 501 || Invalid handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x3EE03 || 503 || Invalid memory mirror&lt;br /&gt;
|-&lt;br /&gt;
| 0xA05 || 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 || 7 || TitleId not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x1805 || 12 || Invalid StorageId&lt;br /&gt;
|-&lt;br /&gt;
| 0xDC05 || 110 || Gamecard not inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x17C05 || 190 || Gamecard not initialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F405 || 250 || Sdcard not inserted&lt;br /&gt;
|-&lt;br /&gt;
| 0x20805 || 260 || Storage not mounted&lt;br /&gt;
|-&lt;br /&gt;
| 0x806 || 4 || Converted from error 0xD401.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1006 || 8 || Converted from error 0xE401.&lt;br /&gt;
|-&lt;br /&gt;
| 0x408 || 2 || Not initialized.&lt;br /&gt;
|-&lt;br /&gt;
| 0x608 || 3 || Invalid control StorageID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x808 || 4 || Storage not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA08 || 5 || Access denied.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE08 || 7 || Title is not registered.&lt;br /&gt;
|-&lt;br /&gt;
| 0x209 || 1 || Args too long.&lt;br /&gt;
|-&lt;br /&gt;
| 0x409 || 2 || Maximum processes loaded.&lt;br /&gt;
|-&lt;br /&gt;
| 0x609 || 3 || NPDM too big.&lt;br /&gt;
|-&lt;br /&gt;
| 0x809 || 4 || Invalid NPDM.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA09 || 5 || Invalid files.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE09 || 7 || Already registered.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1009 || 8 || Title not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1209 || 9 || Title-id in ACI0 doesn&#039;t match range in ACID.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6609 || 51 || Invalid memory state/permission&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A09 || 53 || Invalid NRR&lt;br /&gt;
|-&lt;br /&gt;
| 0xA209 || 81 || Unaligned NRR address&lt;br /&gt;
|-&lt;br /&gt;
| 0xA409 || 82 || Bad NRR size&lt;br /&gt;
|-&lt;br /&gt;
| 0xAA09 || 85 || Bad NRR address&lt;br /&gt;
|-&lt;br /&gt;
| 0xAE09 || 87 || Bad initialization&lt;br /&gt;
|-&lt;br /&gt;
| 0xC809 || 100 || Unknown ACI0 descriptor&lt;br /&gt;
|-&lt;br /&gt;
| 0xCE09 || 103 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;KernelFlags&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xD009 || 104 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;SyscallMask&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xD409 || 106 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;MapIoOrNormalRange&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xD609 || 107 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;MapNormalPage&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xDE09 || 111 || ACID/ACI0 don&#039;t match for descriptor &amp;quot;InterruptPair&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xE209 ||  || ACID/ACI0 don&#039;t match for descriptor &amp;quot;ApplicationType&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xE409 ||  || ACID/ACI0 don&#039;t match for descriptor &amp;quot;KernelReleaseVersion&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xE609 ||  || ACID/ACI0 don&#039;t match for descriptor &amp;quot;HandleTableSize&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0xE809 ||  || ACID/ACI0 don&#039;t match for descriptor &amp;quot;DebugFlags&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A80A || 212 || Bad magic (expected &#039;SFCO&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x20B || 1 || Size too big to fit to marshal.&lt;br /&gt;
|-&lt;br /&gt;
| 0x11A0B || 141 || Went past maximum during marshalling.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1900B || 200 || Session doesn&#039;t support domains.&lt;br /&gt;
|-&lt;br /&gt;
| 0x25A0B || 301 || Remote process is dead.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D60B || 491 || IPC Query 1 failed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20F || 1 || Pid not found&lt;br /&gt;
|-&lt;br /&gt;
| 0x60F || 3 || Process has no pending events&lt;br /&gt;
|-&lt;br /&gt;
| 0x410 || 2 || Title-id not found&lt;br /&gt;
|-&lt;br /&gt;
| 0xF010 || 120 || Gamecard sysupdate not required&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F610 || 251 || Unexpected StorageId&lt;br /&gt;
|-&lt;br /&gt;
| 0x415 || 2 || Not initialized.&lt;br /&gt;
|-&lt;br /&gt;
| 0x615 || 3 || Max sessions&lt;br /&gt;
|-&lt;br /&gt;
| 0xC15 || 6 || Invalid name (all zeroes)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1015 || 8 || Permission denied&lt;br /&gt;
|-&lt;br /&gt;
| 0x416 || 2 || Address space is full&lt;br /&gt;
|-&lt;br /&gt;
| 0x616 || 3 || NRO already loaded&lt;br /&gt;
|-&lt;br /&gt;
| 0x816 || 4 || Invalid NRO header values&lt;br /&gt;
|-&lt;br /&gt;
| 0xC16 || 6 || Bad NRR magic&lt;br /&gt;
|-&lt;br /&gt;
| 0x1016 || 8 || Reached max NRR count&lt;br /&gt;
|-&lt;br /&gt;
| 0x1216 || 9 || Unable to verify NRO hash or NRR signature&lt;br /&gt;
|-&lt;br /&gt;
| 0x80216 || 1025 || Address not page-aligned&lt;br /&gt;
|-&lt;br /&gt;
| 0x80416 || 1026 || Incorrect NRO size&lt;br /&gt;
|-&lt;br /&gt;
| 0x80816 || 1028 || NRO not loaded&lt;br /&gt;
|-&lt;br /&gt;
| 0x80A16 || 1029 || NRR not loaded&lt;br /&gt;
|-&lt;br /&gt;
| 0x80C16 || 1030 || Already initialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x80E16 || 1031 || Not initialized&lt;br /&gt;
|-&lt;br /&gt;
| 0x41A || 2 || Argument is invalid&lt;br /&gt;
|-&lt;br /&gt;
| 0xC81A || 100 || Incorrect buffer size&lt;br /&gt;
|-&lt;br /&gt;
| 0xCA1A || 101 || Unknown TZ error&lt;br /&gt;
|-&lt;br /&gt;
| 0xD01A || 104 || All AES engines busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xD21A || 105 || Invalid AES engine-id&lt;br /&gt;
|-&lt;br /&gt;
| 0x272 || 1 || Generic error&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC74 || 102 || Time not set&lt;br /&gt;
|-&lt;br /&gt;
| 0x287C || 20 || Argument is NULL&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C7C || 22 || Argument is invalid&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C7C || 30 || Bad input buffer size&lt;br /&gt;
|-&lt;br /&gt;
| 0x407C || 32 || Invalid input buffer&lt;br /&gt;
|-&lt;br /&gt;
| 0x668C || 51 || USB data-transfer in progress&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0899 || 1540 || Audio output was already started&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C9D || 30 || Address is NULL&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E9D || 31 || PID is NULL&lt;br /&gt;
|-&lt;br /&gt;
| 0x549D || 42 || Already bound&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC9D || 102 || Invalid PID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3CF089 || 7800 || Unknown/invalid libcurl error.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E8289-0x3F4089 || 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;
&lt;br /&gt;
== FS Error Codes ==&lt;br /&gt;
&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;
! Error Code || Description || Message&lt;br /&gt;
|-&lt;br /&gt;
| 0x7802 || 60 || Error: Specified mount name already exists.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD401 || 106 || Error: Passed buffer is not usable for fs library.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D202 || 1001 || Error: Specified partition is not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D402 || 1002 || Error: Specified target is not found.&lt;br /&gt;
|-&lt;br /&gt;
| 0xFA002 - 0x138602 || 2000 - 2499 || Error: Failed to access SD card.&lt;br /&gt;
|-&lt;br /&gt;
| 0x136802 - 0x176E02 || 2500 - 2999 || Error: Failed to access game card.&lt;br /&gt;
|-&lt;br /&gt;
| 0x177202 || 3001 || Error: Specified operation is not implemented.&lt;br /&gt;
|-&lt;br /&gt;
| 0x177A02 || 3005 || Error: Specified value is out of range.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B5802 - 0x1F3E02 || 3500 - 3999 || Error: Failed to access MMC.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F4202 - 0x219602 || 4001 - 4299 || Error: ROM is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x219A02 - 0x232602 || 4301 - 4499 || Error: Save data is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x232A02 - 0x23EE02 || 4501 - 4599 || Error: NCA is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23F202 - 0x243E02 || 4601 - 4639 || Error: Integrity verification failed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x244202 - 0x246602 || 4641 - 4659 || Error: Partition FS is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x246A02 - 0x248E02 || 4661 - 4679 || Error: Built-in-storage is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x249202 - 0x24B602 || 4681 - 4699 || Error: FAT FS is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24BA02 - 0x24DE02 || 4701 - 4719 || Error: HOST FS is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F4002 - 0x270E02 || 4000, 4300, 4500, 4600, 4640, 4660, 4680, 4700, 4720-4999 || Error: Data is corrupted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x271002 - 0x2EDE02 || 5000-5999 || Error: Unexpected failure occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE402 - 0x2F1A02 || 6002-6029 || Error: Invalid path was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F5A02 || 6061 || Error: Invalid offset was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F5C02 || 6062 || Error: Invalid size was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F5E02 || 6063 || Error: Null pointer argument was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE002 || 6000 || Error: Precondition violation.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2EE202 - 0x306E02 || 6001-6199 || Error: Invalid argument was specified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x307202 || 6201 || Error: OpenMode_AllowAppend is required for implicit extension of file size by WriteFile().&lt;br /&gt;
|-&lt;br /&gt;
| 0x307002 - 0x313602 || 6200, 6202 - 6299 || Error: Invalid operation for the open mode.&lt;br /&gt;
|-&lt;br /&gt;
| 0x313802 - 0x31FE02 || 6300-6399 || Error: Unsupported operation.&lt;br /&gt;
|-&lt;br /&gt;
| 0x320002 - 0x32C602 || 6400-6499 || Error: Permission denied.&lt;br /&gt;
|-&lt;br /&gt;
| 0x346402 || 6706 || Error: Enough journal space is not left.&lt;br /&gt;
|-&lt;br /&gt;
| 0x346A02 || 6709 || Error: The open count of files and directories reached the limitation.&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 affect 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;
{| 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;
Normal error-codes displayed by the system also use the same format as fatal-errors.&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Filesystem_services&amp;diff=3410</id>
		<title>Filesystem services</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Filesystem_services&amp;diff=3410"/>
		<updated>2018-01-14T00:53:14Z</updated>

		<summary type="html">&lt;p&gt;OgniK: Added cmd#218 and updated cmd#6 for IDeviceOperator&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= fsp-ldr =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name || Arguments || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || MountCode || u64 TitleId + X descriptor [[#ContentPath]] || Returns an [[#IFileSystem]].&lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsCodeMounted || u64 ProcessId || Returns a bool (1 if code is mounted).&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [4.0.0+] Initialize || PID descriptor ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= fsp-pr =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#SetFsPermissions]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#ClearFsPermissions]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [4.0.0+] Initialize ||&lt;br /&gt;
|-&lt;br /&gt;
| 256 || [[#SetEnabledProgramVerification]] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SetFsPermissions ==&lt;br /&gt;
Takes a storageID, a pid, a titleID, a 0x1C type-A buffer for the [[NPDM#FS_Access_Header| FS Access Header]], and a 0x2C type-A buffer for the [[NPDM#FS_Access_Control| FS Access Control]]&lt;br /&gt;
&lt;br /&gt;
Final FS permissions are stored as (ACI0_perms &amp;amp; ACID_perms). Will panic(svcBreak) when buffer sizes from ipc-rawdata are invalid.&lt;br /&gt;
&lt;br /&gt;
== ClearFsPermissions ==&lt;br /&gt;
Takes a pid. Removes registered FS permissions for that PID.&lt;br /&gt;
&lt;br /&gt;
== SetEnabledProgramVerification ==&lt;br /&gt;
Seems to sets a global flag to inputval &amp;amp; 1.&lt;br /&gt;
&lt;br /&gt;
When the flag is zero, it will set ret=0 instead of ret={error} when verifying a RSA signature fails. This RSA signature seems to be the signature in the [[NPDM]] ACID. It then skips verifying what seems to be the second signature in the [[NCA_Format|NCA header]]. Note that if verifying the NPDM(?) signature is successful, and verifying that second signature fails, it will throw an error and abort.&lt;br /&gt;
&lt;br /&gt;
= fsp-srv =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [1.0.0] [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#Initialize]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || OpenDataFileSystemByCurrentProcess&lt;br /&gt;
|-&lt;br /&gt;
| 7 || [2.0.0+] [[#MountContent7]]&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [2.0.0+] [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || [3.0.0+] OpenDataFileSystemByApplicationId&lt;br /&gt;
|-&lt;br /&gt;
| 11 || [[#MountBis]]&lt;br /&gt;
|-&lt;br /&gt;
| 12 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 13 || InvalidateBisCache&lt;br /&gt;
|-&lt;br /&gt;
| 17 || OpenHostFileSystemImpl&lt;br /&gt;
|-&lt;br /&gt;
| 18 || MountSdCard&lt;br /&gt;
|-&lt;br /&gt;
| 19 || [2.0.0+] FormatSdCard&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#DeleteSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || [[#CreateSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#CreateSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || RegisterSaveDataAtomicDeletion&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [2.0.0+] DeleteSaveDataWithSpaceId&lt;br /&gt;
|-&lt;br /&gt;
| 26 || [2.0.0+] FormatSdCardDryRun&lt;br /&gt;
|-&lt;br /&gt;
| 27 || [2.0.0+] IsExFatSupported&lt;br /&gt;
|-&lt;br /&gt;
| 28 || [4.0.0+] DeleteSystemSaveData&lt;br /&gt;
|-&lt;br /&gt;
| 30 || [[#OpenGameCardPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 31 || [[#MountGameCardPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 32 || [3.0.0+] ExtendSaveData&lt;br /&gt;
|-&lt;br /&gt;
| 51 || [[#MountSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 52 || [[#MountSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 53 || [2.0.0+] MountSaveDataReadOnly&lt;br /&gt;
|-&lt;br /&gt;
| 57 || [3.0.0+] ReadSaveDataFileSystemExtraDataWithSpaceId&lt;br /&gt;
|-&lt;br /&gt;
| 58 || ReadSaveDataFileSystemExtraData&lt;br /&gt;
|-&lt;br /&gt;
| 59 || [2.0.0+] WriteSaveDataFileSystemExtraData&lt;br /&gt;
|-&lt;br /&gt;
| 60 || OpenSaveDataInfoReader&lt;br /&gt;
|-&lt;br /&gt;
| 61 || OpenSaveDataIterator&lt;br /&gt;
|-&lt;br /&gt;
| 80 || OpenSaveDataThumbnailFile&lt;br /&gt;
|-&lt;br /&gt;
| 81 || [4.0.0+] OpenSaveDataTransferManager&lt;br /&gt;
|-&lt;br /&gt;
| 100 || MountImageDirectory&lt;br /&gt;
|-&lt;br /&gt;
| 110 || [[#MountContentStorage]]&lt;br /&gt;
|-&lt;br /&gt;
| 200 || OpenDataStorageByCurrentProcess&lt;br /&gt;
|-&lt;br /&gt;
| 201 || [3.0.0+] OpenDataStorageByApplicationId&lt;br /&gt;
|-&lt;br /&gt;
| 202 || [[#OpenDataStorageByDataId]]&lt;br /&gt;
|-&lt;br /&gt;
| 203 || Returns an [[#IStorage]]&lt;br /&gt;
|-&lt;br /&gt;
| 400 || [[#OpenDeviceOperator]]&lt;br /&gt;
|-&lt;br /&gt;
| 500 || [[#OpenSdCardDetectionEventNotifier]]&lt;br /&gt;
|-&lt;br /&gt;
| 501 || [[#OpenGameCardDetectionEventNotifier]]&lt;br /&gt;
|-&lt;br /&gt;
| 600 || [1.0.0-3.0.2] SetCurrentPosixTime&lt;br /&gt;
|-&lt;br /&gt;
| 601 || QuerySaveDataTotalSize&lt;br /&gt;
|-&lt;br /&gt;
| 602 || [[#VerifySaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 603 || CorruptSaveDataForDebug&lt;br /&gt;
|-&lt;br /&gt;
| 604 || CreatePaddingFile&lt;br /&gt;
|-&lt;br /&gt;
| 605 || DeleteAllPaddingFiles&lt;br /&gt;
|-&lt;br /&gt;
| 606 || [2.0.0+] GetRightsId&lt;br /&gt;
|-&lt;br /&gt;
| 607 || [2.0.0+] RegisterExternalKey&lt;br /&gt;
|-&lt;br /&gt;
| 608 || [2.0.0+] UnregisterExternalKey&lt;br /&gt;
|-&lt;br /&gt;
| 609 || [2.0.0+] GetRightsIdByPath&lt;br /&gt;
|-&lt;br /&gt;
| 610 || [3.0.0+] GetRightsIdByPath2 (returns extra byte)&lt;br /&gt;
|-&lt;br /&gt;
| 611 || [4.0.0+] SetCurrentPosixTime&lt;br /&gt;
|-&lt;br /&gt;
| 612 || [4.0.0+] GetFreeSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| 613 || [4.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 614 || [4.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 620 || [2.0.0+] [[#SetSdCardEncryptionSeed]]&lt;br /&gt;
|-&lt;br /&gt;
| 630 || [4.0.0+] SetSdCardAccessibility&lt;br /&gt;
|-&lt;br /&gt;
| 631 || [4.0.0+] IsSdCardAccessible&lt;br /&gt;
|-&lt;br /&gt;
| 640 || [4.0.0+] IsSignedSystemPartitionOnSdCardValid&lt;br /&gt;
|-&lt;br /&gt;
| 800 || [2.0.0+] GetAndClearFileSystemProxyErrorInfo&lt;br /&gt;
|-&lt;br /&gt;
| 1000 || SetBisRootForHost&lt;br /&gt;
|-&lt;br /&gt;
| 1001 || SetSaveDataSize&lt;br /&gt;
|-&lt;br /&gt;
| 1002 || SetSaveDataRootPath&lt;br /&gt;
|-&lt;br /&gt;
| 1003 || DisableAutoSaveDataCreation&lt;br /&gt;
|-&lt;br /&gt;
| 1004 || [[#SetGlobalAccessLogMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 1005 || [[#GetGlobalAccessLogMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 1006 || [[#OutputAccessLogToSdCard]]&lt;br /&gt;
|-&lt;br /&gt;
| 1007 || [4.0.0+] RegisterUpdatePartition&lt;br /&gt;
|-&lt;br /&gt;
| 1008 || [4.0.0+] MountRegisteredUpdatePartition&lt;br /&gt;
|-&lt;br /&gt;
| 1009 || [4.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 1100 || [4.0.0+] OverrideSaveDataTransferTokenSignVerificationKey&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Permissions ==&lt;br /&gt;
Every time permissions are checked, the process registration [[#fsp-pr]] is loaded using the session processID. The permission data is populated with data from the [[NPDM]],&lt;br /&gt;
&lt;br /&gt;
If the processID is &amp;lt;= 6 (which happens only for built-in sysmodules), it will use a hardcoded registration data. The default mask in this case is 0x8000000000000000.&lt;br /&gt;
&lt;br /&gt;
Note that the functions check whether or not at least one bit is set in the mask. This means that, you don&#039;t need to set 0xFFFFFFFFFFFFFFFF to get all permissions: it suffices to set 0x8000000000000000.&lt;br /&gt;
&lt;br /&gt;
If the code were to request an invalid input type, panic. But this never happens.&lt;br /&gt;
&lt;br /&gt;
=== RwPermissions ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type(s) || Mask || Name || Value || Used by&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x8000000000000801 || MountContentType2 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || 0x8000000000000801 || MountContentType5 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || 0x8000000000000801 || MountContentType3 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x3 || 0x8000000000000801 || MountContentType4 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || 0x8000000000000801 || MountContentType6 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x5 || 0x8000000000000801 || MountContentType7 || 1 || [[#MountContent]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x6 || 0x8000000000000000 || || 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x7 || 0x8000000000000800 || ContentStorageAccess || 3 || [[#MountContentStorage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || 0x8000000000001000 || ImageDirectoryAccess || 3 || [[#MountImageDirectory]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x9 || 0x8000000000000084 || MountBisType28 || 3 || [[#MountBis]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xA || 0x8000000000000080 || MountBisType29 || 3 || [[#MountBis]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xB || 0x8000000000008080 || MountBisType30 || 3 || [[#MountBis]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xC || 0x8000000000008080 || MountBisType31 || 3 || [[#MountBis]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xD || 0x8000000000000080 || || 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xE || 0xC000000000200000 || SdCardAccess || 3 || [[#MountSdCard]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xF || 0x8000000000000010 || GameCardUser || 3 || [[#MountGameCardPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 0x8000000000040020 || SaveDataAccess0 || 3 || [[#MountSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || 0x8000000000000028 || SystemSaveDataAccess0 || 3 || [[#MountSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || 0x8000000000000020 || SaveDataAccess1 || 3 || [[#MountSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || 0x8000000000000020 || SystemSaveDataAccess1 || 3 || [[#MountSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 0x8000000000010082 || BisPartition0 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || 0x8000000000010080 || BisPartition10 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || 0x8000000000010080 || BisPartition20 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 0x8000000000010080 || BisPartition21 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || 0x8000000000010080 || BisPartition22 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || 0x8000000000010080 || BisPartition23 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || 0x8000000000010080 || BisPartition24 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 0x8000000000010080 || BisPartition25 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || 0x8000000000000080 || BisPartition26 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || 0x8000000000000084 || BisPartition27 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || 0x8000000000000084 || BisPartition28 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || 0x8000000000000080 || BisPartition29 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 0x8000000000000080 || BisPartition30 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || 0x8000000000000080 || BisPartition31 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || 0x8000000000000080 || BisPartition32 || 3 || [[#OpenBisPartition]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || 0xC000000000200000 || || 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 0x8000000000000100 || GameCard_System || 3 || [[#OpenGameCardPartition]],  [[#EraseGameCard]] (bit1), [[#WriteToGameCard]] (bit1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || 0x8000000000100008 || MountContent_System || 1 || [[#MountContent]], [[#OpenDataStorageByDataId]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || 0xC000000000400000 || HostAccess || 3 || [[#OpenHostFileSystemImpl]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== BoolPermissions ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type(s) || Mask || Name || Used by&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x8000000000000080 || BisCache || [[#InvalidateBisCache]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || 0x8000000000000080 || EraseMmc || [[#EraseMmc]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || 0x8000000000000010 || GameCardCertificate || [[#GetGameCardDeviceCertificate]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x3 || 0x8000000000000010 || GameCardIdSet || [[#GetGameCardIdSet]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || 0x8000000000000200 || GameCardDriver || [[#FinalizeGameCardDriver]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x5 || 0x8000000000000200 || GameCardAsic || [[#GetGameCardAsicInfo]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x6 || 0x8000000000002020 || SaveDataCreate || [[#CreateSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7 || 0x8000000000000060 || SaveDataDelete0 || [[#DeleteSaveData]], [[#RegisterSaveDataAtomicDeletion]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || 0x8000000000000028 || SystemSaveDataCreate0 || [[#CreateSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x9 || 0x8000000000000020 || SystemSaveDataCreate1 || [[#CreateSystemSaveData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xA || 0x8000000000004028 || SaveDataDelete1 || [[#DeleteSaveData]], [[#RegisterSaveDataAtomicDeletion]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xB || 0x8000000000000060 || SaveDataIterators0 || [[#OpenSaveDataIterator]], [[#OpenSaveDataInfoIterator]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xC || 0x8000000000004020 || SaveDataIterators1 || [[#OpenSaveDataIterator]], [[#OpenSaveDataInfoIterator]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xD || 0x8000000000020000 || SaveThumbnails || [[#OpenSaveDataThumbnailFile]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xE || 0x8000000000000400 || PosixTime || [[#SetCurrentPosixTime]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xF || 0x8000000000004060 || SaveDataExtraData || [[#ReadSaveDataFileSystemExtraData]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 0x8000000000080000 || GlobalMode || [[#SetGlobalAccessMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || 0x8000000000080000 || SpeedEmulation || [[#SetSpeedEmulationMode]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || Invalid || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || 0xC000000000800000 || PaddingFiles || [[#CreatePaddingFile]], [[#DeletePaddingFiles]] &lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 0xC000000001000000 || SaveData_Debug || [[#CorruptSaveDataForDebug]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || 0xC000000002000000 || SaveData_SystemManagement || [[#CreateSaveData]], [[#MountSaveData]], [[#SetSaveDataRootPath]]&lt;br /&gt;
|-&lt;br /&gt;
| [2.0.0+] 0x16 || 0x8000000004000000 || || &lt;br /&gt;
|-&lt;br /&gt;
| [2.0.0+] 0x17 || 0x8000000008000000 || || &lt;br /&gt;
|-&lt;br /&gt;
| [2.0.0+] 0x18 || 0x8000000010000000 || || &lt;br /&gt;
|-&lt;br /&gt;
| [2.0.0+] 0x19 || 0x8000000000000800 || || &lt;br /&gt;
|-&lt;br /&gt;
| [2.0.0+] 0x1A || 0x8000000000004020 || || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Initialize ==&lt;br /&gt;
Takes a pid-descriptor.&lt;br /&gt;
&lt;br /&gt;
== MountContent7 ==&lt;br /&gt;
Takes an input u32 (same as [[#MountContent]]) and an u64 title-id. Web-applet loads the u32 from u32_table[inparam]. The in32 must be 4.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
Note: web-applet strings refer to both this cmd and the below &amp;quot;MountContent&amp;quot; as &amp;quot;MountContent&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== MountContent ==&lt;br /&gt;
Takes a type-0x19 input buffer, an in32, and an input title-id.&lt;br /&gt;
&lt;br /&gt;
The in32 must be 5 if the NCA type is 0 (control).&lt;br /&gt;
&lt;br /&gt;
The in32 must be 2..7.&lt;br /&gt;
&lt;br /&gt;
The input buffer is the output string path from nsam [[NS_Services#GetContentNcaPath|GetContentNcaPath]].&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
May return errors when attempting to access NCA-paths for an update-title with a gamecard, when the gamecard isn&#039;t inserted. May return error 0x7D402 in some cases with update-titles. Non-val2 in32 values with NCA-type1 are unusable, even for normal titles.&lt;br /&gt;
&lt;br /&gt;
The official &amp;quot;MountApplicationPackage&amp;quot; func uses this with in64=0 and in32=7.&lt;br /&gt;
&lt;br /&gt;
After the in32-specific permissions are checked, it then gets the func retval for permissions-type 0x25 and func0.&lt;br /&gt;
&lt;br /&gt;
When in32=5, it uses in64=0xffffffffffffffff internally, otherwise it checks if in64 is set to 0xffffffffffffffff then throws an error if so. When the in64 used internally is not 0xffffffffffffffff, it&#039;s compared with the NCA titleID, then an error is thrown on mismatch.&lt;br /&gt;
&lt;br /&gt;
== MountBis ==&lt;br /&gt;
Takes a type-0x19 input buffer string and a u32 Bis partitionID(see below). Official user-process code sets instr[0] = 0 normally.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
Only partitionIDs for FAT partitions are usable with this, otherwise error 0x2EE202 is returned. Seems to be about the same as [[#OpenBisPartition]] except this mounts the partition filesystem instead of allowing direct access to the partition sectors.&lt;br /&gt;
&lt;br /&gt;
== OpenBisPartition ==&lt;br /&gt;
Takes a u32 partition ID, returns 0x2EE202 for partitions which do not exist, 0x320002 for partitions which cannot be opened and a valid [[#IStorage]] handle otherwise.&lt;br /&gt;
&lt;br /&gt;
== InvalidateBisCache ==&lt;br /&gt;
Seems to invalidate the Bis cache for MBR/GPT after overwriting that data via the OpenBisPartition IStorage. Used by [[SystemInitializer]].&lt;br /&gt;
&lt;br /&gt;
== DeleteSaveData ==&lt;br /&gt;
Takes an input u64.&lt;br /&gt;
&lt;br /&gt;
== CreateSaveData ==&lt;br /&gt;
Takes a 0x40-byte Save-struct entry, a 0x40-byte SaveCreate-struct entry, and a 0x10-byte input struct.&lt;br /&gt;
&lt;br /&gt;
Only the first 0x5-bytes in the 0x10-byte struct are initialized: all-zero when automatically creating savedata during savecommon mount by official user-processes. In the dedicated save-creation code in official user-processes: +0 u32 = 0x40060, +4 u8 = 1.&lt;br /&gt;
&lt;br /&gt;
Creates regular savedata.&lt;br /&gt;
&lt;br /&gt;
== CreateSystemSaveData ==&lt;br /&gt;
Takes a 0x40-byte Save-struct entry and a 0x40-byte SaveCreate-struct entry.&lt;br /&gt;
&lt;br /&gt;
Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.&lt;br /&gt;
&lt;br /&gt;
== OpenGameCardPartition ==&lt;br /&gt;
&lt;br /&gt;
Takes an input u32 (partition ID), and returns an [[#IStorage]] for the [[Gamecard_Format|partition]].&lt;br /&gt;
&lt;br /&gt;
== MountGameCardPartition ==&lt;br /&gt;
Takes two input u32s, with the second u32 located at +4 in rawdata after the first u32.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
Mounts a gamecard [[Gamecard_Partition|partition]].&lt;br /&gt;
&lt;br /&gt;
== MountSaveData ==&lt;br /&gt;
Takes an input u8 and a 0x40-byte Save-struct entry. Official user-process code is only known to use value 1 for the u8.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
Permissions aren&#039;t checked until the specified save is successfully found.&lt;br /&gt;
&lt;br /&gt;
Only one process can mount a given savedata at any given time (this includes systemsavedata).&lt;br /&gt;
&lt;br /&gt;
== MountSystemSaveData ==&lt;br /&gt;
Takes an input u8 and a 0x40-byte Save-struct entry. Web-applet only uses value0 for the input u8.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]].&lt;br /&gt;
&lt;br /&gt;
Mounts savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.&lt;br /&gt;
&lt;br /&gt;
== MountContentStorage ==&lt;br /&gt;
Takes a [[#ContentStorageId]]. Invalid values return 0x2EE202.&lt;br /&gt;
&lt;br /&gt;
Returns an [[#IFileSystem]] with NCA files. The read data from these files is identical to the data read by [[Content_Manager_services#ReadEntryRaw]].&lt;br /&gt;
&lt;br /&gt;
== OpenDataStorageByDataId ==&lt;br /&gt;
Takes a [[#StorageId]] and a TitleID.&lt;br /&gt;
&lt;br /&gt;
Returns a [[IPC_Marshalling#Domain_message|domain object ID]] implementing the [[#IStorage]] interface for data archives.&lt;br /&gt;
&lt;br /&gt;
== OpenDeviceOperator ==&lt;br /&gt;
This command returns a session to a port implementing the [[#IDeviceOperator]] interface.&lt;br /&gt;
&lt;br /&gt;
== OpenSdCardDetectionEventNotifier ==&lt;br /&gt;
This command returns a session to a port implementing the [[#IEventNotifier]] interface.&lt;br /&gt;
&lt;br /&gt;
== OpenGameCardDetectionEventNotifier ==&lt;br /&gt;
This command returns a session to a port implementing the [[#IEventNotifier]] interface.&lt;br /&gt;
&lt;br /&gt;
== VerifySaveData ==&lt;br /&gt;
Takes an unknown input u64 and a type-0x6 output buffer.&lt;br /&gt;
&lt;br /&gt;
The input u64 high-byte must be non-zero, otherwise an [[Error_codes|error]] is returned(0xE02).&lt;br /&gt;
&lt;br /&gt;
== SetSdCardEncryptionSeed ==&lt;br /&gt;
Takes 0x10-bytes of input.&lt;br /&gt;
&lt;br /&gt;
Appears to be used to load the seed into FS-module state, since FS-module itself doesn&#039;t seem to have file-reading code to handle this itself.&lt;br /&gt;
&lt;br /&gt;
[[NS_Services|NS]]-module uses this with data read from a file.&lt;br /&gt;
&lt;br /&gt;
== SetGlobalAccessLogMode ==&lt;br /&gt;
Takes an input u32.&lt;br /&gt;
&lt;br /&gt;
== GetGlobalAccessLogMode ==&lt;br /&gt;
Returns an output u32.&lt;br /&gt;
&lt;br /&gt;
GlobalAccessLogMode is normally 0.&lt;br /&gt;
&lt;br /&gt;
== OutputAccessLogToSdCard ==&lt;br /&gt;
Takes a type-0x5 input buffer.&lt;br /&gt;
&lt;br /&gt;
The input buffer is the string to output to the log. User-processes normally include a newline at the end.&lt;br /&gt;
&lt;br /&gt;
User-processes only use this when the value previously loaded from [[#GetGlobalAccessLogMode]] has bit1 set.&lt;br /&gt;
&lt;br /&gt;
When bit1 in GlobalAccessLogMode is clear, FS-module will just return 0 for OutputAccessLogToSdCard. However even with that set the log doesn&#039;t show up SD, unknown why.&lt;br /&gt;
&lt;br /&gt;
The input buffer is written to the &amp;quot;$FsAccessLog:/FsAccessLog.txt&amp;quot; file, where &amp;quot;$FsAccessLog&amp;quot; is the SD-card mount-name. It&#039;s written to the current end of the file(appended).&lt;br /&gt;
&lt;br /&gt;
= IStorage =&lt;br /&gt;
This is the interface for a raw device, usually a block device.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name || Arguments&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Read || Takes a type-0x46 buffer, an offset and length &lt;br /&gt;
|-&lt;br /&gt;
| 1 || Write || Takes a type-0x45 buffer, an offset and length &lt;br /&gt;
|-&lt;br /&gt;
| 2 || Flush || None&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SetSize || Takes a size&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GetSize || None&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [4.0.0+] OperateRange ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= IFileSystem =&lt;br /&gt;
There are two main implementations of this interface:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RomFS&#039;&#039;&#039;: Filesystem implementation statically linked in the binary. Uses an [[#IStorage]] interface as underlying raw device.&lt;br /&gt;
* &#039;&#039;&#039;IPC proxy&#039;&#039;&#039;: Used for all non-RomFS filesystems. In this case, actual filesystem implementation is in the FS process.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CreateFile&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeleteFile&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CreateDirectory&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeleteDirectory&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeleteDirectoryRecursively&lt;br /&gt;
|-&lt;br /&gt;
| 5 || RenameFile&lt;br /&gt;
|-&lt;br /&gt;
| 6 || RenameDirectory&lt;br /&gt;
|-&lt;br /&gt;
| 7 || [[#GetEntryType]]&lt;br /&gt;
|-&lt;br /&gt;
| 8 || OpenFile&lt;br /&gt;
|-&lt;br /&gt;
| 9 || [[#OpenDirectory]]&lt;br /&gt;
|-&lt;br /&gt;
| 10 || [[#Commit]]&lt;br /&gt;
|-&lt;br /&gt;
| 11 || [[#GetFreeSpaceSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 12 || [[#GetTotalSpaceSize]]&lt;br /&gt;
|-&lt;br /&gt;
| 13 || CleanDirectoryRecursively [3.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GetFileTimeStampRaw [3.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [4.0.0+] QueryEntry&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GetEntryType ==&lt;br /&gt;
Takes a type-0x9 input buffer for the path and returns [[#DirectoryEntryType]] as an output u32.&lt;br /&gt;
&lt;br /&gt;
==OpenDirectory==&lt;br /&gt;
Takes a type-0x9 input buffer for the path and an u64 &#039;&#039;&#039;filter_flags&#039;&#039;&#039;. &#039;&#039;&#039;filter_flags&#039;&#039;&#039; controls what type of entries are read by the [[#IDirectory]]: bitmask 0x1 = directories, bitmask 0x2 = files.&lt;br /&gt;
&lt;br /&gt;
== Commit ==&lt;br /&gt;
Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect.&lt;br /&gt;
&lt;br /&gt;
== GetFreeSpaceSize ==&lt;br /&gt;
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total free space with this FS.&lt;br /&gt;
&lt;br /&gt;
== GetTotalSpaceSize ==&lt;br /&gt;
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total space available with this FS(free+used).&lt;br /&gt;
&lt;br /&gt;
= IDirectory =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#Read]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#GetEntryCount]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
Takes a type-0x6 output buffer and an input u64. Unknown what the u64 is for, doesn&#039;t(?) seem to affect output. Returns an output u64(?) for the total number of read entries, this is 0 when no more entries are available.&lt;br /&gt;
&lt;br /&gt;
The output buffer contains the read array of [[#DirectoryEntry]]. This doesn&#039;t include entries for &amp;quot;.&amp;quot; and &amp;quot;..&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== GetEntryCount ==&lt;br /&gt;
Returns an u64 for the total number of readable entries.&lt;br /&gt;
&lt;br /&gt;
= DirectoryEntry =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset || Size || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 0x300 || Path&lt;br /&gt;
|-&lt;br /&gt;
| 0x300 || 0x4 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x304 || 0x1 || [[#DirectoryEntryType]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x305 || 0x3 || Padding?&lt;br /&gt;
|-&lt;br /&gt;
| 0x308 || 0x8? || Filesize, 0 for directories.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= DirectoryEntryType =&lt;br /&gt;
s8 type: 0 = directory, 1 = file.&lt;br /&gt;
&lt;br /&gt;
= IFile =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Read&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Write&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Flush&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SetSize&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GetSize&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [4.0.0+]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ISaveDataInfoReader =&lt;br /&gt;
&lt;br /&gt;
= IDeviceOperator =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsSdCardInserted&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GetSdCardSpeedMode&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [2.0.0+] GetSdCardCid&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] GetSdCardUserAreaSize&lt;br /&gt;
|-&lt;br /&gt;
| 4 || [2.0.0+] GetSdCardProtectedAreaSize&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [2.0.0+] GetAndClearSdCardErrorInfo&lt;br /&gt;
|-&lt;br /&gt;
| 6 || [2.0.0-&amp;gt;3.0.0]&lt;br /&gt;
|-&lt;br /&gt;
| 100 || GetMmcCid&lt;br /&gt;
|-&lt;br /&gt;
| 101 || GetMmcSpeedMode&lt;br /&gt;
|-&lt;br /&gt;
| 110 || EraseMmc&lt;br /&gt;
|-&lt;br /&gt;
| 111 || GetMmcPartitionSize&lt;br /&gt;
|-&lt;br /&gt;
| 112 || [2.0.0+] GetMmcPatrolCount&lt;br /&gt;
|-&lt;br /&gt;
| 113 || [2.0.0+] GetAndClearMmcErrorInfo&lt;br /&gt;
|-&lt;br /&gt;
| 114 || [2.0.0+] GetMmcExtendedCsd&lt;br /&gt;
|-&lt;br /&gt;
| 115 || [4.0.0+] SuspendMmcPatrol&lt;br /&gt;
|-&lt;br /&gt;
| 116 || [4.0.0+] ResumeMmcPatrol&lt;br /&gt;
|-&lt;br /&gt;
| 200 || IsGameCardInserted&lt;br /&gt;
|-&lt;br /&gt;
| 201 || EraseGameCard&lt;br /&gt;
|-&lt;br /&gt;
| 202 || GetGameCardHandle&lt;br /&gt;
|-&lt;br /&gt;
| 203 || [[#GetGameCardUpdatePartitionInfo]]&lt;br /&gt;
|-&lt;br /&gt;
| 204 || FinalizeGameCardDriver&lt;br /&gt;
|-&lt;br /&gt;
| 205 || GetGameCardAttribute&lt;br /&gt;
|-&lt;br /&gt;
| 206 || GetGameCardDeviceCertificate&lt;br /&gt;
|-&lt;br /&gt;
| 207 || GetGameCardAsicInfo&lt;br /&gt;
|-&lt;br /&gt;
| 208 || GetGameCardIdSet&lt;br /&gt;
|-&lt;br /&gt;
| 209 || WriteToGameCard&lt;br /&gt;
|-&lt;br /&gt;
| 210 || SetVerifyWriteEnalbleFlag&lt;br /&gt;
|-&lt;br /&gt;
| 211 || GetGameCardImageHash&lt;br /&gt;
|-&lt;br /&gt;
| 212 || [2.0.0+] GetGameCardErrorInfo&lt;br /&gt;
|-&lt;br /&gt;
| 213 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 214 || [2.0.0+] GetGameCardCid&lt;br /&gt;
|-&lt;br /&gt;
| 215 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 216 || [2.0.0+]&lt;br /&gt;
|-&lt;br /&gt;
| 217 || [2.1.0+] Returns 0x40-bytes of output data.&lt;br /&gt;
|-&lt;br /&gt;
| 218 || [3.0.1+]&lt;br /&gt;
|-&lt;br /&gt;
| 300 || SetSpeedEmulationMode&lt;br /&gt;
|-&lt;br /&gt;
| 301 || GetSpeedEmulationMode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GetGameCardUpdatePartitionInfo ==&lt;br /&gt;
&lt;br /&gt;
Returns a titleID and the title-version for it.&lt;br /&gt;
&lt;br /&gt;
* Output u32 with ARMS-gamecard: title-version v131162. This is the title-version for [[2.1.0]], which is the sysupdate included with this gamecard. Launch-day gamecards return title-version v450.&lt;br /&gt;
* Output u64 with ARMS-gamecard: titleID 0100000000000816.&lt;br /&gt;
&lt;br /&gt;
[[NS_Services|NS]] appears to only use this with [[Content_Manager_services#GetTitleIdInfo]] and [[Content_Manager_services#GetUpdateTitleList]] with storageid=nandsys, for checking whether a sysupdate is required.&lt;br /&gt;
&lt;br /&gt;
= IEventNotifier =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || BindEvent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= StorageId =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || None&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Host&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GameCard&lt;br /&gt;
|-&lt;br /&gt;
| 3 || NandSystem&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NandUser&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SdCard&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ContentStorageId =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || NandSystem&lt;br /&gt;
|-&lt;br /&gt;
| 1 || NandUser&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SdCard&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ContentPath =&lt;br /&gt;
These are the 0x300 paths to NCA files for the various filesystems FS can access, beginning with @. They&#039;re passed via X descriptors, and returned via various [[Location Resolver services|ncm/lr]] commands.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Path || Notes&lt;br /&gt;
|-&lt;br /&gt;
| @SystemContent ||&lt;br /&gt;
|- &lt;br /&gt;
| @UserContent ||&lt;br /&gt;
|-&lt;br /&gt;
| @SdCardContent ||&lt;br /&gt;
|-&lt;br /&gt;
| @CalibFile ||&lt;br /&gt;
|-&lt;br /&gt;
| @Safe ||&lt;br /&gt;
|-&lt;br /&gt;
| @User ||&lt;br /&gt;
|-&lt;br /&gt;
| @System ||&lt;br /&gt;
|-&lt;br /&gt;
| @Sdcard ||&lt;br /&gt;
|-&lt;br /&gt;
| @Host ||&lt;br /&gt;
|-&lt;br /&gt;
| @GcApp || Gamecard App partition (Partition 2)&lt;br /&gt;
|-&lt;br /&gt;
| @GcS00000001 || Gamecard Contents.&lt;br /&gt;
|-&lt;br /&gt;
| @upp || Gamecard update partition (Partition 0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=BisPartitionID=&lt;br /&gt;
* 0: Raw NAND sectors access for MMC [[Flash_Filesystem|boot]] partition 0.&lt;br /&gt;
* 10: Raw NAND sectors access for MMC [[Flash_Filesystem|boot]] partition 1.&lt;br /&gt;
* Rest: see [[Flash_Filesystem|here]].&lt;br /&gt;
&lt;br /&gt;
=Save Struct=&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0 for SystemSaveData. SaveData: 0 can be used for accessing the savedata associated with the current FS session titleID, otherwise when set this is the titleID associated with the savedata to access.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x10&lt;br /&gt;
| userID for user-specific savedata(saveuser) when set, otherwise when zero this indicates the common savedata(savecommon). This is loaded from [[Account_services]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x8&lt;br /&gt;
| u64 [[Flash_Filesystem|saveID]]. 0 for SaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x8&lt;br /&gt;
| ContentStorageId? 0 for SystemSaveData. 1 for SaveData. 2 for DeviceSaveData(with official user-processes all other fields are 0 for DeviceSaveData).&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0 for SystemSaveData/SaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0 for SystemSaveData/SaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0 for SystemSaveData/SaveData.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Total size is 0x40-bytes.&lt;br /&gt;
&lt;br /&gt;
=SaveCreate Struct=&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;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x8&lt;br /&gt;
| [[Savegames|IVFC]] level4 size?&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| Same as offset 0x0 normally? Hard-coded to 0x80000 for BcatSaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x4000 for SystemSaveData/SaveData/DeviceSaveData/BcatSaveData. [[Savegames|IVFC]] level4 block-size in bytes?&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x8&lt;br /&gt;
| Official user-processes only uses 0 here for SystemSaveData/SaveData. For the dedicated save-creation code with SaveData/DeviceSaveData, this value comes from an input param with official user-processes. For BcatSaveData, this is the hard-coded [[Title_list|titleID]] of the bcat-sysmodule.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x4&lt;br /&gt;
| Written using an input param for official user-processes. Hard-coded 0 for BcatSaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 0x1&lt;br /&gt;
| Official user-processes only uses 0 here for SystemSaveData, 1 for SaveData/DeviceSaveData/BcatSaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x25&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0 for SystemSaveData/SaveData.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26&lt;br /&gt;
| 0x1A&lt;br /&gt;
| Not initialized for SystemSaveData/SaveData.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Total size is 0x40-bytes.&lt;br /&gt;
&lt;br /&gt;
=DeviceSaveData=&lt;br /&gt;
This is accessed using the same commands for SaveData with the same input u8, the only difference compared to SaveData is the Save-struct.&lt;br /&gt;
&lt;br /&gt;
=BcatSaveData=&lt;br /&gt;
This is accessed using the same commands for SaveData with the same input u8. The Save-struct is the same as DeviceSaveData, except that the titleID field is set to &amp;lt;input titleID&amp;gt;. See above regarding SaveCreate-struct.&lt;br /&gt;
&lt;br /&gt;
The 0x10-byte struct passed to [[#CreateSaveData]] has the first 0x5-bytes set to all-zero.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Fatal_services&amp;diff=2662</id>
		<title>Fatal services</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Fatal_services&amp;diff=2662"/>
		<updated>2017-10-04T01:31:47Z</updated>

		<summary type="html">&lt;p&gt;OgniK: Added TransitionToFatalError&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= fatal:u =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [[#TransitionToFatalError]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== TransitionToFatalError ==&lt;br /&gt;
Takes an input u64 errorcode and an unknown u64(TID maybe?). It also takes a type-0x15 error buffer and a pid-descriptor. The error buffer contains a stack trace. &lt;br /&gt;
The stack trace address count is stored at errorbuffer+0x240 and the addresses are stored at errorbuffer+0x130+i*8 where i = 0-&amp;gt;address count&lt;br /&gt;
= fatal:p =&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Title_list/Games&amp;diff=2277</id>
		<title>Title list/Games</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Title_list/Games&amp;diff=2277"/>
		<updated>2017-09-02T04:24:14Z</updated>

		<summary type="html">&lt;p&gt;OgniK: Added Mario + Rabbids TID&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Title-id || Versions || Required/included system-version || Media/Serial# || Description || Region || Type&lt;br /&gt;
|-&lt;br /&gt;
| 010000A00218E000 || v0 || || || Splatoon 2 Global Testfire || ALL || Timed Demo&lt;br /&gt;
|-&lt;br /&gt;
| 010002900294A000 || v0 || || || NBA Playgrounds || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01000320000CC000 || v0 || None || Gamecard Front: LA-H-AACCA-{region} Back: AACCA22Y000 || 1-2 Switch || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010009E001D90000 || v0 || || || World of Goo || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010009E001D90800 || v65536 (0.1.0.0) || || || World of Goo || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01000D10038E6000 || v0 || || || ACA NeoGeo Last Resort || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 01000DC003740000 || v0 || || Gamecard Front: LA-H-BAACB-USA Back: LG || Puyo Puyo Tetris || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01000E2003FA0000 || v0 || || || Mighty Gun Volt Burst || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01001180021FA000 || v0 || || || Shovel Knight: Specter of Torment || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01001180021FA800 || v131072 (0.2.0.0) || || || Shovel Knight: Specter of Torment || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100125002060000 || v0 || || || Battle Sports Meguru || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100152000022000 || v0 || None || Gamecard Front: LA-H-AABPA-{region} Back: AABPA22A000 || Mario Kart 8 Deluxe || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100152000022800 || v65536 (0.1.0.0) || || || Mario Kart 8 Deluxe || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01001FA0034E2000 || v0 || || || Dark Witch Music Episode: Rudymical || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010021B002EEA000 || v0 || || || Puyo Puyo Tetris  || JPN || Demo&lt;br /&gt;
|-&lt;br /&gt;
| 010021C000B6A000 || v0 || || Gamecard Front: LA-H-BAAZA-USA Back: BAAZA20Y000 || The Binding of Isaac: Afterbirth+ || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010021C000B6A800 || v65536 (0.1.0.0) || || || The Binding of Isaac: Afterbirth+ || USA || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100225000FEE000 || v0 || || || Blaster Master Zero || ALL || Demo&lt;br /&gt;
|-&lt;br /&gt;
| 0100225000FEE800 || v65536 (0.1.0.0), v131072 (0.2.0.0) || || || Blaster Master Zero || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01002580038DE000 || v0 || || || ACA NeoGeo Galaxy Fight: Universal Warriors || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 010025B002E92000 || v0 || || || Blaster Master Zero || ALL || Demo&lt;br /&gt;
|-&lt;br /&gt;
| 01002E70032E8000 || v0 || || || ACA NeoGeo Turf Masters || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 01002E70032E8800 || v65536 (0.1.0.0) || || || ACA NeoGeo Turf Masters || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 010031F002B66000 || v0 || || || Mr. Shifty || USA, EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010031F002B66800 || v65536 (0.1.0.0) || || || Mr. Shifty || USA, EUR  || Update&lt;br /&gt;
|-&lt;br /&gt;
| 010035B00412A000 || v0 || || || Human Resource Machine || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01003A30012C0000 || v0 || || || LEGO® CITY Undercover || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01003A30012C0800 || v131072 (0.2.0.0) || || || LEGO® CITY Undercover || USA || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01003A5001DBA000 || v0 || || || ACA NeoGeo Over Top || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 01003D60012BE000 || v0 || || || Nobunaga&#039;s Nozomi - Creating with Power Up Kit || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01003D60012BE800 || v65536 (0.1.0.0) || || || Nobunaga&#039;s Nozomi - Creating with Power Up Kit || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100404002F52000 || v0 || || || Silver Star Shogi Ten Tenshi Battle Raijin || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010043F004126000 || v0 || || || Little Inferno || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010047F001DBC000 || v0 || || || ACA NeoGeo Samurai Shodown IV || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 010048D000BFC000 || || || || ? || ? || Demo &lt;br /&gt;
|-&lt;br /&gt;
| 010048D000BFC800 || v131072 (0.2.0.0) || || || ? || ? || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01004B1001D22000 || v0 || || || TumbleSeed || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01004B1001D22800 || v65536 (0.1.0.0) || || || TumbleSeed || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01004B10031BE000 || v0 || || || Puyo Puyo Tetris || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01004B3004062000 || v0 || || || World of Goo || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01004C200100E000 || v0 || || || New Frontier Days: Founding Pioneers || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01004D10020F2000 || v0 || || || Graceful Explosion Machine || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01004D10020F2800 || v131072 (0.2.0.0) || || || Graceful Explosion Machine || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01004DE001DC8000 || v0 || || || ACA NeoGeo Shock Trooper&#039;s Second Scud || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01004E90028A2000 || v0 || || || Vroom in the night sky || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01004E90028A2800 || v65536 (0.1.0.0) || || || Vroom in the night sky || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01004F7003726000 || v0 || || || Disgaea 5 Complete || JPN || Demo&lt;br /&gt;
|-&lt;br /&gt;
| 010053D0001BE000 || v0 || || || Puyo Puyo Tetris || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010053D0001BE800 || v65536 (0.1.0.0) || || || Puyo Puyo Tetris || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01005700031AE000 || v0 || || || Disgaea 5 Complete || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01005700031AE800 || v65536 (0.1.0.0) || || || Disgaea 5 Complete || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 010057D0021E8000 || v0 || || || Shovel Knight: Treasure Trove || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010057D0021E8800 || v131072 (0.2.0.0) || || || Shovel Knight: Treasure Trove || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100583001DCA000 || v0 || || || ACA NeoGeo The King Of Fighters &#039;99 || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 010065A00213C000 || v0 || || || Sora Damu Flowering Declaration || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010065A00213C800 || v65536 (0.1.0.0) || || || Sora Damu Flowering Declaration || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01006740034F6000 || v0 || || || Just Dance 2017 || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100BCE000598000 || v0 || || || Just Dance 2017 || ALL || Demo&lt;br /&gt;
|-&lt;br /&gt;
| 0100BCE000598800 || v65536 (0.1.0.0) || || || Just Dance 2017 || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01006A5003698000 || v0 || || || Maison De MAOU || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01006BD001E06000 || v0 || || || Minecraft: Nintendo Switch Edition || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01006BD001E06800 || v196608 (0.3.0.0) || || || Minecraft: Nintendo Switch Edition || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01006F6002840000 || v0 || || || Thumper for Nintendo Switch || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100701001D92000 || v0 || || || Human Resource Machine  || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100701001D92800 || v65536 (0.1.0.0), v131072 (0.2.0.0) || || || Human Resource Machine || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100704000B3A000 || v0 || || || Snipperclips || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01007330027EE000 || v0 || || || ULTRA STREET FIGHTER II: The Final Challengers || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01007330027EE800 || v65536 (0.1.0.0) || || || ULTRA STREET FIGHTER II: The Final Challengers || USA || Update&lt;br /&gt;
|-&lt;br /&gt;
| 010073C001D5E000 || v0 || || (Digital Download) || Puyo Puyo Tetris || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100744001588000 || v0 || || || Cars 3: Driven to Win || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100744001588800 || v65536 (0.1.0.0) || || || Cars 3: Driven to Win || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01007AD00013E000 || v0 || None || || Super Bomberman R || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01007AD00013E800 || v65536 (0.1.0.0), v131072 (0.2.0.0), v196608 (0.3.0.0), v262144 (0.4.0.0) || || || Super Bomberman R || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01007D7001D0E000 || v0 || || || Oceanhorn: Monster of Uncharted Seas || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01007EF00011E000 || v0 || None || Gamecard Front: LA-H-AAAAA-{region} Back: AAAAA13A000 || The Legend of Zelda: Breath of the Wild || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01007EF00011E800 || v262144 (0.4.0.0) || || || The Legend of Zelda: Breath of the Wild || ALL || Update &lt;br /&gt;
|-&lt;br /&gt;
| 0100849000BDA000 || v0 || || || I Am Setsuna || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100849000BDA800 || v65536 (0.1.0.0) || || || I Am Setsuna || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 010085300314E000 || v0 || || || Kamiko || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010085500130A000 || v0 || || || LEGO® CITY Undercover || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010085500130A800 || v131072 (0.2.0.0) || || || LEGO® CITY Undercover || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100882001380000 || v0 || || || Romance of the Three Kingdoms XIII || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100882001380800 || v131072 (0.2.0.0) || || || Romance of the Three Kingdoms XIII || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01008A9001DC2000 || v0 || || || ACA NeoGeo Shock Troopers || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 01008A9001DC2800 || v65536 (0.1.0.0) || || || ACA NeoGeo Shock Troopers || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01008D1001512000 || v0 || || || Cars 3: Driven to Win || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01008D1001512800 || v65536 (0.1.0.0) || || || Cars 3: Driven to Win || USA || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100902001014000 || v0 || || || Othello || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100930002EAA000 || v0 || || || Dragon Quest Heroes 1 &amp;amp; 2 || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01009400030D6000 || v0 || || || Seiken Legend Collection || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01009510001CA000 || v0 || || || FAST RMX || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01009510001CA800 || v131072 (0.2.0.0) || || || FAST RMX || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01009B500007C000 || v0 || Gamecard: [[2.1.0]] || || ARMS || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01009D4001DC4000 || v0 || || || ACA NeoGeo World Heroes Perfect || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 01009D4001DC4800 || v65536 (0.1.0.0) || || || ACA NeoGeo World Heroes Perfect || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100A6300150C000 || v0 || || || Wonder Boy: The Dragon&#039;s Trap || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100A76002B46000 || v0 || || || ACA NeoGeo Alpha Mission II || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100A7F002830000 || v0 || || || VOEZ || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100A7F002830800 || v65536 (0.1.0.0) || || || VOEZ || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100A8C001DCE000 || v0 || || || ACA NeoGeo NAM-1975 || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100A8C001DCE800 || v65536 (0.1.0.0) || || || ACA NeoGeo NAM-1975 || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100AE0003424000 || v0 || || || Shantae: Half-Genie Hero || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100AED003A60000 || v0 || || || Plantera Garden Life DX Edition || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100B18001D8E000 || v0 || || || Little Inferno || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100B18001D8E800 || v131072 (0.2.0.0) || || || Little Inferno || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100B42001DB4000 || v0 || || || ACA NeoGeo The King of Fighters &#039;98 || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100B42001DB4800 || v65536 (0.1.0.0) || || || ACA NeoGeo The King of Fighters &#039;98 || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100B7D0022EE000 || v0 || || || Cave Story+ for Nintendo Switch || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100BA8001DC6000 || v0 || || || ACA NeoGeo Metal Slug 3 || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100BA8001DC6800 || v65536 (0.1.0.0) || || || ACA NeoGeo Metal Slug 3 || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100BBF0027EC000 || v0 || || || ULTRA STREET FIGHTER II: The Final Challengers || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100BBF0027EC800 || v65536 (0.1.0.0) || || || ULTRA STREET FIGHTER II: The Final Challengers || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100C0F0020E8000 || v0 || || || Snake Pass || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100C0F0020E8800 || v65536 (0.1.0.0) || || || Snake Pass || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100C220040C0000 || v0 || || || Mr. Shifty || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100C3F000BD8000 || v0 || || || Everyone Party! Spelunker || JPN || Demo&lt;br /&gt;
|-&lt;br /&gt;
| 0100C5E003B40000 || v0 || None || || ARMS Global Testpunch || ALL || Timed Demo&lt;br /&gt;
|-&lt;br /&gt;
| 0100C5E003B40800 || v65536 (0.1.0.0) || None || || ARMS Global Testpunch || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100C86000B58000 || v0 || || || ULTRA STREET FIGHTER II: The Final Challengers || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100C86000B58800 || v65536 (0.1.0.0) || || || ULTRA STREET FIGHTER II: The Final Challengers || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100CB2001DB8000 || v0 || || || ACA NeoGeo Garou: Mark of the Wolves || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100CC80013D6000 || v0 || || || The JackBox Party Pack 3 || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100CCC0002E6000 || v0 || || || Skylanders Imaginators || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100CCC0002E6800 || v131072 (0.2.0.0) || || || Skylanders Imaginators || USA || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100CD3000BDC000 || v0 || || || Dragon Quest Heroes 1 &amp;amp; 2 || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100CD3000BDC800 || v196608 (0.3.0.0) || || || Dragon Quest Heroes 1 &amp;amp; 2 || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100CEF001DC0000 || v0 || || || ACA NeoGeo Waku Waku 7 || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100CEF001DC0800 || v65536 (0.1.0.0) || || || ACA NeoGeo Waku Waku 7 || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100D170038EA000 || v0 || || || ACA NeoGeo Sengoku || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100D87002EE0000 || v0 || || || Snipperclips - Cut it out, together! || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100D87002EE0800 || v0, v65536 (0.1.0.0) || || || Snipperclips - Cut it out, together! || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100DFC003398000 || v0 || || || ACA NeoGeo Blazing Star || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100E29001298000 || v0 || || Gamecard Front: LA-H-ABMKA-{region} Back: ABMKA09Y000 || Has-Been Heroes || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100E29001298800 || v131072 (0.2.0.0) || || || Has-Been Heroes || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100E5F0000C0000 || v0 || || || Disgaea 5 Complete || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100E5F0000C0800 || v131072 (0.2.0.0) || || || Disgaea 5 Complete || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100E67003A86000 || v0 || || Gamecard Front: LA-H-AACAC-{region} Back: AACAC41A000 || Disgaea 5 Complete || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100EB2001DCC000 || v0 || || || ACA NeoGeo The King of Fighters &#039;94  || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100EBE002B3E000 || v0 || || || ACA NeoGeo Metal Slug || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100EE6002B48000 || v0 || || || ACA NeoGeo Fatal Fury || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100F0400351C000 || v0 || || || Astro Duel Deluxe || USA, EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100F0400351C800 || v65536 (0.1.0.0) || || || Astro Duel Deluxe || USA, EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100F12002FC8000 || v0 || || || Everyone Party! Spelunker || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100F3D001DEE000 || v0 || || || Puyo Puyo Tetris || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01002B6001364000 || || || || LEGO® CITY Undercover || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01002B6001364800 || || || || LEGO® CITY Undercover || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100AE9003FAC000 || || || || Touch Battle Tank SP || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100AE9003FAC800 || || || || Touch Battle Tank SP || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 010024D0032F2000 || || || || PHOTON³ (Photon Cube) || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010024D0032F2800 || || || || PHOTON³ (Photon Cube) || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01007C2002B3C000 || || || || GoNNER || JPN, USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01007C2002B3C800 || || || || GoNNER || JPN, USA || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100737003190000 || || || || IMPLOSION || JPN, USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100737003190800 || || || || IMPLOSION || JPN, USA || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100737003190000 || || || || IMPLOSION || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100737003190800 || || || || IMPLOSION || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01004040033CE000 || || || NicoNico Video Sharing Application || niconico || JPN || Application&lt;br /&gt;
|-&lt;br /&gt;
| 01004040033CE800 || || || NicoNico Video Sharing Application || niconico || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 010019A0038FA000 || || || || ACA NeoGeo Fatal Fury SPECIAL || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 010019A0038FA800 || || || || ACA NeoGeo Fatal Fury SPECIAL || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01003C700009C000 || || || || Splatoon 2 || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01003C700009C800 || || || || Splatoon 2 || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100C3700416A000 || || || || SUPER PING PONG TRICKSHOT || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100C3700416A800 || || || || SUPER PING PONG TRICKSHOT || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01003BC0000A0000 || || Gamecard: 2.3.0 || Gamecard Front: LA-H-AAB6B-USA || Splatoon 2 || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01003BC0000A0800 || v262144(Display-ver 1.2.0 - uses [[3.0.1]] NCA crypto([[NCA|nca-type0]])) || || || Splatoon 2 || USA || Update&lt;br /&gt;
|-&lt;br /&gt;
| 010067300059A000 || || || || Mario + Rabbids Kingdom Battle || USA || Game&lt;br /&gt;
|}&lt;br /&gt;
Game updates have the same titleID as the main application, except with bitmask 0x800 set.&lt;br /&gt;
&lt;br /&gt;
The following data was found in [[NS_Services|NS]](NUL-terminators removed):&lt;br /&gt;
 {tasks&amp;quot;:[{id&amp;quot;:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&amp;quot;,titles&amp;quot;:[{id&amp;quot;:0100c5e003b40000&amp;quot;,version&amp;quot;:0,type&amp;quot;:Application&amp;quot;},{id&amp;quot;:0100c5e003b40800&amp;quot;,version&amp;quot;:65536,type&amp;quot;:Patch&amp;quot;}],owner_application&amp;quot;:0100c5e003b40000&amp;quot;}],format_version&amp;quot;:1,last_modified&amp;quot;:1497023220,required_system_version&amp;quot;:0&amp;quot;}.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;xxx...&amp;quot; Is where lowercase hex is in the original data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=VersionList=&lt;br /&gt;
The following was parsed from data dumped on June 10, 2017. This is located after strings &amp;quot;nsaccache:/cache/lru_list.dat&amp;quot;, &amp;quot;nsaccache&amp;quot;, and &amp;quot;ns_appman&amp;quot; in memory. Format is similar to 3DS eShop VersionList: header is 0x20-bytes instead of 0x10(due to word size presumably). The structure of the title entries are still 0x10-bytes, with the unk field being used now. The unk field is presumably the minimum required title-version for this TID when non-zero, refusing to launch the app otherwise. That&#039;s only enforced when that version was already installed on the system at some point however. The order of the below titles is the same as what was in memory.&lt;br /&gt;
&lt;br /&gt;
 u64 titleID             version unk&lt;br /&gt;
 01000320000CC000 	0 	0&lt;br /&gt;
 0100704000B3A000 	0 	0&lt;br /&gt;
 01007EF00011E000 	0 	0&lt;br /&gt;
 01007EF00011E800 	262144 	262144&lt;br /&gt;
 0100D87002EE0000 	0 	0&lt;br /&gt;
 0100CD3000BDC000 	0 	0&lt;br /&gt;
 010053D0001BE000 	0 	0&lt;br /&gt;
 0100BCE000598800 	65536 	65536&lt;br /&gt;
 0100930002EAA000 	0 	0&lt;br /&gt;
 010053D0001BE800 	65536 	65536&lt;br /&gt;
 0100BCE000598000 	0 	0&lt;br /&gt;
 0100CD3000BDC800 	196608 	196608&lt;br /&gt;
 010021B002EEA000 	0 	0&lt;br /&gt;
 01007AD00013E800 	262144 	262144&lt;br /&gt;
 01001180021FA000 	0 	0&lt;br /&gt;
 0100225000FEE000 	0 	0&lt;br /&gt;
 01003D60012BE000 	0 	0&lt;br /&gt;
 010048D000BFC800 	131072 	131072&lt;br /&gt;
 01004C200100E000 	0 	0&lt;br /&gt;
 01004E90028A2000 	0 	0&lt;br /&gt;
 010057D0021E8000 	0 	0&lt;br /&gt;
 010065A00213C000 	0 	0&lt;br /&gt;
 01007AD00013E000 	0 	0&lt;br /&gt;
 0100849000BDA000 	0 	0&lt;br /&gt;
 01008A9001DC2000 	0 	0&lt;br /&gt;
 0100902001014000 	0 	0&lt;br /&gt;
 01009510001CA000 	0 	0&lt;br /&gt;
 01009510001CA800 	131072 	131072&lt;br /&gt;
 01009D4001DC4000 	0 	0&lt;br /&gt;
 0100A7F002830000 	0 	0&lt;br /&gt;
 0100B42001DB4000 	0 	0&lt;br /&gt;
 0100BA8001DC6000 	0 	0&lt;br /&gt;
 0100CCC0002E6800 	131072 	131072&lt;br /&gt;
 0100CEF001DC0000 	0 	0&lt;br /&gt;
 0100E5F0000C0000 	0 	0&lt;br /&gt;
 0100A8C001DCE000 	0 	0&lt;br /&gt;
 010021C000B6A000 	0 	0&lt;br /&gt;
 0100E29001298000 	0 	0&lt;br /&gt;
 010073C001D5E000 	0 	0&lt;br /&gt;
 010009E001D90000 	0 	0&lt;br /&gt;
 0100701001D92000 	0 	0&lt;br /&gt;
 0100B18001D8E000 	0 	0&lt;br /&gt;
 010000A00218E000 	0 	0&lt;br /&gt;
 01008A9001DC2800 	65536 	65536&lt;br /&gt;
 01009D4001DC4800 	65536 	65536&lt;br /&gt;
 0100A8C001DCE800 	65536 	65536&lt;br /&gt;
 0100B42001DB4800 	65536 	65536&lt;br /&gt;
 0100BA8001DC6800 	65536 	65536&lt;br /&gt;
 0100CEF001DC0800 	65536 	65536&lt;br /&gt;
 0100225000FEE800 	131072 	131072&lt;br /&gt;
 0100EB2001DCC000 	0 	0&lt;br /&gt;
 01003A30012C0000 	0 	0&lt;br /&gt;
 010021C000B6A800 	65536 	65536&lt;br /&gt;
 0100C0F0020E8000 	1 	0&lt;br /&gt;
 01002E70032E8000 	0 	0&lt;br /&gt;
 010085500130A000 	0 	0&lt;br /&gt;
 0100701001D92800 	131072 	65536&lt;br /&gt;
 0100B18001D8E800 	131072 	131072&lt;br /&gt;
 01004D10020F2000 	0 	0&lt;br /&gt;
 0100882001380800 	131072 	131072&lt;br /&gt;
 0100E29001298800 	131072 	131072&lt;br /&gt;
 0100EBE002B3E000 	0 	0&lt;br /&gt;
 0100882001380000 	0 	0&lt;br /&gt;
 01001180021FA800 	131072 	0&lt;br /&gt;
 010057D0021E8800 	131072 	131072&lt;br /&gt;
 0100C0F0020E8800 	65536 	65536&lt;br /&gt;
 01004D10020F2800 	131072 	131072&lt;br /&gt;
 01006740034F6000 	0 	0&lt;br /&gt;
 0100A76002B46000 	0 	0&lt;br /&gt;
 010085500130A800 	131072 	131072&lt;br /&gt;
 01003A30012C0800 	131072 	131072&lt;br /&gt;
 01004E90028A2800 	65536 	65536&lt;br /&gt;
 0100E5F0000C0800 	131072 	131072&lt;br /&gt;
 0100F12002FC8000 	0 	0&lt;br /&gt;
 010031F002B66000 	0 	0&lt;br /&gt;
 0100CC80013D6000 	0 	0&lt;br /&gt;
 0100F3D001DEE000 	0 	0&lt;br /&gt;
 01002E70032E8800 	65536 	65536&lt;br /&gt;
 0100D87002EE0800 	65536 	0&lt;br /&gt;
 01000DC003740000 	0 	0&lt;br /&gt;
 0100849000BDA800 	65536 	65536&lt;br /&gt;
 010047F001DBC000 	0 	0&lt;br /&gt;
 01004B10031BE000 	0 	0&lt;br /&gt;
 01006A5003698000 	0 	0&lt;br /&gt;
 010085300314E000 	0 	0&lt;br /&gt;
 0100A6300150C000 	0 	0&lt;br /&gt;
 0100152000022000 	0 	0&lt;br /&gt;
 0100EE6002B48000 	0 	0&lt;br /&gt;
 010065A00213C800 	65536 	65536&lt;br /&gt;
 0100C3F000BD8000 	0 	0&lt;br /&gt;
 01004B1001D22000 	0 	0&lt;br /&gt;
 01007330027EE000 	0 	0&lt;br /&gt;
 01003A5001DBA000 	0 	0&lt;br /&gt;
 0100404002F52000 	0 	0&lt;br /&gt;
 01003D60012BE800 	65536 	65536&lt;br /&gt;
 0100DFC003398000 	0 	0&lt;br /&gt;
 01005700031AE000 	0 	0&lt;br /&gt;
 01004B1001D22800 	65536 	65536&lt;br /&gt;
 010002900294A000 	0 	0&lt;br /&gt;
 010025B002E92000 	0 	0&lt;br /&gt;
 0100BBF0027EC000 	0 	0&lt;br /&gt;
 010009E001D90800 	65536 	0&lt;br /&gt;
 01006BD001E06000 	0 	0&lt;br /&gt;
 0100CB2001DB8000 	0 	0&lt;br /&gt;
 01001FA0034E2000 	0 	0&lt;br /&gt;
 01006BD001E06800 	196608 	196608&lt;br /&gt;
 01006F6002840000 	0 	0&lt;br /&gt;
 0100E67003A86000 	0 	0&lt;br /&gt;
 0100125002060000 	0 	0&lt;br /&gt;
 01002580038DE000 	0 	0&lt;br /&gt;
 01004F7003726000 	0 	0&lt;br /&gt;
 0100C5E003B40000 	0 	0&lt;br /&gt;
 0100152000022800 	65536 	65536&lt;br /&gt;
 0100B7D0022EE000 	0 	0&lt;br /&gt;
 0100583001DCA000 	0 	0&lt;br /&gt;
 0100F0400351C000 	0 	0&lt;br /&gt;
 01009B500007C000 	0 	0&lt;br /&gt;
 01005700031AE800 	65536 	65536&lt;br /&gt;
 01004B3004062000 	0 	0&lt;br /&gt;
 0100C220040C0000 	0 	0&lt;br /&gt;
 0100BBF0027EC800 	65536 	65536&lt;br /&gt;
 0100C86000B58000 	0 	0&lt;br /&gt;
 0100C86000B58800 	65536 	65536&lt;br /&gt;
 01007330027EE800 	65536 	0&lt;br /&gt;
 01008D1001512000 	0 	0&lt;br /&gt;
 0100F0400351C800 	65536 	65536&lt;br /&gt;
 01000D10038E6000 	0 	0&lt;br /&gt;
 0100AE0003424000 	0 	0&lt;br /&gt;
 010043F004126000 	0 	0&lt;br /&gt;
 01009400030D6000 	0 	0&lt;br /&gt;
 0100A7F002830800 	65536 	65536&lt;br /&gt;
 0100C5E003B40800 	65536 	65536&lt;br /&gt;
 0100744001588800 	65536 	65536&lt;br /&gt;
 010035B00412A000 	0 	0&lt;br /&gt;
 01004DE001DC8000 	0 	0&lt;br /&gt;
 0100AED003A60000 	0 	0&lt;br /&gt;
 0100D170038EA000 	0 	0&lt;br /&gt;
 01008D1001512800 	65536 	0&lt;br /&gt;
 010031F002B66800 	65536 	0&lt;br /&gt;
 01000E2003FA0000 	0 	0&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Title_list/Games&amp;diff=1747</id>
		<title>Title list/Games</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Title_list/Games&amp;diff=1747"/>
		<updated>2017-07-22T22:52:54Z</updated>

		<summary type="html">&lt;p&gt;OgniK: Added splatoon 2 tid&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Title-id || Versions || Required/included system-version || Media/Serial# || Description || Region || Type&lt;br /&gt;
|-&lt;br /&gt;
| 010000A00218E000 || v0 || || || Splatoon 2 Global Testfire || ALL || Timed Demo&lt;br /&gt;
|-&lt;br /&gt;
| 010002900294A000 || v0 || || || NBA Playgrounds || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01000320000CC000 || v0 || None || Gamecard Front: LA-H-AACCA-{region} Back: AACCA22Y000 || 1-2 Switch || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010009E001D90000 || v0 || || || World of Goo || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010009E001D90800 || v65536 (0.1.0.0) || || || World of Goo || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01000D10038E6000 || v0 || || || ACA NeoGeo Last Resort || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 01000DC003740000 || v0 || || Gamecard Front: LA-H-BAACB-USA Back: LG || Puyo Puyo Tetris || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01000E2003FA0000 || v0 || || || Mighty Gun Volt Burst || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01001180021FA000 || v0 || || || Shovel Knight: Specter of Torment || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01001180021FA800 || v131072 (0.2.0.0) || || || Shovel Knight: Specter of Torment || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100125002060000 || v0 || || || Battle Sports Meguru || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100152000022000 || v0 || None || Gamecard Front: LA-H-AABPA-{region} Back: AABPA22A000 || Mario Kart 8 Deluxe || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100152000022800 || v65536 (0.1.0.0) || || || Mario Kart 8 Deluxe || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01001FA0034E2000 || v0 || || || Dark Witch Music Episode: Rudymical || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010021B002EEA000 || v0 || || || Puyo Puyo Tetris  || JPN || Demo&lt;br /&gt;
|-&lt;br /&gt;
| 010021C000B6A000 || v0 || || Gamecard Front: LA-H-BAAZA-USA Back: BAAZA20Y000 || The Binding of Isaac: Afterbirth+ || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010021C000B6A800 || v65536 (0.1.0.0) || || || The Binding of Isaac: Afterbirth+ || USA || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100225000FEE000 || v0 || || || Blaster Master Zero || ALL || Demo&lt;br /&gt;
|-&lt;br /&gt;
| 0100225000FEE800 || v65536 (0.1.0.0), v131072 (0.2.0.0) || || || Blaster Master Zero || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01002580038DE000 || v0 || || || ACA NeoGeo Galaxy Fight: Universal Warriors || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 010025B002E92000 || v0 || || || Blaster Master Zero || ALL || Demo&lt;br /&gt;
|-&lt;br /&gt;
| 01002E70032E8000 || v0 || || || ACA NeoGeo Turf Masters || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 01002E70032E8800 || v65536 (0.1.0.0) || || || ACA NeoGeo Turf Masters || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 010031F002B66000 || v0 || || || Mr. Shifty || USA, EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010031F002B66800 || v65536 (0.1.0.0) || || || Mr. Shifty || USA, EUR  || Update&lt;br /&gt;
|-&lt;br /&gt;
| 010035B00412A000 || v0 || || || Human Resource Machine || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01003A30012C0000 || v0 || || || LEGO® CITY Undercover || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01003A30012C0800 || v131072 (0.2.0.0) || || || LEGO® CITY Undercover || USA || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01003A5001DBA000 || v0 || || || ACA NeoGeo Over Top || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 01003D60012BE000 || v0 || || || Nobunaga&#039;s Nozomi - Creating with Power Up Kit || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01003D60012BE800 || v65536 (0.1.0.0) || || || Nobunaga&#039;s Nozomi - Creating with Power Up Kit || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100404002F52000 || v0 || || || Silver Star Shogi Ten Tenshi Battle Raijin || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010043F004126000 || v0 || || || Little Inferno || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010047F001DBC000 || v0 || || || ACA NeoGeo Samurai Shodown IV || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 010048D000BFC000 || || || || ? || ? || Demo &lt;br /&gt;
|-&lt;br /&gt;
| 010048D000BFC800 || v131072 (0.2.0.0) || || || ? || ? || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01004B1001D22000 || v0 || || || TumbleSeed || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01004B1001D22800 || v65536 (0.1.0.0) || || || TumbleSeed || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01004B10031BE000 || v0 || || || Puyo Puyo Tetris || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01004B3004062000 || v0 || || || World of Goo || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01004C200100E000 || v0 || || || New Frontier Days: Founding Pioneers || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01004D10020F2000 || v0 || || || Graceful Explosion Machine || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01004D10020F2800 || v131072 (0.2.0.0) || || || Graceful Explosion Machine || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01004DE001DC8000 || v0 || || || ACA NeoGeo Shock Trooper&#039;s Second Scud || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01004E90028A2000 || v0 || || || Vroom in the night sky || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01004E90028A2800 || v65536 (0.1.0.0) || || || Vroom in the night sky || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01004F7003726000 || v0 || || || Disgaea 5 Complete || JPN || Demo&lt;br /&gt;
|-&lt;br /&gt;
| 010053D0001BE000 || v0 || || || Puyo Puyo Tetris || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010053D0001BE800 || v65536 (0.1.0.0) || || || Puyo Puyo Tetris || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01005700031AE000 || v0 || || || Disgaea 5 Complete || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01005700031AE800 || v65536 (0.1.0.0) || || || Disgaea 5 Complete || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 010057D0021E8000 || v0 || || || Shovel Knight: Treasure Trove || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010057D0021E8800 || v131072 (0.2.0.0) || || || Shovel Knight: Treasure Trove || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100583001DCA000 || v0 || || || ACA NeoGeo The King Of Fighters &#039;99 || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 010065A00213C000 || v0 || || || Sora Damu Flowering Declaration || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010065A00213C800 || v65536 (0.1.0.0) || || || Sora Damu Flowering Declaration || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01006740034F6000 || v0 || || || Just Dance 2017 || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100BCE000598000 || v0 || || || Just Dance 2017 || ALL || Demo&lt;br /&gt;
|-&lt;br /&gt;
| 0100BCE000598800 || v65536 (0.1.0.0) || || || Just Dance 2017 || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01006A5003698000 || v0 || || || Maison De MAOU || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01006BD001E06000 || v0 || || || Minecraft: Nintendo Switch Edition || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01006BD001E06800 || v196608 (0.3.0.0) || || || Minecraft: Nintendo Switch Edition || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01006F6002840000 || v0 || || || Thumper for Nintendo Switch || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100701001D92000 || v0 || || || Human Resource Machine  || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100701001D92800 || v65536 (0.1.0.0), v131072 (0.2.0.0) || || || Human Resource Machine || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100704000B3A000 || v0 || || || Snipperclips || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01007330027EE000 || v0 || || || ULTRA STREET FIGHTER II: The Final Challengers || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01007330027EE800 || v65536 (0.1.0.0) || || || ULTRA STREET FIGHTER II: The Final Challengers || USA || Update&lt;br /&gt;
|-&lt;br /&gt;
| 010073C001D5E000 || v0 || || (Digital Download) || Puyo Puyo Tetris || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100744001588000 || v0 || || || Cars 3: Driven to Win || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100744001588800 || v65536 (0.1.0.0) || || || Cars 3: Driven to Win || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01007AD00013E000 || v0 || None || || Super Bomberman R || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01007AD00013E800 || v65536 (0.1.0.0), v131072 (0.2.0.0), v196608 (0.3.0.0), v262144 (0.4.0.0) || || || Super Bomberman R || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01007D7001D0E000 || v0 || || || Oceanhorn: Monster of Uncharted Seas || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01007EF00011E000 || v0 || None || Gamecard Front: LA-H-AAAAA-{region} Back: AAAAA13A000 || The Legend of Zelda: Breath of the Wild || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01007EF00011E800 || v262144 (0.4.0.0) || || || The Legend of Zelda: Breath of the Wild || ALL || Update &lt;br /&gt;
|-&lt;br /&gt;
| 0100849000BDA000 || v0 || || || I Am Setsuna || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100849000BDA800 || v65536 (0.1.0.0) || || || I Am Setsuna || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 010085300314E000 || v0 || || || Kamiko || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010085500130A000 || v0 || || || LEGO® CITY Undercover || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010085500130A800 || v131072 (0.2.0.0) || || || LEGO® CITY Undercover || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100882001380000 || v0 || || || Romance of the Three Kingdoms XIII || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100882001380800 || v131072 (0.2.0.0) || || || Romance of the Three Kingdoms XIII || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01008A9001DC2000 || v0 || || || ACA NeoGeo Shock Troopers || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 01008A9001DC2800 || v65536 (0.1.0.0) || || || ACA NeoGeo Shock Troopers || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01008D1001512000 || v0 || || || Cars 3: Driven to Win || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01008D1001512800 || v65536 (0.1.0.0) || || || Cars 3: Driven to Win || USA || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100902001014000 || v0 || || || Othello || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100930002EAA000 || v0 || || || Dragon Quest Heroes 1 &amp;amp; 2 || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01009400030D6000 || v0 || || || Seiken Legend Collection || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01009510001CA000 || v0 || || || FAST RMX || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01009510001CA800 || v131072 (0.2.0.0) || || || FAST RMX || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01009B500007C000 || v0 || Gamecard: [[2.1.0]] || || ARMS || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01009D4001DC4000 || v0 || || || ACA NeoGeo World Heroes Perfect || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 01009D4001DC4800 || v65536 (0.1.0.0) || || || ACA NeoGeo World Heroes Perfect || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100A6300150C000 || v0 || || || Wonder Boy: The Dragon&#039;s Trap || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100A76002B46000 || v0 || || || ACA NeoGeo Alpha Mission II || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100A7F002830000 || v0 || || || VOEZ || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100A7F002830800 || v65536 (0.1.0.0) || || || VOEZ || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100A8C001DCE000 || v0 || || || ACA NeoGeo NAM-1975 || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100A8C001DCE800 || v65536 (0.1.0.0) || || || ACA NeoGeo NAM-1975 || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100AE0003424000 || v0 || || || Shantae: Half-Genie Hero || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100AED003A60000 || v0 || || || Plantera Garden Life DX Edition || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100B18001D8E000 || v0 || || || Little Inferno || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100B18001D8E800 || v131072 (0.2.0.0) || || || Little Inferno || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100B42001DB4000 || v0 || || || ACA NeoGeo The King of Fighters &#039;98 || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100B42001DB4800 || v65536 (0.1.0.0) || || || ACA NeoGeo The King of Fighters &#039;98 || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100B7D0022EE000 || v0 || || || Cave Story+ for Nintendo Switch || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100BA8001DC6000 || v0 || || || ACA NeoGeo Metal Slug 3 || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100BA8001DC6800 || v65536 (0.1.0.0) || || || ACA NeoGeo Metal Slug 3 || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100BBF0027EC000 || v0 || || || ULTRA STREET FIGHTER II: The Final Challengers || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100BBF0027EC800 || v65536 (0.1.0.0) || || || ULTRA STREET FIGHTER II: The Final Challengers || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100C0F0020E8000 || v0 || || || Snake Pass || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100C0F0020E8800 || v65536 (0.1.0.0) || || || Snake Pass || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100C220040C0000 || v0 || || || Mr. Shifty || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100C3F000BD8000 || v0 || || || Everyone Party! Spelunker || JPN || Demo&lt;br /&gt;
|-&lt;br /&gt;
| 0100C5E003B40000 || v0 || None || || ARMS Global Testpunch || ALL || Timed Demo&lt;br /&gt;
|-&lt;br /&gt;
| 0100C5E003B40800 || v65536 (0.1.0.0) || None || || ARMS Global Testpunch || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100C86000B58000 || v0 || || || ULTRA STREET FIGHTER II: The Final Challengers || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100C86000B58800 || v65536 (0.1.0.0) || || || ULTRA STREET FIGHTER II: The Final Challengers || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100CB2001DB8000 || v0 || || || ACA NeoGeo Garou: Mark of the Wolves || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100CC80013D6000 || v0 || || || The JackBox Party Pack 3 || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100CCC0002E6000 || v0 || || || Skylanders Imaginators || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100CCC0002E6800 || v131072 (0.2.0.0) || || || Skylanders Imaginators || USA || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100CD3000BDC000 || v0 || || || Dragon Quest Heroes 1 &amp;amp; 2 || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100CD3000BDC800 || v196608 (0.3.0.0) || || || Dragon Quest Heroes 1 &amp;amp; 2 || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100CEF001DC0000 || v0 || || || ACA NeoGeo Waku Waku 7 || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100CEF001DC0800 || v65536 (0.1.0.0) || || || ACA NeoGeo Waku Waku 7 || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100D170038EA000 || v0 || || || ACA NeoGeo Sengoku || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100D87002EE0000 || v0 || || || Snipperclips - Cut it out, together! || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100D87002EE0800 || v0, v65536 (0.1.0.0) || || || Snipperclips - Cut it out, together! || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100DFC003398000 || v0 || || || ACA NeoGeo Blazing Star || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100E29001298000 || v0 || || Gamecard Front: LA-H-ABMKA-{region} Back: ABMKA09Y000 || Has-Been Heroes || ALL || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100E29001298800 || v131072 (0.2.0.0) || || || Has-Been Heroes || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100E5F0000C0000 || v0 || || || Disgaea 5 Complete || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100E5F0000C0800 || v131072 (0.2.0.0) || || || Disgaea 5 Complete || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100E67003A86000 || v0 || || Gamecard Front: LA-H-AACAC-{region} Back: AACAC41A000 || Disgaea 5 Complete || USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100EB2001DCC000 || v0 || || || ACA NeoGeo The King of Fighters &#039;94  || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100EBE002B3E000 || v0 || || || ACA NeoGeo Metal Slug || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100EE6002B48000 || v0 || || || ACA NeoGeo Fatal Fury || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 0100F0400351C000 || v0 || || || Astro Duel Deluxe || USA, EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100F0400351C800 || v65536 (0.1.0.0) || || || Astro Duel Deluxe || USA, EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100F12002FC8000 || v0 || || || Everyone Party! Spelunker || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100F3D001DEE000 || v0 || || || Puyo Puyo Tetris || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01002B6001364000 || || || || LEGO® CITY Undercover || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01002B6001364800 || || || || LEGO® CITY Undercover || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100AE9003FAC000 || || || || Touch Battle Tank SP || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100AE9003FAC800 || || || || Touch Battle Tank SP || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 010024D0032F2000 || || || || PHOTON³ (Photon Cube) || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 010024D0032F2800 || || || || PHOTON³ (Photon Cube) || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01007C2002B3C000 || || || || GoNNER || JPN, USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01007C2002B3C800 || || || || GoNNER || JPN, USA || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100737003190000 || || || || IMPLOSION || JPN, USA || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100737003190800 || || || || IMPLOSION || JPN, USA || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100737003190000 || || || || IMPLOSION || EUR || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100737003190800 || || || || IMPLOSION || EUR || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01004040033CE000 || || || NicoNico Video Sharing Application || niconico || JPN || Application&lt;br /&gt;
|-&lt;br /&gt;
| 01004040033CE800 || || || NicoNico Video Sharing Application || niconico || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 010019A0038FA000 || || || || ACA NeoGeo Fatal Fury SPECIAL || ALL || VC&lt;br /&gt;
|-&lt;br /&gt;
| 010019A0038FA800 || || || || ACA NeoGeo Fatal Fury SPECIAL || ALL || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01003C700009C000 || || || || Splatoon 2 || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 01003C700009C800 || || || || Splatoon 2 || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 0100C3700416A000 || || || || SUPER PING PONG TRICKSHOT || JPN || Game&lt;br /&gt;
|-&lt;br /&gt;
| 0100C3700416A800 || || || || SUPER PING PONG TRICKSHOT || JPN || Update&lt;br /&gt;
|-&lt;br /&gt;
| 01003BC0000A0000 || || || Gamecard Front: LA-H-AAB6B-USA || Splatoon 2 || USA || Game&lt;br /&gt;
|}&lt;br /&gt;
Game updates have the same titleID as the main application, except with bitmask 0x800 set.&lt;br /&gt;
&lt;br /&gt;
The following data was found in [[NS_Services|NS]](NUL-terminators removed):&lt;br /&gt;
 {tasks&amp;quot;:[{id&amp;quot;:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&amp;quot;,titles&amp;quot;:[{id&amp;quot;:0100c5e003b40000&amp;quot;,version&amp;quot;:0,type&amp;quot;:Application&amp;quot;},{id&amp;quot;:0100c5e003b40800&amp;quot;,version&amp;quot;:65536,type&amp;quot;:Patch&amp;quot;}],owner_application&amp;quot;:0100c5e003b40000&amp;quot;}],format_version&amp;quot;:1,last_modified&amp;quot;:1497023220,required_system_version&amp;quot;:0&amp;quot;}.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;xxx...&amp;quot; Is where lowercase hex is in the original data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=VersionList=&lt;br /&gt;
The following was parsed from data dumped on June 10, 2017. This is located after strings &amp;quot;nsaccache:/cache/lru_list.dat&amp;quot;, &amp;quot;nsaccache&amp;quot;, and &amp;quot;ns_appman&amp;quot; in memory. Format is similar to 3DS eShop VersionList: header is 0x20-bytes instead of 0x10(due to word size presumably). The structure of the title entries are still 0x10-bytes, with the unk field being used now. The unk field is presumably the minimum required title-version for this TID when non-zero, refusing to launch the app otherwise. That&#039;s only enforced when that version was already installed on the system at some point however. The order of the below titles is the same as what was in memory.&lt;br /&gt;
&lt;br /&gt;
 u64 titleID             version unk&lt;br /&gt;
 01000320000CC000 	0 	0&lt;br /&gt;
 0100704000B3A000 	0 	0&lt;br /&gt;
 01007EF00011E000 	0 	0&lt;br /&gt;
 01007EF00011E800 	262144 	262144&lt;br /&gt;
 0100D87002EE0000 	0 	0&lt;br /&gt;
 0100CD3000BDC000 	0 	0&lt;br /&gt;
 010053D0001BE000 	0 	0&lt;br /&gt;
 0100BCE000598800 	65536 	65536&lt;br /&gt;
 0100930002EAA000 	0 	0&lt;br /&gt;
 010053D0001BE800 	65536 	65536&lt;br /&gt;
 0100BCE000598000 	0 	0&lt;br /&gt;
 0100CD3000BDC800 	196608 	196608&lt;br /&gt;
 010021B002EEA000 	0 	0&lt;br /&gt;
 01007AD00013E800 	262144 	262144&lt;br /&gt;
 01001180021FA000 	0 	0&lt;br /&gt;
 0100225000FEE000 	0 	0&lt;br /&gt;
 01003D60012BE000 	0 	0&lt;br /&gt;
 010048D000BFC800 	131072 	131072&lt;br /&gt;
 01004C200100E000 	0 	0&lt;br /&gt;
 01004E90028A2000 	0 	0&lt;br /&gt;
 010057D0021E8000 	0 	0&lt;br /&gt;
 010065A00213C000 	0 	0&lt;br /&gt;
 01007AD00013E000 	0 	0&lt;br /&gt;
 0100849000BDA000 	0 	0&lt;br /&gt;
 01008A9001DC2000 	0 	0&lt;br /&gt;
 0100902001014000 	0 	0&lt;br /&gt;
 01009510001CA000 	0 	0&lt;br /&gt;
 01009510001CA800 	131072 	131072&lt;br /&gt;
 01009D4001DC4000 	0 	0&lt;br /&gt;
 0100A7F002830000 	0 	0&lt;br /&gt;
 0100B42001DB4000 	0 	0&lt;br /&gt;
 0100BA8001DC6000 	0 	0&lt;br /&gt;
 0100CCC0002E6800 	131072 	131072&lt;br /&gt;
 0100CEF001DC0000 	0 	0&lt;br /&gt;
 0100E5F0000C0000 	0 	0&lt;br /&gt;
 0100A8C001DCE000 	0 	0&lt;br /&gt;
 010021C000B6A000 	0 	0&lt;br /&gt;
 0100E29001298000 	0 	0&lt;br /&gt;
 010073C001D5E000 	0 	0&lt;br /&gt;
 010009E001D90000 	0 	0&lt;br /&gt;
 0100701001D92000 	0 	0&lt;br /&gt;
 0100B18001D8E000 	0 	0&lt;br /&gt;
 010000A00218E000 	0 	0&lt;br /&gt;
 01008A9001DC2800 	65536 	65536&lt;br /&gt;
 01009D4001DC4800 	65536 	65536&lt;br /&gt;
 0100A8C001DCE800 	65536 	65536&lt;br /&gt;
 0100B42001DB4800 	65536 	65536&lt;br /&gt;
 0100BA8001DC6800 	65536 	65536&lt;br /&gt;
 0100CEF001DC0800 	65536 	65536&lt;br /&gt;
 0100225000FEE800 	131072 	131072&lt;br /&gt;
 0100EB2001DCC000 	0 	0&lt;br /&gt;
 01003A30012C0000 	0 	0&lt;br /&gt;
 010021C000B6A800 	65536 	65536&lt;br /&gt;
 0100C0F0020E8000 	1 	0&lt;br /&gt;
 01002E70032E8000 	0 	0&lt;br /&gt;
 010085500130A000 	0 	0&lt;br /&gt;
 0100701001D92800 	131072 	65536&lt;br /&gt;
 0100B18001D8E800 	131072 	131072&lt;br /&gt;
 01004D10020F2000 	0 	0&lt;br /&gt;
 0100882001380800 	131072 	131072&lt;br /&gt;
 0100E29001298800 	131072 	131072&lt;br /&gt;
 0100EBE002B3E000 	0 	0&lt;br /&gt;
 0100882001380000 	0 	0&lt;br /&gt;
 01001180021FA800 	131072 	0&lt;br /&gt;
 010057D0021E8800 	131072 	131072&lt;br /&gt;
 0100C0F0020E8800 	65536 	65536&lt;br /&gt;
 01004D10020F2800 	131072 	131072&lt;br /&gt;
 01006740034F6000 	0 	0&lt;br /&gt;
 0100A76002B46000 	0 	0&lt;br /&gt;
 010085500130A800 	131072 	131072&lt;br /&gt;
 01003A30012C0800 	131072 	131072&lt;br /&gt;
 01004E90028A2800 	65536 	65536&lt;br /&gt;
 0100E5F0000C0800 	131072 	131072&lt;br /&gt;
 0100F12002FC8000 	0 	0&lt;br /&gt;
 010031F002B66000 	0 	0&lt;br /&gt;
 0100CC80013D6000 	0 	0&lt;br /&gt;
 0100F3D001DEE000 	0 	0&lt;br /&gt;
 01002E70032E8800 	65536 	65536&lt;br /&gt;
 0100D87002EE0800 	65536 	0&lt;br /&gt;
 01000DC003740000 	0 	0&lt;br /&gt;
 0100849000BDA800 	65536 	65536&lt;br /&gt;
 010047F001DBC000 	0 	0&lt;br /&gt;
 01004B10031BE000 	0 	0&lt;br /&gt;
 01006A5003698000 	0 	0&lt;br /&gt;
 010085300314E000 	0 	0&lt;br /&gt;
 0100A6300150C000 	0 	0&lt;br /&gt;
 0100152000022000 	0 	0&lt;br /&gt;
 0100EE6002B48000 	0 	0&lt;br /&gt;
 010065A00213C800 	65536 	65536&lt;br /&gt;
 0100C3F000BD8000 	0 	0&lt;br /&gt;
 01004B1001D22000 	0 	0&lt;br /&gt;
 01007330027EE000 	0 	0&lt;br /&gt;
 01003A5001DBA000 	0 	0&lt;br /&gt;
 0100404002F52000 	0 	0&lt;br /&gt;
 01003D60012BE800 	65536 	65536&lt;br /&gt;
 0100DFC003398000 	0 	0&lt;br /&gt;
 01005700031AE000 	0 	0&lt;br /&gt;
 01004B1001D22800 	65536 	65536&lt;br /&gt;
 010002900294A000 	0 	0&lt;br /&gt;
 010025B002E92000 	0 	0&lt;br /&gt;
 0100BBF0027EC000 	0 	0&lt;br /&gt;
 010009E001D90800 	65536 	0&lt;br /&gt;
 01006BD001E06000 	0 	0&lt;br /&gt;
 0100CB2001DB8000 	0 	0&lt;br /&gt;
 01001FA0034E2000 	0 	0&lt;br /&gt;
 01006BD001E06800 	196608 	196608&lt;br /&gt;
 01006F6002840000 	0 	0&lt;br /&gt;
 0100E67003A86000 	0 	0&lt;br /&gt;
 0100125002060000 	0 	0&lt;br /&gt;
 01002580038DE000 	0 	0&lt;br /&gt;
 01004F7003726000 	0 	0&lt;br /&gt;
 0100C5E003B40000 	0 	0&lt;br /&gt;
 0100152000022800 	65536 	65536&lt;br /&gt;
 0100B7D0022EE000 	0 	0&lt;br /&gt;
 0100583001DCA000 	0 	0&lt;br /&gt;
 0100F0400351C000 	0 	0&lt;br /&gt;
 01009B500007C000 	0 	0&lt;br /&gt;
 01005700031AE800 	65536 	65536&lt;br /&gt;
 01004B3004062000 	0 	0&lt;br /&gt;
 0100C220040C0000 	0 	0&lt;br /&gt;
 0100BBF0027EC800 	65536 	65536&lt;br /&gt;
 0100C86000B58000 	0 	0&lt;br /&gt;
 0100C86000B58800 	65536 	65536&lt;br /&gt;
 01007330027EE800 	65536 	0&lt;br /&gt;
 01008D1001512000 	0 	0&lt;br /&gt;
 0100F0400351C800 	65536 	65536&lt;br /&gt;
 01000D10038E6000 	0 	0&lt;br /&gt;
 0100AE0003424000 	0 	0&lt;br /&gt;
 010043F004126000 	0 	0&lt;br /&gt;
 01009400030D6000 	0 	0&lt;br /&gt;
 0100A7F002830800 	65536 	65536&lt;br /&gt;
 0100C5E003B40800 	65536 	65536&lt;br /&gt;
 0100744001588800 	65536 	65536&lt;br /&gt;
 010035B00412A000 	0 	0&lt;br /&gt;
 01004DE001DC8000 	0 	0&lt;br /&gt;
 0100AED003A60000 	0 	0&lt;br /&gt;
 0100D170038EA000 	0 	0&lt;br /&gt;
 01008D1001512800 	65536 	0&lt;br /&gt;
 010031F002B66800 	65536 	0&lt;br /&gt;
 01000E2003FA0000 	0 	0&lt;/div&gt;</summary>
		<author><name>OgniK</name></author>
	</entry>
</feed>