NPDM: Difference between revisions
No edit summary |
No edit summary |
||
Line 9: | Line 9: | ||
| 0x0 | | 0x0 | ||
| 0x80 | | 0x80 | ||
| META | | [[#META|META]] | ||
|- | |- | ||
| 0x80 | | 0x80 | ||
| <Varies> | | <Varies> | ||
| ACID | | [[#ACID|ACID]] | ||
|- | |- | ||
| <See META> | | <See META> | ||
| <See META> | | <See META> | ||
| ACI0 | | [[#ACI0|ACI0]] | ||
|} | |} | ||
Line 37: | Line 37: | ||
| 0xC | | 0xC | ||
| 0x1 | | 0x1 | ||
| Flags | | [[#Flags]] | ||
|- | |- | ||
| 0xD | | 0xD | ||
Line 45: | Line 45: | ||
| 0xE | | 0xE | ||
| 0x1 | | 0x1 | ||
| MainThreadPriority | | [[#MainThreadPriority]] | ||
|- | |- | ||
| 0xF | | 0xF | ||
Line 57: | Line 57: | ||
| 0x14 | | 0x14 | ||
| 0x4 | | 0x4 | ||
| [3.0.0+] | | [3.0.0+] [[#SystemResourceSize]] | ||
|- | |- | ||
| 0x18 | | 0x18 | ||
| 0x4 | | 0x4 | ||
| | | [[#Version]] | ||
|- | |- | ||
| 0x1C | | 0x1C | ||
| 0x4 | | 0x4 | ||
| MainThreadStackSize | | [[#MainThreadStackSize]] | ||
|- | |- | ||
| 0x20 | | 0x20 | ||
| 0x10 | | 0x10 | ||
| | | Name (usually/always "Application") | ||
|- | |- | ||
| 0x30 | | 0x30 | ||
| 0x10 | | 0x10 | ||
| | | ProductCode (usually/always all zeroes) | ||
|- | |- | ||
| 0x40 | | 0x40 | ||
Line 81: | Line 81: | ||
| 0x70 | | 0x70 | ||
| 0x4 | | 0x4 | ||
| [[#ACI0]] | | [[#ACI0|AciOffset]] | ||
|- | |- | ||
| 0x74 | | 0x74 | ||
| 0x4 | | 0x4 | ||
| [[#ACI0]] | | [[#ACI0|AciSize]] | ||
|- | |- | ||
| 0x78 | | 0x78 | ||
| 0x4 | | 0x4 | ||
| [[#ACID]] | | [[#ACID|AcidOffset]] | ||
|- | |- | ||
| 0x7C | | 0x7C | ||
| 0x4 | | 0x4 | ||
| [[#ACID]] | | [[#ACID|AcidSize]] | ||
|} | |} | ||
== Flags == | |||
{| class="wikitable" border="1" | |||
|- | |||
! Bits | |||
! Description | |||
|- | |||
| 0 | |||
| Is64BitInstruction | |||
|- | |||
| 1-3 | |||
| ProcessAddressSpace (0x00 = AddressSpace32Bit, 0x01 = AddressSpace64BitOld, 0x02 = AddressSpace32BitNoReserved, 0x03 = AddressSpace64Bit) | |||
|- | |||
| 4 | |||
| OptimizeMemoryAllocation | |||
|} | |||
== MainThreadPriority == | |||
Ranges from 0 to 0x3F. | |||
== SystemResourceSize == | |||
This is the size of PersonalMmHeap. Maximum size as of 5.0.0 is 0x1FE00000. | |||
== Version == | |||
0 for all titles. | |||
[8.1.0+] Now set to 1 for certain titles. | |||
== MainThreadStackSize == | |||
Must be aligned to 0x1000. | |||
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? | |||
= ACID = | = ACID = | ||
Line 117: | Line 149: | ||
| 0x204 | | 0x204 | ||
| 0x4 | | 0x4 | ||
| | | Size | ||
|- | |- | ||
| 0x208 | | 0x208 | ||
Line 125: | Line 157: | ||
| 0x20C | | 0x20C | ||
| 0x4 | | 0x4 | ||
| Flags | | [[#Flags]] | ||
|- | |- | ||
| 0x210 | | 0x210 | ||
Line 137: | Line 169: | ||
| 0x220 | | 0x220 | ||
| 0x4 | | 0x4 | ||
| [[# | | [[#FsAccessControl|FsAccessControlOffset]] | ||
|- | |- | ||
| 0x224 | | 0x224 | ||
| 0x4 | | 0x4 | ||
| [[# | | [[#FsAccessControl|FsAccessControlSize]] | ||
|- | |- | ||
| 0x228 | | 0x228 | ||
| 0x4 | | 0x4 | ||
| [[# | | [[#SrvAccessControl|SrvAccessControlOffset]] | ||
|- | |- | ||
| 0x22C | | 0x22C | ||
| 0x4 | | 0x4 | ||
| [[# | | [[#SrvAccessControl|SrvAccessControlSize]] | ||
|- | |- | ||
| 0x230 | | 0x230 | ||
| 0x4 | | 0x4 | ||
| [[# | | [[#KernelCapability|KernelCapabilityOffset]] | ||
|- | |- | ||
| 0x234 | | 0x234 | ||
| 0x4 | | 0x4 | ||
| [[# | | [[#KernelCapability|KernelCapabilitySize]] | ||
|- | |- | ||
| 0x238 | | 0x238 | ||
Line 163: | Line 195: | ||
| Reserved | | Reserved | ||
|} | |} | ||
== Flags == | |||
{| class="wikitable" border="1" | |||
|- | |||
! Bits | |||
! Description | |||
|- | |||
| 0 | |||
| ProductionFlag | |||
|- | |||
| 1 | |||
| UnqualifiedApproval | |||
|- | |||
| 2-3 | |||
| [5.0.0+ ] MemoryRegion (0 = Application, 1 = Applet, 2 = SecureSystem, 3 = NonSecureSystem) | |||
|} | |||
MemoryRegion is set to Application for "starter" and NonSecureSystem for "nvservices". | |||
= ACI0 = | = ACI0 = | ||
Line 189: | Line 239: | ||
| 0x20 | | 0x20 | ||
| 0x4 | | 0x4 | ||
| [[# | | [[#FsAccessControl|FsAccessControlOffset]] | ||
|- | |- | ||
| 0x24 | | 0x24 | ||
| 0x4 | | 0x4 | ||
| [[# | | [[#FsAccessControl|FsAccessControlSize]] | ||
|- | |- | ||
| 0x28 | | 0x28 | ||
| 0x4 | | 0x4 | ||
| [[# | | [[#SrvAccessControl|SrvAccessControlOffset]] | ||
|- | |- | ||
| 0x2C | | 0x2C | ||
| 0x4 | | 0x4 | ||
| [[# | | [[#SrvAccessControl|SrvAccessControlSize]] | ||
|- | |- | ||
| 0x30 | | 0x30 | ||
| 0x4 | | 0x4 | ||
| [[# | | [[#KernelCapability|KernelCapabilityOffset]] | ||
|- | |- | ||
| 0x34 | | 0x34 | ||
| 0x4 | | 0x4 | ||
| [[# | | [[#KernelCapability|KernelCapabilitySize]] | ||
|- | |- | ||
| 0x38 | | 0x38 | ||
Line 216: | Line 266: | ||
|} | |} | ||
= | = FsAccessControl = | ||
For [[#ACID]] this is a simple descriptor as follows: | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 224: | Line 275: | ||
|- | |- | ||
| 0x0 | | 0x0 | ||
| 0x1 | |||
| Version (always 1, must be non-zero) | |||
|- | |||
| 0x1 | |||
| 0x3 | |||
| Padding | |||
|- | |||
| 0x4 | | 0x4 | ||
| 0x8 | |||
| [[#FsAccessFlag]] | |||
|- | |||
| 0xC | |||
| 0x20 | |||
| Reserved | |||
|} | |||
For [[#ACI0]] this embeds data as follows: | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 | |||
| 0x1 | |||
| Version (always 1, must be non-zero) | | Version (always 1, must be non-zero) | ||
|- | |||
| 0x1 | |||
| 0x3 | |||
| Padding | |||
|- | |- | ||
| 0x4 | | 0x4 | ||
| 0x8 | | 0x8 | ||
| | | [[#FsAccessFlag]] | ||
|- | |- | ||
| 0xC | | 0xC | ||
Line 268: | Line 347: | ||
|} | |} | ||
= | == FsAccessFlag == | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! | ! Bits | ||
! Name | ! Name | ||
! Description | ! Description | ||
Line 435: | Line 490: | ||
| | | | ||
|- | |- | ||
| 34-61 | | 34 | ||
| RegisterProgramIndexMapInfo | |||
| | |||
|- | |||
| 35 | |||
| CreateOwnSaveData | |||
| | |||
|- | |||
| 36-61 | |||
| Reserved | | Reserved | ||
| | | | ||
Line 447: | Line 510: | ||
| Enables access to everything: all [[Filesystem_services#Permissions|permission types]] which check a bitmask have this bit set. | | Enables access to everything: all [[Filesystem_services#Permissions|permission types]] which check a bitmask have this bit set. | ||
|} | |} | ||
Controls the [[Filesystem_services#Permissions|filesystem permissions]]. | |||
Web-applets permissions: | Web-applets permissions: | ||
Line 453: | Line 518: | ||
= Service Access Control = | = Service Access Control = | ||
{| class="wikitable" border="1" | |||
|- | |||
! Bits | |||
! Description | |||
|- | |||
| 0-2 | |||
| Size (length of the service-name without null-terminator minus 1) | |||
|- | |||
| 7 | |||
| IsServer (service is allowed to be registered) | |||
|- | |||
| Variable | |||
| Name | |||
|} | |||
This is a list of [[Services_API|service]]-name strings which the title has access to. | |||
The service name string starts after the first byte and supports the wildcard <code>*</code> character. | |||
= KernelCapability = | |||
These descriptors are identified by pattern 01..11 in low bits. | |||
= | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 470: | Line 544: | ||
! Pattern of lower bits | ! Pattern of lower bits | ||
! Lowest clear bitmask/bit | ! Lowest clear bitmask/bit | ||
! | ! Description | ||
|- | |- | ||
| <code>0bxxxxxxxxxxxx0111</code> | | <code>0bxxxxxxxxxxxx0111</code> | ||
| Bit3 | | Bit3 | ||
| ThreadInfo | | [[#ThreadInfo]] | ||
|- | |- | ||
| <code>0bxxxxxxxxxxx01111</code> | | <code>0bxxxxxxxxxxx01111</code> | ||
| Bit4 | | Bit4 | ||
| EnableSystemCalls | | [[#EnableSystemCalls]] | ||
|- | |- | ||
| <code>0bxxxxxxxxx0111111</code> | | <code>0bxxxxxxxxx0111111</code> | ||
| Bit6 | | Bit6 | ||
| MemoryMap | | [[#MemoryMap]] | ||
|- | |- | ||
| <code>0bxxxxxxxx01111111</code> | | <code>0bxxxxxxxx01111111</code> | ||
| Bit7 | | Bit7 | ||
| | | [[#IoMemoryMap]] | ||
|- | |- | ||
| <code>0bxxxxx01111111111</code> | | <code>0bxxxxx01111111111</code> | ||
| Bit10 | | Bit10 | ||
| [8.0.0+] MemoryRegionMap | | [8.0.0+] [[#MemoryRegionMap]] | ||
|- | |- | ||
| <code>0bxxxx011111111111</code> | | <code>0bxxxx011111111111</code> | ||
| Bit11 | | Bit11 | ||
| EnableInterrupts | | [[#EnableInterrupts]] | ||
|- | |- | ||
| <code>0bxx01111111111111</code> | | <code>0bxx01111111111111</code> | ||
| Bit13 | | Bit13 | ||
| | | [[#MiscParams]] | ||
|- | |- | ||
| <code>0bx011111111111111</code> | | <code>0bx011111111111111</code> | ||
| Bit14 | | Bit14 | ||
| KernelVersion | | [[#KernelVersion]] | ||
|- | |- | ||
| <code>0b0111111111111111</code> | | <code>0b0111111111111111</code> | ||
| Bit15 | | Bit15 | ||
| HandleTableSize | | [[#HandleTableSize]] | ||
|- | |- | ||
| <code>0b1111111111111111</code> | | <code>0b1111111111111111</code> | ||
| Bit16 | | Bit16 | ||
| MiscFlags | | [[#MiscFlags]] | ||
|- | |- | ||
| All ones | | All ones | ||
| | | | ||
| Ignored | | Ignored | ||
|} | |} | ||
== ThreadInfo == | |||
{| class="wikitable" border="1" | |||
|- | |||
! Bits | |||
! Description | |||
|- | |||
| 4-9 | |||
| LowestPriority | |||
|- | |||
| 10-15 | |||
| HighestPriority | |||
|- | |||
| 16-23 | |||
| MinCoreNumber | |||
|- | |||
| 24-31 | |||
| MaxCoreNumber | |||
|} | |||
== EnableSystemCalls == | |||
{| class="wikitable" border="1" | |||
|- | |||
! Bits | |||
! Description | |||
|- | |||
| 5-28 | |||
| Mask | |||
|- | |||
| 29-31 | |||
| SystemCallId | |||
|} | |||
== MemoryMap == | |||
{| class="wikitable" border="1" | |||
|- | |||
! Bits | |||
! Description | |||
|- | |||
| 7-30 | |||
| BeginAddress or Size | |||
|- | |||
| 31 | |||
| IsRw or IsIo | |||
|} | |||
MemoryMap entries are stored alternating between BeginAddress + IsRw and Size + IsIo. | |||
== | === Restrictions === | ||
The physaddr range 0x80060000-0x2000000000 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. | The physaddr range 0x80000000-0x2000000000 is not allowed to be mapped as Normal. | ||
Line 548: | Line 655: | ||
[5.0.0+] For IO, this blacklist was abandoned and instead two range checks were added. For Normal mappings it is still applied | [5.0.0+] For IO, this blacklist was abandoned and instead two range checks were added. For Normal mappings it is still applied | ||
== | == IoMemoryMap == | ||
{| class="wikitable" border="1" | |||
|- | |||
! Bits | |||
! Description | |||
|- | |||
| 8-31 | |||
| BeginAddress | |||
|} | |||
== MemoryRegionMap == | |||
{| class="wikitable" border="1" | |||
|- | |||
! Bits | |||
! Description | |||
|- | |||
| 11-16 | |||
| RegionType0 | |||
|- | |||
| 17 | |||
| RegionIsReadOnly0 | |||
|- | |||
| 18-23 | |||
| RegionType1 | |||
|- | |||
| 24 | |||
| RegionIsReadOnly1 | |||
|- | |||
| 25-30 | |||
| RegionType2 | |||
|- | |||
| 31 | |||
| RegionIsReadOnly2 | |||
|} | |||
MemoryRegionMap is supported by the kernel but not by [[Loader_services|Loader]]. Thus, only initial processes may possess this capability. | |||
== EnableInterrupts == | |||
{| class="wikitable" border="1" | |||
|- | |||
! Bits | |||
! Description | |||
|- | |||
| 12-21 | |||
| InterruptNumber0 | |||
|- | |||
| 22-31 | |||
| InterruptNumber1 | |||
|} | |||
0x3FF means empty. | |||
== MiscParams == | |||
{| class="wikitable" border="1" | |||
|- | |||
! Bits | |||
! Description | |||
|- | |||
| 14-16 | |||
| ProgramType (0 = System, 1 = Application, 2 = Applet) | |||
|} | |||
ProgramType is parsed by [[Process Manager services]]. Defaults to 0 if descriptor doesn't exist. Can only run 1 application at a time. | |||
== KernelVersion == | |||
{| class="wikitable" border="1" | |||
|- | |||
! Bits | |||
! Description | |||
|- | |||
| 15-18 | |||
| MinorVersion | |||
|- | |||
| 19-31 | |||
| MajorVersion | |||
|} | |||
This is compared with 0x80000, when less than an error is returned. This is equivalent to comparing the bits starting at bit15 with 0x10. This enforces a minimum required version, not a maximum. | |||
=== Versions === | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 564: | Line 750: | ||
|} | |} | ||
== HandleTableSize == | |||
{| class="wikitable" border="1" | |||
|- | |||
! Bits | |||
! Description | |||
|- | |||
| 16-25 | |||
| HandleTableSize | |||
|} | |||
== MiscFlags == | |||
{| class="wikitable" border="1" | |||
|- | |||
! Bits | |||
! Description | |||
|- | |||
| 17 | |||
| EnableDebug | |||
|- | |||
| 18 | |||
| ForceDebug | |||
|} |