<?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=Aerosoul</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=Aerosoul"/>
	<link rel="alternate" type="text/html" href="https://switchbrew.org/wiki/Special:Contributions/Aerosoul"/>
	<updated>2026-05-11T20:24:41Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=NPDM&amp;diff=1896</id>
		<title>NPDM</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=NPDM&amp;diff=1896"/>
		<updated>2017-08-03T14:15:01Z</updated>

		<summary type="html">&lt;p&gt;Aerosoul: /* META */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the Switch equivalent of 3DS 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;
| 0x8&lt;br /&gt;
| Reserved1&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 1&lt;br /&gt;
| Flags&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| 1&lt;br /&gt;
| UnusedData&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| 1&lt;br /&gt;
| MainThreadPriority&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| 1&lt;br /&gt;
| MainThreadCoreNumber&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x8&lt;br /&gt;
| Reserved2&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x4&lt;br /&gt;
| Version&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0x4&lt;br /&gt;
| MainThreadStackSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x10&lt;br /&gt;
| Title name&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 0x10&lt;br /&gt;
| ProductCode&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 0x30&lt;br /&gt;
| Reserved3&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;
| Title id&lt;br /&gt;
|-&lt;br /&gt;
| 0x218&lt;br /&gt;
| 0x8&lt;br /&gt;
| Title id again&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;
Looks like an old crappy version of ACID. It has the guessed version field 0 instead of 1.&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;
! Word&lt;br /&gt;
! Bit&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
|&lt;br /&gt;
| Version? Always 1.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| MountContent* is accessible when set.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| Enables access to [[Filesystem_services|Bis]] partitionID 27 and 28?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Web-applets access control:&lt;br /&gt;
* &amp;quot;LibAppletWeb&amp;quot; and &amp;quot;LibAppletOff&amp;quot; have same access control: word0 bit0 set, word1 bit0 and bit3 set, and word2 bit30 set.&lt;br /&gt;
* Rest of the web-applets: Same as above except word1 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;
| &lt;br /&gt;
| Kernel flags&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;
| &lt;br /&gt;
| Syscall mask&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;
| &lt;br /&gt;
| Map IO page (RW)&lt;br /&gt;
| Bits 7-31: Page&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxxxxxxxx01111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| Map IO range&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;0bxxxx011111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| Interrupt pair&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;0xxxx0111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0xxx01111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0xx011111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| bit14&lt;br /&gt;
| Kernel release version&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. The raw descriptor is also stored into {state}. This enforces a minimum required version, not a maximum.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x0111111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| bit15&lt;br /&gt;
|&lt;br /&gt;
|&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;
Only certain memory ranges are allowed to be mapped via these descriptors.&lt;/div&gt;</summary>
		<author><name>Aerosoul</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=NPDM&amp;diff=1895</id>
		<title>NPDM</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=NPDM&amp;diff=1895"/>
		<updated>2017-08-03T14:14:32Z</updated>

		<summary type="html">&lt;p&gt;Aerosoul: /* META */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the Switch equivalent of 3DS 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;
