NPDM: Difference between revisions
No edit summary |
|||
| (27 intermediate revisions by 7 users not shown) | |||
| Line 9: | Line 9: | ||
| 0x0 | | 0x0 | ||
| 0x80 | | 0x80 | ||
| [[# | | [[#Meta|Meta]] | ||
|- | |- | ||
| 0x80 | | 0x80 | ||
| | | Variable | ||
| [[# | | [[#Acid|Acid]] | ||
|- | |- | ||
| | | Variable | ||
| | | Variable | ||
| [[# | | [[#Aci|Aci]] | ||
|} | |} | ||
= | = Meta = | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
| Line 29: | Line 29: | ||
| 0x0 | | 0x0 | ||
| 0x4 | | 0x4 | ||
| | | Magic ("META") | ||
|- | |- | ||
| 0x4 | | 0x4 | ||
| 0x4 | |||
| [9.0.0+] SignatureKeyGeneration | |||
|- | |||
| 0x8 | | 0x8 | ||
| 0x4 | |||
| Reserved | | Reserved | ||
|- | |- | ||
| Line 81: | Line 85: | ||
| 0x70 | | 0x70 | ||
| 0x4 | | 0x4 | ||
| [[# | | [[#Aci|AciOffset]] | ||
|- | |- | ||
| 0x74 | | 0x74 | ||
| 0x4 | | 0x4 | ||
| [[# | | [[#Aci|AciSize]] | ||
|- | |- | ||
| 0x78 | | 0x78 | ||
| 0x4 | | 0x4 | ||
| [[# | | [[#Acid|AcidOffset]] | ||
|- | |- | ||
| 0x7C | | 0x7C | ||
| 0x4 | | 0x4 | ||
| [[# | | [[#Acid|AcidSize]] | ||
|} | |} | ||
| Line 106: | Line 110: | ||
|- | |- | ||
| 1-3 | | 1-3 | ||
| ProcessAddressSpace | | [[#ProcessAddressSpace|ProcessAddressSpace]] | ||
|- | |- | ||
| 4 | | 4 | ||
| OptimizeMemoryAllocation | | [7.0.0+] OptimizeMemoryAllocation | ||
|- | |||
| 5 | |||
| [11.0.0+] DisableDeviceAddressSpaceMerge | |||
|- | |||
| 6 | |||
| [18.0.0+] EnableAliasRegionExtraSize | |||
|- | |||
| 7 | |||
| [19.0.0-19.0.1] PreventCodeReads | |||
|} | |||
=== ProcessAddressSpace === | |||
{| class="wikitable" border="1" | |||
|- | |||
! Value | |||
! Description | |||
|- | |||
| 0 | |||
| AddressSpace32Bit | |||
|- | |||
| 1 | |||
| AddressSpace64BitOld | |||
|- | |||
| 2 | |||
| AddressSpace32BitNoReserved | |||
|- | |||
| 3 | |||
| AddressSpace64Bit | |||
|} | |} | ||
| Line 116: | Line 148: | ||
== SystemResourceSize == | == SystemResourceSize == | ||
This | When this is non-zero, the kernel reserves this amount of memory and dynamically uses it as needed for page table pages, KMemoryBlocks, and KBlockInfos. When this is zero, the process uses global shared heaps for these. | ||
This enables a process to sacrifice some of the memory available to it in order to have higher limits on these resources, thus enabling the use of SvcMapPhysicalMemory. | |||
Maximum size as is 0x1FE00000. | |||
== Version == | == Version == | ||
| Line 122: | Line 158: | ||
[8.1.0+] Now set to 1 for certain titles. | [8.1.0+] Now set to 1 for certain titles. | ||
[9.0.0+] Now set to a proper version field for all titles. | |||
== MainThreadStackSize == | == MainThreadStackSize == | ||
Must be aligned to 0x1000. | Must be aligned to 0x1000. If zero, kernel will start the process's initial thread with sp=0. | ||
= | = Acid = | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
| Line 145: | Line 181: | ||
| 0x200 | | 0x200 | ||
| 0x4 | | 0x4 | ||
| | | Magic ("ACID") | ||
|- | |- | ||
| 0x204 | | 0x204 | ||
| Line 152: | Line 188: | ||
|- | |- | ||
| 0x208 | | 0x208 | ||
| | | 0x1 | ||
| [9.0.0+] Version | |||
|- | |||
| 0x209 | |||
| 0x1 | |||
| [14.0.0+] | |||
|- | |||
| 0x20A | |||
| 0x2 | |||
| Reserved | | Reserved | ||
|- | |- | ||
| Line 169: | Line 213: | ||
| 0x220 | | 0x220 | ||
| 0x4 | | 0x4 | ||
| [[#FsAccessControl| | | [[#FsAccessControl|FacOffset]] | ||
|- | |- | ||
| 0x224 | | 0x224 | ||
| 0x4 | | 0x4 | ||
| [[#FsAccessControl| | | [[#FsAccessControl|FacSize]] | ||
|- | |- | ||
| 0x228 | | 0x228 | ||
| 0x4 | | 0x4 | ||
| [[#SrvAccessControl| | | [[#SrvAccessControl|SacOffset]] | ||
|- | |- | ||
| 0x22C | | 0x22C | ||
| 0x4 | | 0x4 | ||
| [[#SrvAccessControl| | | [[#SrvAccessControl|SacSize]] | ||
|- | |- | ||
| 0x230 | | 0x230 | ||
| 0x4 | | 0x4 | ||
| [[#KernelCapability| | | [[#KernelCapability|KcOffset]] | ||
|- | |- | ||
| 0x234 | | 0x234 | ||
| 0x4 | | 0x4 | ||
| [[#KernelCapability| | | [[#KernelCapability|KcSize]] | ||
|- | |- | ||
| 0x238 | | 0x238 | ||
| Line 208: | Line 252: | ||
| UnqualifiedApproval | | UnqualifiedApproval | ||
|- | |- | ||
| 2- | | 2-5 | ||
| [5.0.0+ ] MemoryRegion | | [5.0.0+] [[#MemoryRegion|MemoryRegion]] | ||
|- | |||
| 6 | |||
| Unused? | |||
|- | |||
| 7 | |||
| [21.0.0+] LoadBrowserCoreDll | |||
|} | |} | ||
MemoryRegion is set to Application for "starter" and NonSecureSystem for "nvservices". | MemoryRegion is set to Application for "starter" and NonSecureSystem for "nvservices". | ||
= | When LoadBrowserCoreDll flag is set, an additional NPDM + NSOs (wkc0-wkc9) will be loaded from program id 010000000000085D (not present on retail). | ||
=== MemoryRegion === | |||
{| class="wikitable" border="1" | |||
|- | |||
! Value | |||
! Description | |||
|- | |||
| 0 | |||
| Application | |||
|- | |||
| 1 | |||
| Applet | |||
|- | |||
| 2 | |||
| SecureSystem | |||
|- | |||
| 3 | |||
| NonSecureSystem | |||
|} | |||
= Aci = | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
| Line 223: | Line 294: | ||
| 0x0 | | 0x0 | ||
| 0x4 | | 0x4 | ||
| | | Magic ("ACI0") | ||
|- | |- | ||
| 0x4 | | 0x4 | ||
| Line 239: | Line 310: | ||
| 0x20 | | 0x20 | ||
| 0x4 | | 0x4 | ||
| [[#FsAccessControl| | | [[#FsAccessControl|FacOffset]] | ||
|- | |- | ||
| 0x24 | | 0x24 | ||
| 0x4 | | 0x4 | ||
| [[#FsAccessControl| | | [[#FsAccessControl|FacSize]] | ||
|- | |- | ||
| 0x28 | | 0x28 | ||
| 0x4 | | 0x4 | ||
| [[#SrvAccessControl| | | [[#SrvAccessControl|SacOffset]] | ||
|- | |- | ||
| 0x2C | | 0x2C | ||
| 0x4 | | 0x4 | ||
| [[#SrvAccessControl| | | [[#SrvAccessControl|SacSize]] | ||
|- | |- | ||
| 0x30 | | 0x30 | ||
| 0x4 | | 0x4 | ||
| [[#KernelCapability| | | [[#KernelCapability|KcOffset]] | ||
|- | |- | ||
| 0x34 | | 0x34 | ||
| 0x4 | | 0x4 | ||
| [[#KernelCapability| | | [[#KernelCapability|KcSize]] | ||
|- | |- | ||
| 0x38 | | 0x38 | ||
| Line 267: | Line 338: | ||
= FsAccessControl = | = FsAccessControl = | ||
For [[# | For [[#Acid|Acid]] this is a simple descriptor as follows: | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
| Line 279: | Line 350: | ||
|- | |- | ||
| 0x1 | | 0x1 | ||
| 0x1 | |||
| [5.0.0+] ContentOwnerIdCount | |||
|- | |||
| 0x2 | |||
| 0x1 | |||
| [5.0.0+] SaveDataOwnerIdCount | |||
|- | |||
| 0x3 | | 0x3 | ||
| 0x1 | |||
| Padding | | Padding | ||
|- | |- | ||
| Line 287: | Line 366: | ||
|- | |- | ||
| 0xC | | 0xC | ||
| | | 0x8 | ||
| | | ContentOwnerIdMin | ||
|- | |||
| 0x14 | |||
| 0x8 | |||
| ContentOwnerIdMax | |||
|- | |||
| 0x1C | |||
| 0x8 | |||
| SaveDataOwnerIdMin | |||
|- | |||
| 0x24 | |||
| 0x8 | |||
| SaveDataOwnerIdMax | |||
|- | |||
| 0x2C | |||
| 0x8 * ContentOwnerIdCount | |||
| [5.0.0+] ContentOwnerIds | |||
|- | |||
| Variable | |||
| 0x8 * SaveDataOwnerIdCount | |||
| [5.0.0+] SaveDataOwnerIds | |||
|} | |} | ||
For [[# | For [[#Aci|Aci]] this embeds data as follows: | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
| Line 328: | Line 427: | ||
| 0x1C | | 0x1C | ||
| 0x4 | | 0x4 | ||
| (Optional) | | (Optional) ContentOwnerIdCount | ||
|- | |- | ||
| 0x1C | | 0x1C | ||
| 0x8 * | | 0x8 * ContentOwnerIdCount | ||
| | | ContentOwnerIds | ||
|- | |- | ||
| Variable | | Variable | ||
| 0x4 | | 0x4 | ||
| | | SaveDataOwnerIdCount | ||
|- | |- | ||
| Variable | | Variable | ||
| 0x1 * | | 0x1 * SaveDataOwnerIdCount | ||
| | | Accessibilities (1=Read, 2=Write, 3=ReadWrite) | ||
|- | |- | ||
| Variable (padded to nearest 4 bytes) | | Variable (padded to nearest 4 bytes) | ||
| 0x8 * | | 0x8 * SaveDataOwnerIdCount | ||
| | | SaveDataOwnerIds | ||
|} | |} | ||
| Line 351: | Line 450: | ||
|- | |- | ||
! Bits | ! Bits | ||
! Description | ! Description | ||
|- | |- | ||
| 0 | | 0 | ||
| ApplicationInfo | | ApplicationInfo (MountContent* is accessible when set) | ||
|- | |- | ||
| 1 | | 1 | ||
| BootModeControl | | BootModeControl | ||
|- | |- | ||
| 2 | | 2 | ||
| Calibration | | Calibration | ||
|- | |- | ||
| 3 | | 3 | ||
| SystemSaveData | | SystemSaveData | ||
|- | |- | ||
| 4 | | 4 | ||
| GameCard | | GameCard | ||
|- | |- | ||
| 5 | | 5 | ||
| SaveDataBackUp | | SaveDataBackUp | ||
|- | |- | ||
| 6 | | 6 | ||
| SaveDataManagement | | SaveDataManagement | ||
|- | |- | ||
| 7 | | 7 | ||
| BisAllRaw | | BisAllRaw | ||
|- | |- | ||
| 8 | | 8 | ||
| GameCardRaw | | GameCardRaw | ||
|- | |- | ||
| 9 | | 9 | ||
| GameCardPrivate | | GameCardPrivate | ||
|- | |- | ||
| 10 | | 10 | ||
| SetTime | | SetTime | ||
|- | |- | ||
| 11 | | 11 | ||
| ContentManager | | ContentManager | ||
|- | |- | ||
| 12 | | 12 | ||
| ImageManager | | ImageManager | ||
|- | |- | ||
| 13 | | 13 | ||
| CreateSaveData | | CreateSaveData | ||
|- | |- | ||
| 14 | | 14 | ||
| SystemSaveDataManagement | | SystemSaveDataManagement | ||
|- | |- | ||
| 15 | | 15 | ||
| BisFileSystem | | BisFileSystem | ||
|- | |- | ||
| 16 | | 16 | ||
| SystemUpdate | | SystemUpdate | ||
|- | |- | ||
| 17 | | 17 | ||
| SaveDataMeta | | SaveDataMeta | ||
|- | |- | ||
| 18 | | 18 | ||
| DeviceSaveData | | DeviceSaveData | ||
|- | |- | ||
| 19 | | 19 | ||
| SettingsControl | | SettingsControl | ||
|- | |- | ||
| 20 | | 20 | ||
| SystemData | | SystemData | ||
|- | |- | ||
| 21 | | 21 | ||
| SdCard | | SdCard | ||
|- | |- | ||
| 22 | | 22 | ||
| Host | | Host | ||
|- | |- | ||
| 23 | | 23 | ||
| FillBis | | FillBis | ||
|- | |- | ||
| 24 | | 24 | ||
| CorruptSaveData | | CorruptSaveData | ||
|- | |- | ||
| 25 | | 25 | ||
| SaveDataForDebug | | SaveDataForDebug | ||
|- | |- | ||
| 26 | | 26 | ||
| FormatSdCard | | FormatSdCard | ||
|- | |- | ||
| 27 | | 27 | ||
| GetRightsId | | GetRightsId | ||
|- | |- | ||
| 28 | | 28 | ||
| RegisterExternalKey | | RegisterExternalKey | ||
|- | |- | ||
| 29 | | 29 | ||
| RegisterUpdatePartition | | RegisterUpdatePartition | ||
|- | |- | ||
| 30 | | 30 | ||
| SaveDataTransfer | | SaveDataTransfer | ||
|- | |- | ||
| 31 | | 31 | ||
| DeviceDetection | | DeviceDetection | ||
|- | |- | ||
| 32 | | 32 | ||
| AccessFailureResolution | | AccessFailureResolution | ||
|- | |- | ||
| 33 | | 33 | ||
| SaveDataTransferVersion2 | | SaveDataTransferVersion2 | ||
|- | |- | ||
| 34 | | 34 | ||
| RegisterProgramIndexMapInfo | | RegisterProgramIndexMapInfo | ||
|- | |- | ||
| 35 | | 35 | ||
| CreateOwnSaveData | | CreateOwnSaveData | ||
|- | |- | ||
| 36-61 | | 36 | ||
| MoveCacheStorage | |||
|- | |||
| 37 | |||
| DeviceTreeBlob | |||
|- | |||
| 38 | |||
| NotifyErrorContextServiceReady | |||
|- | |||
| 39 | |||
| CalibrationSystemData | |||
|- | |||
| 40 | |||
| CalibrationLog | |||
|- | |||
| 41 | |||
| StorageSecure | |||
|- | |||
| 42 | |||
| StorageControl | |||
|- | |||
| 43 | |||
| GameCardReport | |||
|- | |||
| 44 | |||
| MarkBeforeEraseBis | |||
|- | |||
| 45 | |||
| HtmlViewer | |||
|- | |||
| 46 | |||
| ApplicationSaveDataBackUp | |||
|- | |||
| 47-61 | |||
| Reserved | | Reserved | ||
|- | |- | ||
| 62 | | 62 | ||
| Debug | | Debug (ignored on non-DebugMode, see [[SPL_services#GetConfig|here]]) | ||
|- | |- | ||
| 63 | | 63 | ||
| FullPermission | | FullPermission (ignored on non-DebugMode, all [[Filesystem_services#Permissions|permission types]] which check a bitmask have this bit set) | ||
|} | |} | ||
| Line 586: | Line 678: | ||
| All ones | | All ones | ||
| | | | ||
| | | Invalid | ||
|} | |} | ||
| Line 624: | Line 716: | ||
== MemoryMap == | == MemoryMap == | ||
MemoryMap entries are stored in pairs. The first pair will contain BeginAddress and PermissionType, while the second pair will contain Size and MappingType. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
| Line 630: | Line 723: | ||
|- | |- | ||
| 7-30 | | 7-30 | ||
| BeginAddress | | BeginAddress | ||
|- | |- | ||
| 31 | | 31 | ||
| | | PermissionType (0=RW, 1=RO) | ||
|} | |} | ||
{| class="wikitable" border="1" | |||
|- | |||
! Bits | |||
! Description | |||
|- | |||
| 7-26 | |||
| Size | |||
|- | |||
| 27-30 | |||
| Reserved | |||
|- | |||
| 31 | |||
| MappingType (0=Io, 1=Static) | |||
|} | |||
=== Restrictions === | === Restrictions === | ||
| Line 672: | Line 778: | ||
|- | |- | ||
| 11-16 | | 11-16 | ||
| RegionType0 | | RegionType0 (0 = NoMapping, 1 = KernelTraceBuffer, 2 = OnMemoryBootImage, 3 = DTB) | ||
|- | |- | ||
| 17 | | 17 | ||
| Line 678: | Line 784: | ||
|- | |- | ||
| 18-23 | | 18-23 | ||
| RegionType1 | | RegionType1 (0 = NoMapping, 1 = KernelTraceBuffer, 2 = OnMemoryBootImage, 3 = DTB) | ||
|- | |- | ||
| 24 | | 24 | ||
| Line 684: | Line 790: | ||
|- | |- | ||
| 25-30 | | 25-30 | ||
| RegionType2 | | RegionType2 (0 = NoMapping, 1 = KernelTraceBuffer, 2 = OnMemoryBootImage, 3 = DTB) | ||
|- | |- | ||
| 31 | | 31 | ||
| RegionIsReadOnly2 | | RegionIsReadOnly2 | ||
|} | |} | ||
== EnableInterrupts == | == EnableInterrupts == | ||
| Line 732: | Line 836: | ||
|} | |} | ||
This is | This encodes the intended kernel version for the program. | ||
The kernel requires that the intended version is >= the minimum supported version (3.0 for all released kernels), and <= the current version. | |||
Kernel version is derived from/equivalent to SDK version: | |||
* Kernel Major = SDK Major + 4 | |||
* Kernel Minor = SDK Minor | |||
=== Versions === | === Versions === | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! Firmware || Kernel Version || | ! Firmware || Kernel Version || Corresponding SDK Version | ||
|- | |||
| 1.0.0 || 5.0 || 1.0.0.0 | |||
|- | |||
| 2.0.0 || 6.1 || 2.1.0.0 | |||
|- | |||
| 3.0.0 || 7.4 || 3.4.0.0 | |||
|- | |- | ||
| | | 3.0.2 || 7.4 || 3.4.0.0 | ||
|- | |- | ||
| | | 5.0.0 || 9.3 || 5.3.0.0 | ||
|- | |- | ||
| | | 10.0.0 || 14.4 || 10.4.0.0 | ||
|- | |- | ||
| | | 11.0.0 || 15.4 || 11.4.0.0 | ||
|- | |- | ||
| | | 11.0.1 || 15.4 || 11.4.0.0 | ||
|} | |} | ||
| Line 770: | Line 886: | ||
|- | |- | ||
| 18 | | 18 | ||
| ForceDebug | | [19.0.0+] ForceDebugProd ([1.0.0-18.1.0] ForceDebug) | ||
|- | |||
| 19 | |||
| [19.0.0+] ForceDebug | |||
|} | |} | ||