Changes

Jump to navigation Jump to search
10,009 bytes added ,  22:54, 6 May 2017
Undo revision 18301 by Neobrain (talk)
Line 1: Line 1: −
== Overview ==
+
This page documents the format of the '''NCCH Extended Header''', or '''exheader''' for short.
This page documents the format of the '''NCCH Extended Header''' (''exheader'' for short).
     −
The exheader, has two sections:
+
The exheader has two sections:
* The actual exheader data, containing System Control Info and Access Control Info,
+
 
* And a signed copy of NCCH HDR public key, and exheader Access Control Info. (This version of the Access Control Info is used as limitation to the actual Access Control Info)
+
* The actual exheader data, containing System Control Info (SCI) and Access Control Info (ACI);
 +
* A signed copy of NCCH HDR public key, and exheader ACI. This version of the ACI is used as limitation to the actual ACI.
    
== Main Structure ==
 
== Main Structure ==
 
All values are little endian unless otherwise specified.
 
All values are little endian unless otherwise specified.
 +
 +
See also: [https://github.com/profi200/Project_CTR/blob/master/ctrtool/exheader.h]
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Offset
+
! Offset
! Size
+
! Size
! Description
+
! Description
 
|-
 
|-
| 0x0
+
| <code>0x0</code>
| 0x200
+
| <code>0x200</code>
| System Control Info
+
| SCI
 
|-
 
|-
| 0x200
+
| <code>0x200</code>
| 0x200
+
| <code>0x200</code>
| Access Control Info
+
| ACI
 
|-
 
|-
| 0x400
+
| <code>0x400</code>
| 0x100
+
| <code>0x100</code>
| AccessDesc Signature (RSA-2048-SHA256)
+
| <code>AccessDesc</code> signature (RSA-2048-SHA256)
 
|-
 
|-
| 0x500
+
| <code>0x500</code>
| 0x100
+
| <code>0x100</code>
| NCCH Hdr RSA-2048 Public Key
+
| NCCH HDR RSA-2048 public key
 
|-
 
|-
| 0x600
+
| <code>0x600</code>
| 0x200
+
| <code>0x200</code>
| Access Control Info (For limitation of first Access Control Info)
+
| ACI (for limitation of first ACI)
 
|}
 
|}
   −
The AccessDesc Signature covers the ''NCCH Hdr Public Key'' and second ''Access Control Info''. The AccessDesc public key is initialised by the bootrom.
+
The <code>AccessDesc</code> signature covers the NCCH HDR public key and second ACI. The <code>AccessDesc</code> public key is initialised by the boot ROM.
 +
 
 +
When loading the exheader, [[FIRM|Process9]] compares the exheader data with the data in the <code>AccessDesc</code> (note that not everything is compared here). When these don't match, an error is returned. The Process9 code handling this validation was updated with [[6.0.0-11|v6.0]]; the only change in this function seems to be the check for the "Ideal processor" field.
    
== System Control Info ==
 
== System Control Info ==
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Offset
+
! Offset
! Size
+
! Size
! Description
+
! Description
 
|-
 
|-
| 0x0
+
| <code>0x0</code>
| 0x8
+
| <code>0x8</code>
| Application Title
+
| Application title (default is "CtrApp")
 
|-
 
|-
| 0x8
+
| <code>0x8</code>
| 0x5
+
| <code>0x5</code>
| Reserved
+
| Reserved
 
|-
 
|-
| 0xD
+
| <code>0xD</code>
| 0x1
+
| <code>0x1</code>
| Flag (Bit0: CompressExefsCode, Bit1: SDApplication)
+
| Flag (bit 0: <code>CompressExefsCode</code>, bit 1: <code>SDApplication</code>)
 
|-
 
|-
| 0xE
+
| <code>0xE</code>
| 0x2
+
| <code>0x2</code>
| Remaster Version
+
| Remaster version
 
|-
 
|-
| 0x10
+
| <code>0x10</code>
| 0xC
+
| <code>0xC</code>
| Text Code Set Info
+
| Text code set info
 