| 0x8&lt;br /&gt;
| Reserved1&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 1&lt;br /&gt;
| Flags&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| 1&lt;br /&gt;
| UnusedData&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| 1&lt;br /&gt;
| MainThreadPriority&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| 1&lt;br /&gt;
| MainThreadCoreNumber&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x8&lt;br /&gt;
| Reserved2&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x4&lt;br /&gt;
| Version&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0x4&lt;br /&gt;
| MainThreadStackSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x10&lt;br /&gt;
| Title name&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 0x10&lt;br /&gt;
| ProductCode&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 0x30&lt;br /&gt;
| Reserved3&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;
| Title id&lt;br /&gt;
|-&lt;br /&gt;
| 0x218&lt;br /&gt;
| 0x8&lt;br /&gt;
| Title id again&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;
Looks like an old crappy version of ACID. It has the guessed version field 0 instead of 1.&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;
! Word&lt;br /&gt;
! Bit&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
|&lt;br /&gt;
| Version? Always 1.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| MountContent* is accessible when set.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| Enables access to [[Filesystem_services|Bis]] partitionID 27 and 28?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Web-applets access control:&lt;br /&gt;
* &amp;quot;LibAppletWeb&amp;quot; and &amp;quot;LibAppletOff&amp;quot; have same access control: word0 bit0 set, word1 bit0 and bit3 set, and word2 bit30 set.&lt;br /&gt;
* Rest of the web-applets: Same as above except word1 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;
| &lt;br /&gt;
| Kernel flags&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;
| &lt;br /&gt;
| Syscall mask&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;
| &lt;br /&gt;
| Map IO page (RW)&lt;br /&gt;
| Bits 7-31: Page&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0bxxxxxxxx01111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| Map IO range&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;0bxxxx011111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| Interrupt pair&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;0xxxx0111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0xxx01111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0xx011111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| bit14&lt;br /&gt;
| Kernel release version&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. The raw descriptor is also stored into {state}. This enforces a minimum required version, not a maximum.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x0111111111111111&amp;lt;/code&amp;gt;&lt;br /&gt;
| bit15&lt;br /&gt;
|&lt;br /&gt;
|&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;
Only certain memory ranges are allowed to be mapped via these descriptors.&lt;/div&gt;</summary>
		<author><name>Aerosoul</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=NSO0&amp;diff=1894</id>
		<title>NSO0</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=NSO0&amp;diff=1894"/>
		<updated>2017-08-03T14:07:49Z</updated>

		<summary type="html">&lt;p&gt;Aerosoul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NSO is the main executable format.&lt;br /&gt;
&lt;br /&gt;
It starts with the &amp;quot;NSO&amp;quot; header and mainly describes .text, .rodata, and .data segments (like a short-form of ELF program headers):&lt;br /&gt;
&lt;br /&gt;
=== .rodata-relative extent ===&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;
| 4&lt;br /&gt;
| offset (relative to .rodata)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| size of region&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NSO Header ===&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;
| 4&lt;br /&gt;
| Magic &amp;quot;NSO0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| Version&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| Reserved1&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| Flags: TextCompress = 1, RoCompress = 2, DataCompress = 4, TextHash = 8, RoHash = 0x10, DataHash = 0x20&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| TextFileOffset&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| TextMemoryOffset&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| TextSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| ModuleNameOffset&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| RoFileOffset&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| RoMemoryOffset&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 4&lt;br /&gt;
| RoSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| ModuleNameSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| DataFileOffset&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| DataMemoryOffset&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| DataSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| BssSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 0x20&lt;br /&gt;
| Value of &amp;quot;build id&amp;quot; from ELF&#039;s GNU .note section. Contains variable sized digest, up to 32bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| 0x4&lt;br /&gt;
| TextFileSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| 0x4&lt;br /&gt;
| RoFileSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| 0x4&lt;br /&gt;
| DataFileSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x6c&lt;br /&gt;
| 0x24&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 8&lt;br /&gt;
| .rodata-relative extents of .dynstr&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 8&lt;br /&gt;
| .rodata-relative extents of .dynsym&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 0x20 * 3&lt;br /&gt;
| SHA256 hashes over the decompressed sections using the above byte-sizes: .text, .rodata, and .data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x100&lt;br /&gt;
|&lt;br /&gt;
| Compressed sections&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Most data in Switch binaries are standard ELF structures, however some are custom.&lt;br /&gt;
For example, the MOD header is essentially a replacement for a PT_DYNAMIC program header.&lt;br /&gt;
&lt;br /&gt;
=== MOD ===&lt;br /&gt;
All offsets are signed 32bit values relative to the magic field.&lt;br /&gt;
The 32bits at image base + 4 must point to the magic field.&lt;br /&gt;
The MOD structure is designed such that it can be placed at image base and point to itself.&lt;br /&gt;
The 2 fields preceding the magic field get copied around with the structure, even if it is relocated to somewhere besides the image base. If MOD is not located at image base, the value at offset 4 must still point to the MOD magic. In the case of .text being at image base, this implies that the first instruction can only be an unconditional branch over the offset literal.&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;
| 4&lt;br /&gt;
| zero padding&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| offset to magic. Always 8 (so it works when MOD is at image_base + 0).&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| magic &amp;quot;MOD0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| .dynamic offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| .bss start offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| .bss end offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| .eh_frame_hdr start offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| .eh_frame_hdr end offset&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| offset to runtime-generated module object. typically equal to .bss base.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Aerosoul</name></author>
	</entry>
</feed>