Changes

Jump to navigation Jump to search
2,943 bytes added ,  13:47, 20 August 2019
m
no edit summary
Line 1: Line 1: −
This is the Switch equivalent of 3DS exheader. This is the file with extension ".npdm" in {Switch ExeFS}. The size of this file varies.
+
This is the Switch equivalent of 3DS [https://www.3dbrew.org/wiki/NCCH/Extended_Header exheader]. This is the file with extension ".npdm" in {Switch ExeFS}. The size of this file varies.
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 29: Line 29:  
| 0x0
 
| 0x0
 
| 0x4
 
| 0x4
| Magic "META".
+
| Magicnum "META"
 
|-
 
|-
 
| 0x4
 
| 0x4
|
+
| 0x8
|
+
| Reserved
 +
|-
 +
| 0xC
 +
| 0x1
 +
| MMU flags (bit0 = use 64-bit instructions, bit1 = use 64-bit address space, bit2 = use 32-bit address space, bit3 = use 32-bit address space without reserved region, bit4 = optimize memory allocation?)
 +
|-
 +
| 0xD
 +
| 0x1
 +
| Reserved
 
|-
 
|-
 
| 0xE
 
| 0xE
| 1
+
| 0x1
| MainThreadPrio
+
| Main thread priority (0-63)
 
|-
 
|-
 
| 0xF
 
| 0xF
| 1
+
| 0x1
| DefaultCpuId
+
| Main thread core number
 
|-
 
|-
 
| 0x10
 
| 0x10
|
+
| 0x4
|
+
| Reserved
 +
|-
 +
| 0x14
 +
| 0x4
 +
| [3.0.0+] System resource (PersonalMmHeap) size (max size as of 5.x: 534773760)
 +
|-
 +
| 0x18
 +
| 0x4
 +
| Version (0 for all titles prior to [[8.1.0]], 1 for certain titles since).
 
|-
 
|-
 
| 0x1C
 
| 0x1C
| 4
+
| 0x4
| MainStackSize
+
| Main thread stack size (Should(?) be page-aligned. In non-nspwn scenarios, values of 0 can also rarely break in Horizon. This might be something auto-adapting or a security feature of some sort?)
 
|-
 
|-
 
| 0x20
 
| 0x20
| ?
+
| 0x10
| Title name
+
| Title name (usually/always "Application")
 +
|-
 +
| 0x30
 +
| 0x10
 +
| Product code (usually/always all zeroes)
 +
|-
 +
| 0x40
 +
| 0x30
 +
| Reserved
 
|-
 
|-
 
| 0x70
 
| 0x70
Line 79: Line 103:  
! Description
 
! Description
 
|-
 
|-
| 0
+
| 0x0
 
| 0x100
 
| 0x100
| RSA-2048 signature, seems to verify the data starting at 0x100 with the size field from 0x204.
+
| RSA-2048 signature over the data starting at 0x100 with the size field from 0x204
 
|-
 
|-
 
| 0x100
 
| 0x100
 
| 0x100
 
| 0x100
| RSA-2048 public key, seems to be used for the second [[NCA_Format|NCA]] signature.
+
| RSA-2048 public key for the second [[NCA_Format|NCA]] signature
 
|-
 
|-
 
| 0x200
 
| 0x200
 
| 0x4
 
| 0x4
| Magic "ACID".
+
| Magicnum "ACID"
 
|-
 
|-
 
| 0x204
 
| 0x204
 
| 0x4
 
| 0x4
| s32 Size field used with the above signature(?).
+
| Data size
 
|-
 
|-
 
| 0x208
 
| 0x208
 
| 0x4
 
| 0x4
| Zeroes
+
| Reserved
 
|-
 
|-
 
| 0x20C
 
| 0x20C
 
| 0x4
 
| 0x4
| Retail flag. Must be 1 on retail, on devunit 0 is also allowed.
+
| Flags (bit0 = ProductionFlag, bit1 = UnqualifiedApproval, [5.0.0+] bit2-3: PoolPartition? For applets set to 0b01, for sysmodules set to 0b10. Exceptions: "starter" is set to 0, "nvservices" is set to 3)
 
|-
 
|-
 
| 0x210
 
| 0x210
 
| 0x8
 
| 0x8
| Title id
+
| TitleIdRange_Min
 
|-
 
|-
 
| 0x218
 
| 0x218
 
| 0x8
 
| 0x8
| Title id again
+
| TitleIdRange_Max
 
|-
 
|-
 
| 0x220
 
| 0x220
Line 128: Line 152:  
|-
 
|-
 
| 0x230
 
| 0x230
| 4
+
| 0x4
 
| [[#Kernel Access Control]] offset
 
| [[#Kernel Access Control]] offset
 
|-
 
|-
 
| 0x234
 
| 0x234
| 4
+
| 0x4
 
| [[#Kernel Access Control]] size
 
| [[#Kernel Access Control]] size
 
|-
 
|-
 
| 0x238
 
| 0x238
 
| 0x8
 
| 0x8
| Padding
+
| Reserved
 
|}
 
|}
   Line 149: Line 173:  
| 0x0
 
| 0x0
 
| 0x4
 
| 0x4
| Magic "ACI0".
+
| Magicnum "ACI0"
 
|-
 
|-
 
| 0x4
 
| 0x4
 
| 0xC
 
| 0xC
| Zeroes
+
| Reserved
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x8
 
| 0x8
| Title id
+
| Title ID
 
|-
 
|-
 
| 0x18
 
| 0x18
 
| 0x8
 
| 0x8
| Padding
+
| Reserved
 
|-
 
|-
 
| 0x20
 
| 0x20
Line 180: Line 204:  
|-
 
|-
 
| 0x30
 
| 0x30
| 4
+
| 0x4
 
| [[#Kernel Access Control]] offset
 
| [[#Kernel Access Control]] offset
 
|-
 
|-
 
| 0x34
 
| 0x34
| 4
+
| 0x4
 
| [[#Kernel Access Control]] size
 
| [[#Kernel Access Control]] size
 
|-
 
|-
 
| 0x38
 
| 0x38
 
| 0x8
 
| 0x8
| Padding
+
| Reserved
 
|}
 
|}
    
= FS Access Header =
 
= FS Access Header =
   
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 202: Line 225:  
| 0x0
 
| 0x0
 
| 0x1
 
| 0x1
| Version? Always 1. Must be non-zero.
+
| Version (always 1, must be non-zero)
 
|-
 
|-
 
| 0x1
 
| 0x1
Line 214: Line 237:  
| 0xC
 
| 0xC
 
| 0x4
 
| 0x4
| Usually 0x1C
+
| Data Size (always 0x1C)
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x4
 
| 0x4
| Usually 0x0
+
| Size of Content Owner ID section.
 
|-
 
|-
 
| 0x14
 
| 0x14
 
| 0x4
 
| 0x4
| Usually 0x1C
+
| Data size (0x1C) plus Content Owner size
 
|-
 
|-
 
| 0x18
 
| 0x18
 
| 0x4
 
| 0x4
| Usually 0x0
+
| Size of Save Data owners section (for applications that wish to share save data?)
 +
|-
 +
| 0x1C
 +
| 0x4
 +
| (OPTIONAL) Amount of content owner id's
 +
|-
 +
| 0x1C
 +
| 0x8 * Content Owner ID's
 +
| Content owner ID's as uint64's.
 +
|-
 +
| VARIABLE
 +
| 0x4
 +
| Amount of save owner id's
 +
|-
 +
| VARIABLE
 +
| 0x1 * Save data owner accessibilities (?)
 +
| Sets flags for what save data owners can do with other applications save data (?)
 
|-
 
|-
 +
| VARIABLE (Pad to nearest 4 bytes)
 +
| 0x8 * Amount of save owner ID's
 +
| Save data owner ID's
 
|}
 
|}
    
= FS Access Control =
 
= FS Access Control =
   
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 240: Line 281:  
| 0x0
 
| 0x0
 
| 0x1
 
| 0x1
| Version? Always 1. Must be non-zero.
+
| Version (always 1, must be non-zero)
 
|-
 
|-
 
| 0x1
 
| 0x1
Line 252: Line 293:  
| 0xC
 
| 0xC
 
| 0x20
 
| 0x20
| Usually all zeroes for applications
+
| Reserved
 
|}
 
|}
   Line 259: Line 300:  
|-
 
|-
 
! Bit
 
! Bit
 +
! Name
 
! Description
 
! Description
 
|-
 
|-
 
| 0
 
| 0
 +
| ApplicationInfo
 
| MountContent* is accessible when set.
 
| MountContent* is accessible when set.
 
|-
 
|-
| 34
+
| 1
| Enables access to [[Filesystem_services|Bis]] partitionID 27 and 28?
+
| BootModeControl
 +
|
 +
|-
 +
| 2
 +
| Calibration
 +
|
 +
|-
 +
| 3
 +
| SystemSaveData
 +
|
 +
|-
 +
| 4
 +
| GameCard
 +
|
 +
|-
 +
| 5
 +
| SaveDataBackUp
 +
|
 +
|-
 +
| 6
 +
| SaveDataManagement
 +
|
 +
|-
 +
| 7
 +
| BisAllRaw
 +
|
 +
|-
 +
| 8
 +
| GameCardRaw
 +
|
 +
|-
 +
| 9
 +
| GameCardPrivate
 +
|
 +
|-
 +
| 10
 +
| SetTime
 +
|
 +
|-
 +
| 11
 +
| ContentManager
 +
|
 +
|-
 +
| 12
 +
| ImageManager
 +
|
 +
|-
 +
| 13
 +
| CreateSaveData
 +
|
 +
|-
 +
| 14
 +
| SystemSaveDataManagement
 +
|
 +
|-
 +
| 15
 +
| BisFileSystem
 +
|
 +
|-
 +
| 16
 +
| SystemUpdate
 +
|
 +
|-
 +
| 17
 +
| SaveDataMeta
 +
|
 +
|-
 +
| 18
 +
| DeviceSaveData
 +
|
 +
|-
 +
| 19
 +
| SettingsControl
 +
|
 +
|-
 +
| 20
 +
| SystemData
 +
|
 +
|-
 +
| 21
 +
| SdCard
 +
|
 +
|-
 +
| 22
 +
| Host
 +
|
 +
|-
 +
| 23
 +
| FillBis
 +
|
 +
|-
 +
| 24
 +
| CorruptSaveData
 +
|
 +
|-
 +
| 25
 +
| SaveDataForDebug
 +
|
 +
|-
 +
| 26
 +
| FormatSdCard
 +
|
 +
|-
 +
| 27
 +
| GetRightsId
 +
|
 +
|-
 +
| 28
 +
| RegisterExternalKey
 +
|
 +
|-
 +
| 29
 +
| RegisterUpdatePartition
 +
|
 +
|-
 +
| 30
 +
| SaveDataTransfer
 +
|
 +
|-
 +
| 31
 +
| DeviceDetection
 +
|
 +
|-
 +
| 32
 +
| AccessFailureResolution
 +
|
 +
|-
 +
| 33
 +
| SaveDataTransferVersion2
 +
|
 +
|-
 +
| 34-61
 +
| Reserved
 +
|
 +
|-
 +
| 62
 +
| Debug
 +
| See [[SPL_services#GetConfig|here]].
 
|-
 
|-
 
| 63
 
| 63
| Enables access to everything: all [[Filesystem_services#Permissions|permission-types]] which check a bitmask have this bit set.
+
| FullPermission
 +
| Enables access to everything: all [[Filesystem_services#Permissions|permission types]] which check a bitmask have this bit set.
 
|}
 
|}
  −
For bit62 in permissions, see [[SPL_services#GetConfig|here]].
      
Web-applets permissions:
 
Web-applets permissions:
Line 282: Line 461:  
   +1: {service-name without nul-terminator}
 
   +1: {service-name without nul-terminator}
   −
Bitmask 0x0F in control_byte is the {length of the service-name without nul-terminator} - 1.
+
Bitmask 0x07 in control_byte is the {length of the service-name without nul-terminator} - 1.
    
Bitmask 0x80 in control_byte means service is allowed to be registered.
 
Bitmask 0x80 in control_byte means service is allowed to be registered.
Line 316: Line 495:  
| Bit7
 
| Bit7
 
| MapNormalPage (RW)
 
| MapNormalPage (RW)
| Bits 7-31: Page
+
| Bits 8-31: Page
 
|-
 
|-
 
| <code>0bxxxx011111111111</code>
 
| <code>0bxxxx011111111111</code>
 
| Bit11
 
| Bit11
 
| InterruptPair
 
| InterruptPair
| Bits 12-21: Irq0, bits 20-31: Irq1, 0x3FF means empty.
+
| Bits 12-21: Irq0, bits 22-31: Irq1, 0x3FF means empty.
 
|-
 
|-
 
| <code>0bxx01111111111111</code>
 
| <code>0bxx01111111111111</code>
 
| Bit13
 
| Bit13
 
| ApplicationType
 
| ApplicationType
| Bit16-14: ApplicationType, bit16 ignored. Parsed by [[Process Manager services]].
+
| Bit16-14: ApplicationType (0=sysmodule, 1=application, 2=applet), bit16 ignored. Parsed by [[Process Manager services]]. Defaults to 0 if descriptor doesn't exist. Can only run 1 application at a time.
 
|-
 
|-
 
| <code>0bx011111111111111</code>
 
| <code>0bx011111111111111</code>
Line 350: Line 529:     
== Mapping restrictions ==
 
== Mapping restrictions ==
The physaddr range 0x80060000-0x81970FFF is not allowed to be mapped as IO.
+
The physaddr range 0x80060000-0x2000000000 is not allowed to be mapped as IO.
 +
The physaddr range 0x80000000-0x2000000000 is not allowed to be mapped as Normal.
   −
[2.0.0+] The range was changed into 0x80060000-0x81D3FFFF.
+
[2.0.0-4.1.0] The range for IO was changed into 0x80060000-0x81D3FFFF.
   −
The physaddr range 0x80000000-0x1000000000 is not allowed to be mapped as Normal.
+
[2.0.0-4.1.0] A blacklist was added for IO and Normal mappings:
 
  −
 
  −
[2.0.0+] A blacklist was added for IO and Normal mappings:
   
* 0x50040000-0x50060000 (ARM, Interrupt Controller)
 
* 0x50040000-0x50060000 (ARM, Interrupt Controller)
 
* 0x6000F000 (Exception Vectors)
 
* 0x6000F000 (Exception Vectors)
 
* 0x6001DC00-0x6001E000 (IPATCH)
 
* 0x6001DC00-0x6001E000 (IPATCH)
* 0x7000E000 (EMC0)
+
* 0x7000E000 (RTC/PMC)
 
* 0x70019000 (MC)
 
* 0x70019000 (MC)
 
* 0x7001C000 (MC0)
 
* 0x7001C000 (MC0)
 
* 0x7001D000 (MC1)
 
* 0x7001D000 (MC1)
 +
 +
[5.0.0+] For IO, this blacklist was abandoned and instead two range checks were added. For Normal mappings it is still applied
 +
 +
== Kernel versions ==
 +
{| class="wikitable" border="1"
 +
|-
 +
! Firmware || Kernel Version || Minimum Allowed
 +
|-
 +
| 1.0.0 || 5.0.0 || 3.0.0
 +
|-
 +
| 2.0.0 || 6.1.0 || 3.0.0
 +
|-
 +
| 3.0.0 || 7.4.0 || 3.0.0
 +
|-
 +
| 3.0.2 || 7.4.0 || 3.0.0
 +
|-
 +
| 5.0.0 || 9.3.0 || 3.0.0
 +
|}
 +
 +
Bit31-19: Major version</br>
 +
Bit18-15: Minor version</br>
 +
Bit14-0: Zeroes
23

edits

Navigation menu