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  | |||
|}  | |||