|-
 
|-
| 0x1C
+
| <code>0x1C</code>
| 0x4
+
| <code>0x4</code>
| Stack Size
+
| Stack size
 
|-
 
|-
| 0x20
+
| <code>0x20</code>
| 0xC
+
| <code>0xC</code>
| ReadOnly Code Set Info
+
| Read-only code set info
 
|-
 
|-
| 0x2C
+
| <code>0x2C</code>
| 0x4
+
| <code>0x4</code>
| Reserved
+
| Reserved
 
|-
 
|-
| 0x30
+
| <code>0x30</code>
| 0xC
+
| <code>0xC</code>
| Data Code Set Info
+
| Data code set info
 
|-
 
|-
| 0x3C
+
| <code>0x3C</code>
| 0x4
+
| <code>0x4</code>
| BSS Size
+
| BSS size
 
|-
 
|-
| 0x40
+
| <code>0x40</code>
| 0x180 (48*8)
+
| <code>0x180</code> (<code>48*8</code>)
| Dependency Module (Program ID) List
+
| Dependency [[Title list#00040130 - System Modules|module]] (program ID) list
 
|-
 
|-
| 0x1C0
+
| <code>0x1C0</code>
| 0x40
+
| <code>0x40</code>
| SystemInfo
+
| <code>SystemInfo</code>
 
|}
 
|}
 +
 +
Most of these fields are used in [[LOADER:LoadProcess]].
    
=== Code Set Info ===
 
=== Code Set Info ===
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Offset
+
! Offset
! Size
+
! Size
! Description
+
! Description
 
|-
 
|-
| 0x0
+
| <code>0x0</code>
| 0x4
+
| <code>4</code>
| Address
+
| Address
 
|-
 
|-
| 0x4
+
| <code>0x4</code>
| 0x4
+
| <code>4</code>
| Max Number of Pages
+
| Physical region size (in page-multiples)
 
|-
 
|-
| 0x8
+
| <code>0x8</code>
| 0x4
+
| <code>4</code>
| Size
+
| Size (in bytes)
 
|}
 
|}
   Line 117: Line 123:  
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Offset
+
! Offset
! Size
+
! Size
! Description
+
! Description
 
|-
 
|-
| 0x0
+
| <code>0x0</code>
| 0x8
+
| <code>0x8</code>
| SaveData Size
+
| <code>SaveData</code> Size
 
|-
 
|-
| 0x8
+
| <code>0x8</code>
| 0x8
+
| <code>0x8</code>
| Jump ID
+
| Jump ID
 
|-
 
|-
| 0x10
+
| <code>0x10</code>
| 0x30
+
| <code>0x30</code>
| Reserved
+
| Reserved
 
|}
 
|}
   Line 137: Line 143:  
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Offset
+
! Offset
! Size
+
! Size
! Description
+
! Description
 
|-
 
