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 |