|-
| 0x0
+
| <code>0x0</code>
| 0x170
+
| <code>0x170</code>
| ARM11 Local System Capabilities
+
| [[#ARM11 Local System Capabilities|ARM11 local system capabilities]]
 
|-
 
|-
| 0x170
+
| <code>0x170</code>
| 0x80
+
| <code>0x80</code>
| ARM11 Kernel Capabilities
+
| [[#ARM11 Kernel Capabilities|ARM11 kernel capabilities]]
 
|-
 
|-
| 0x1F0
+
| <code>0x1F0</code>
| 0x10
+
| <code>0x10</code>
| ARM9 Access Control
+
| [[#ARM9 Access Control|ARM9 access control]]
 
|}
 
|}
   Line 157: Line 163:  
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Offset
+
! Offset
! Size
+
! Size
! Description
+
! Description
 +
|-
 +
| <code>0x0</code>
 +
| <code>0x8</code>
 +
| Program ID
 +
|-
 +
| <code>0x8</code>
 +
| <code>0x4</code>
 +
| Core version (The Title ID low of the required [[FIRM]])
 +
|-
 +
| <code>0xC</code>
 +
| <code>0x2</code>
 +
| [[#Flag1|Flag1]] and [[#Flag2|Flag2]] (both implemented starting from [[8.0.0-18]]).
 +
|-
 +
| <code>0xE</code>
 +
| <code>0x1</code>
 +
| [[#Flag0|Flag0]]
 +
|-
 +
| <code>0xF</code>
 +
| <code>0x1</code>
 +
| Priority
 +
|-
 +
| <code>0x10</code>
 +
| <code>0x20</code> (<code>16*2</code>)
 +
| Resource limit descriptors. The first byte here controls the maximum allowed [[PMApp:SetAppResourceLimit|<code>CpuTime</code>]].
 +
|-
 +
| <code>0x30</code>
 +
| <code>0x20</code>
 +
| [[#Storage Info|Storage info]]
 +
|-
 +
| <code>0x50</code>
 +
| <code>0x100</code> (<code>32*8</code>)
 +
| [[#Service Access Control|Service access control]]
 +
|-
 +
| <code>0x150</code>
 +
| <code>0x10</code> (<code>2*8</code>)
 +
| Extended service access control, support for this was implemented with [[9.3.0-21|9.3.0-X]].
 +
|-
 +
| <code>0x160</code>
 +
| <code>0xF</code>
 +
| Reserved
 +
|-
 +
| <code>0x16F</code>
 +
| <code>0x1</code>
 +
| Resource limit category. (0 = <code>APPLICATION</code>, 1 = <code>SYS_APPLET</code>, 2 = <code>LIB_APPLET</code>, 3 = <code>OTHER</code> (sysmodules running under the BASE memregion))
 +
|}
 +
 
 +
==== Flag0 ====
 +
{| class="wikitable" border="1"
 +
|-
 +
! Bits
 +
! Description
 +
|-
 +
| <code>0-1</code>
 +
| Ideal processor
 +
|-
 +
| <code>2-3</code>
 +
| Affinity mask
 +
|-
 +
| <code>4-7</code>
 +
| Old3DS system mode
 +
|}
 +
 
 +
===== Old3DS System Mode =====
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value
 +
! Description
 
|-
 
|-
| 0x0
+
| <code>0</code>
| 0x8
+
| <code>Prod</code> (64MB of usable application memory)
|  Program ID
   
|-
 
|-
| 0x8
+
| <code>1</code>
| 0x4
+
| <code>Undefined</code> (unusable)
|  Core Version (The Unique ID of the required FIRM)
   
|-
 
|-
| 0xC
+
| <code>2</code>
| 0x2
+
| <code>Dev1</code> (96MB of usable application memory)
| Reserved
+
|-
 +
| <code>3</code>
 +
| <code>Dev2</code> (80MB of usable application memory)
 +
|-
 +
| <code>4</code>
 +
| <code>Dev3</code> (72MB of usable application memory)
 +
|-
 +
| <code>5</code>
 +
| <code>Dev4</code> (32MB of usable application memory)
 +
|-
 +
| <code>6-7</code>
 +
| <code>Undefined</code> Same as <code>Prod</code>?
 +
|}
 +
 
 +
In the exheader data, the ideal processor field is a bit-index, while in the <code>AccessDesc</code> the ideal processor field is a bitmask. When the bit specified by the exheader field is not set in the <code>AccessDesc</code> field, an error is returned.
 +
 
 +
<pre>if((1 << exheaderval) & accessdescval == 0) return error</pre>
 +
 
 +
During a FIRM-launch when a <code>TitleInfo</code> structure was specified, the field at offset [[FIRM#FIRM_Launch_Parameters|0x400]] in the FIRM-launch parameters is set to the SystemMode of the specified title, however in some cases other values are written there. With [[8.0.0-18]] NS will now check the output of [[PTM|PTMSYSM]] command <code>0x040A0000</code>, when the output is non-zero and a certain NS state field is value-zero, the following is executed otherwise this is skipped. With that check passed on [[8.0.0-18]], NS will then check (<code>Flag2 & 0xF</code>). When that is <code>value2</code>, the output value (used for the FIRM-launcher parameter field mentioned above) is set to <code>value7</code>. Otherwise, when that value is non-zero, the output value is set to 6.
 +
 
 +
==== Flag1 ====
 +
{| class="wikitable" border="1"
 
|-
 
|-
|  0xE
+
! Bits
|  0x1
+
! Description
|  Flag0
   
|-
 
|-
| 0xF
+
| <code>0</code>
| 0x1
+
| <code>EnableL2Cache</code> (Unknown what this actually does, New3DS-only presumably)
|  Priority
   
|-
 
|-
| 0x10
+
| <code>1</code>
| 0x20 (16*2)
+
| <code>cpuspeed_804MHz</code> (Default "cpuspeed" when not set)
|  Resource Limit Descriptors
   
|-
 
|-
| 0x30
+
| <code>2-7</code>
| 0x20
+
| Unused
| Storage Info
+
|}
 +
 
 +
In order for the exheader to have any of the above new bits set, the <code>AccessDesc</code> must have the corresponding bit set, otherwise the invalid-exheader error is returned.
 +
 
 +
Homebrew which runs under a title which has the above <code>cpuspeed</code> flag set, runs much faster on New3DS. It's unknown how exactly the system handles these flags.
 +
 
 +
When launching titles / perhaps other things with [[APT]], [[NS]] uses [[PTMSYSM:ConfigureNew3DSCPU]] with data which originally came from these flags; NS does this regardless of what the running 3DS system is. However, due to a bug(?) in NS the value sent to that command is always either 0x0 or 0x3. When calculating that value, the code only ever uses the cpuspeed field, not the cache field: code to actually load and check the value of the cache field appears to be missing.
 +
 
 +
==== Flag2 ====
 +
{| class="wikitable" border="1"
 
|-
 
|-
|  0x50
+
! Bit
|  0x100 (32*8)
+
! Description
|  Service Access Control
   
|-
 
|-
| 0x150
+
| <code>0-3</code>
| 0x1F
+
| New3DS system mode
|  Reserved
   
|-
 
|-
| 0x16F
+
| <code>4-7</code>
| 0x1
+
| Unused
|  Resource Limit Category. (0 = APPLICATION, 1 = SYS_APPLET, 2 = LIB_APPLET, 3 = OTHER)
   
|}
 
|}
 +
 +
===== New3DS System Mode =====
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value
 +
! Description
 +
|-
 +
| <code>0</code>
 +
| <code>Legacy</code> (use Old3DS system mode)
 +
|-
 +
| <code>1</code>
 +
| <code>Prod</code> (124MB of usable application memory)
 +
|-
 +
| <code>2</code>
 +
| <code>Dev1</code> (178MB of usable application memory)
 +
|-
 +
| <code>3</code>
 +
| <code>Dev2</code> (124MB of usable application memory)
 +
|-
 +
| <code>4-7</code>
 +
| <code>Undefined</code> Same as <code>Prod</code>?
 +
|}
 +
 +
When in <code>Legacy</code> mode, the actual memory layout is the same as in <code>New3DS Prod</code>, except the available application memory as reported to the application is reduced to the Old3DS size.
 +
 +
The exheader value for the New3DS system mode value must be ≤ to the <code>AccessDesc</code> value, otherwise the invalid-exheader error is returned.
    
==== Storage Info ====
 
==== Storage Info ====
 +
Used in [[FSReg:Register]].
 +
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Offset
+
! Offset
! Size
+
! Size
! Description
+
! Description
 
|-
 
|-
| 0x0
+
| <code>0x0</code>
| 0x8
+
| <code>8</code>
| Extdata ID
+
| Extdata ID
 
|-
 
|-
| 0x8
+
| <code>0x8</code>
| 0x8
+
| <code>8</code>
| System Save Data Ids
+
| System savedata IDs
 
|-
 
|-
| 0x10
+
| <code>0x10</code>
| 0x8
+
| <code>8</code>
| Storage Accessable Unique Ids
+
| Storage accessible unique IDs
 
|-
 
|-
| 0x18
+
| <code>0x18</code>
| 0x7
+
| <code>7</code>
| File System Access Info
+
| Filesystem access info
 
|-
 
|-
| 0x1F
+
| <code>0x1F</code>
| 0x1
+
| <code>1</code>
| Other Attributes
+
| Other attributes
 
|}
 
|}
   Line 233: Line 356:  
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Bit
+
! Bit and bitmask
! Description
+
! Description
 +
|-
 +
| <code>0</code>, <code>0x1</code>
 +
| Category system application
 
|-
 
|-
| 0
+
| <code>1</code>, <code>0x2</code>
| Category System Application
+
| Category hardware check
 
|-
 
|-
| 1
+
| <code>2</code>, <code>0x4</code>
| Category Hardware Check
+
| Category filesystem tool
 
|-
 
|-
| 2
+
| <code>3</code>, <code>0x8</code>
| Category File System Tool
+
| Debug
 
|-
 
|-
| 3
+
| <code>4</code>, <code>0x10</code>
| Debug
+
| TWL card backup
 
|-
 
|-
| 4
+
| <code>5</code>, <code>0x20</code>
| TWL Card Backup
+
| TWL NAND data
 
|-
 
|-
| 5
+
| <code>6</code>, <code>0x40</code>
| TWL Nand Data
+
| BOSS
 
|-
 
|-
| 6
+
| <code>7</code>, <code>0x80</code>
| BOSS
+
| [[FS:OpenArchive|<code>sdmc:/</code>]]
 
|-
 
|-
| 7
+
| <code>8</code>, <code>0x100</code>
| [[FS:OpenArchive|sdmc:/]]
+
| Core
 
|-
 
|-
| 8
+
| <code>9</code>, <code>0x200</code>
| Core
+
| [[Flash Filesystem|<code>nand:/ro/</code>]] (Read Only)
 
|-
 
|-
| 9
+
| <code>10</code>, <code>0x400</code>
| [[Flash Filesystem|nand:/ro/]] (Read Only)
+
| [[Flash Filesystem|<code>nand:/rw/</code>]]
 
|-
 
|-
| 10
+
| <code>11</code>, <code>0x800</code>
| [[Flash Filesystem|nand:/rw/]]
+
| [[Flash Filesystem|<code>nand:/ro/</code>]] (Write Access)
 
|-
 
|-
| 11
+
| <code>12</code>, <code>0x1000</code>
| [[Flash Filesystem|nand:/ro/]] (Write Access)
+
| Category system settings
 
|-
 
|-
| 12
+
| <code>13</code>, <code>0x2000</code>
| Category System Settings
+
| Cardboard
 
|-
 
|-
| 13
+
| <code>14</code>, <code>0x4000</code>
| Card Board
+
| Export/Import IVS
 
|-
 
|-
| 14
+
| <code>15</code>, <code>0x8000</code>
| Export Import IVS
+
| [[FS:OpenArchive|<code>sdmc:/</code>]] (Write-only)
 
|-
 
|-
| 15
+
| <code>16</code>, <code>0x10000</code>
| [[FS:OpenArchive|sdmc:/]] (Write-only)
+
| Switch cleanup (Introduced in [[3.0.0-5|3.0.0]]?)  
 
|-
 
|-
| 16
+
| <code>17</code>, <code>0x20000</code>
| Switch Cleanup (Introduced in [[3.0.0-5|3.0.0]]?)  
+
| Savedata move (Introduced in [[5.0.0-11|5.0.0]])  
 
|-
 
|-
| 17
+
| <code>18</code>, <code>0x40000</code>
| Save Data Move (Introduced in [[5.0.0-11|5.0.0]])  
+
| Shop (Introduced in [[5.0.0-11|5.0.0]])  
 
|-
 
|-
| 18
+
| <code>19</code>, <code>0x80000</code>
| Shop (Introduced in [[5.0.0-11|5.0.0]])  
+
| Shell (Introduced in [[5.0.0-11|5.0.0]])  
 
|-
 
|-
| 19
+
| <code>20</code>, <code>0x100000</code>
| Shell (Introduced in [[5.0.0-11|5.0.0]])  
+
| Category home menu (Introduced in [[6.0.0-11|6.0.0]])
 
|-
 
|-
| 20
+
| <code>21</code>, <code>0x200000</code>
| Category HomeMenu (Introduced in [[6.0.0-11|6.0.0]])
+
| Seed DB. Introduced in [[9.6.0-24|9.6.0-X]] [[FIRM]]. [[Home Menu]] has this bit set starting with [[9.6.0-24|9.6.0-X]].
 
|}
 
|}
   −
Other Attributes:
+
====Other Attributes====
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Bit
+
! Bit
! Description
+
! Description
 
|-
 
|-
| 0
+
| <code>0</code>
| Not use RomFS
+
| Not use ROMFS
 
|-
 
|-
| 1
+
| <code>1</code>
| Use Extended Save Data Access. When this is set, the ''Extdata ID'' and ''Storage Accessable Unique Ids'' regions are used to store a total of 6 ''Accessible Save Ids''. Introduced in [[6.0.0-11|6.0.0]].
+
| Use Extended savedata access.
 
|}
 
|}
 +
 +
When Bit1 is set, the "Extdata ID" and "Storage Accessable Unique IDs" regions are used to store a total of 6 "Accessible Save IDs". Introduced in [[6.0.0-11|6.0.0]].
 +
 +
==== Service Access Control ====
 +
This is the list of [[Services_API|services]] which the process is allowed to access, this is registered with the [[Services|services]] manager. Each service listed in the exheader must be listed in the <code>AccessDesc</code>, otherwise the invalid exheader error is returned. The order of the services for exheader/<code>AccessDesc</code> doesn't matter. The <code>AccessDesc</code> can list services which are not in the exheader, but normally the service-access-control data for exheader/<code>AccessDesc</code> are exactly the same.
 +
 +
This list is submitted to [[SRVPM:RegisterProcess]].
    
=== ARM11 Kernel Capabilities ===
 
=== ARM11 Kernel Capabilities ===
 +
The kernel capability descriptors are passed to [[SVC|svcCreateProcess]].
 +
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Offset
+
! Offset
! Size
+
! Size
! Description
+
! Description
 +
|-
 +
| <code>0x0</code>
 +
| <code>0x70</code> (<code>28*4</code>)
 +
| Descriptors
 +
|-
 +
| <code>0x70</code>
 +
| <code>0x10</code>
 +
| Reserved
 +
|}
 +
 
 +
There are different descriptor types, determined by the number of leading ones in the binary value representation of bits 20-31. The different types are laid out as follows:
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Pattern of bits 20-31
 +
! Type
 +
! Fields
 +
|-
 +
| <code>0b1110xxxxxxxx</code>
 +
| Interrupt info
 +
|
 +
|-
 +
| <code>0b11110xxxxxxx</code>
 +
| System call mask
 +
| Bits 24-26: System call mask table index; Bits 0-23: mask
 +
|-
 +
| <code>0b1111110xxxxx</code>
 +
| Kernel release version
 +
| Bits 8-15: Major version; Bits 0-7: Minor version
 +
|-
 +
| <code>0b11111110xxxx</code>
 +
| Handle table size
 +
| Bits 0-18: size
 +
|-
 +
| <code>0b111111110xxx</code>
 +
| [[#ARM11_Kernel_Flags|Kernel flags]]
 +
| See below
 +
|-
 +
| <code>0b11111111100x</code>
 +
| Map address range
 +
| Describes a memory mapping like the 0b111111111110 descriptor, but an entire range rather than a single page is mapped. Another 0b11111111100x descriptor must follow this one to denote the (exclusive) end of the address range to map.
 +
|-
 +
| <code>0b111111111110</code>
 +
| Map memory page
 +
| Bits 0-19: page index to map (virtual address >> 12; the physical address is determined per-page according to [[Memory layout]]); Bit 20: Map read-only (otherwise read-write)
 +
|}
 +
 
 +
==== ARM11 Kernel Flags ====
 +
{| class="wikitable" border="1"
 +
|-
 +
! Bit
 +
! Description
 +
|-
 +
| <code>0</code>
 +
| Allow debug
 +
|-
 +
| <code>1</code>
 +
| Force debug
 +
|-
 +
| <code>2</code>
 +
| Allow non-alphanum
 +
|-
 +
| <code>3</code>
 +
| Shared page writing
 +
|-
 +
| <code>4</code>
 +
| Privilege priority
 +
|-
 +
| <code>5</code>
 +
| Allow <code>main()</code> args
 +
|-
 +
| <code>6</code>
 +
| Shared device memory
 +
|-
 +
| <code>7</code>
 +
| Runnable on sleep
 +
|-
 +
| <code>8-11</code>
 +
| Memory type (1: application, 2: system, 3: base)
 
|-
 
|-
| 0x0
+
| <code>12</code>
| 0x70 (28*4)
+
| [[Memory_layout#NATIVE_FIRM.2FSAFE_MODE_FIRM_Userland_Memory|Special memory]]
| Descriptors
   
|-
 
|-
| 0x70
+
| <code>13</code>
| 0x10
+
| Process has access to CPU core 2 (New3DS only)
|  Reserved
   
|}
 
|}
   Line 332: Line 545:  
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Offset
+
! Offset
! Size
+
! Size
! Description
+
! Description
 
|-
 
|-
| 0x0
+
| <code>0x0</code>
| 0xF
+
| <code>15</code>
| Descriptors
+
| Descriptors
 
|-
 
|-
| 0xF
+
| <code>0xF</code>
| 0x1
+
| <code>1</code>
| ARM9 Descriptor Version
+
| ARM9 Descriptor Version. Originally this value had to be ≥ 2. Starting with [[9.3.0-21|9.3.0-X]] this value has to be either value 2 or value 3.
 
|}
 
|}
   Line 348: Line 561:  
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Bit
+
! Bit
! Description
+
! Description
 
|-
 
|-
| 0
+
| <code>0</code>
| Mount [[Flash Filesystem|nand:/]]
+
| Mount [[Flash Filesystem|<code>nand:/</code>]]
 
|-
 
|-
| 1
+
| <code>1</code>
| Mount [[Flash Filesystem|nand:/ro/]] (Write Access)
+
| Mount [[Flash Filesystem|<code>nand:/ro/</code>]] (Write Access)
 
|-
 
|-
| 2
+
| <code>2</code>
| Mount [[Flash Filesystem|twln:/]]
+
| Mount [[Flash Filesystem|<code>twln:/</code>]]
 
|-
 
|-
| 3
+
| <code>3</code>
| Mount [[Flash Filesystem|wnand:/]]
+
| Mount [[Flash Filesystem|<code>wnand:/</code>]]
 
|-
 
|-
| 4
+
| <code>4</code>
| Mount Card SPI
+
| Mount card SPI
 
|-
 
|-
| 5
+
| <code>5</code>
| Use SDIF3
+
| Use SDIF3
 
|-
 
|-
| 6
+
| <code>6</code>
| Create Seed
+
| Create seed
 
|-
 
|-
| 7
+
| <code>7</code>
| Use Card SPI
+
| Use card SPI
 
|-
 
|-
| 8
+
| <code>8</code>
| SD Application (Not checked)
+
| SD application (Not checked)
 
|-
 
|-
| 9
+
| <code>9</code>
| Mount [[SD Filesystem|sdmc:/]] (Write Access)
+
| Mount [[SD Filesystem|sdmc:/]] (Write Access)
 
|}
 
|}
110

edits

Navigation menu