Changes

1,375 bytes added ,  22:16, 23 October 2024
no edit summary
Line 29: Line 29:  
| 0x0
 
| 0x0
 
| 0x4
 
| 0x4
| Magicnum "META"
+
| Magic ("META")
 
|-
 
|-
 
| 0x4
 
| 0x4
 +
| 0x4
 +
| [9.0.0+] SignatureKeyGeneration
 +
|-
 
| 0x8
 
| 0x8
 +
| 0x4
 
| Reserved
 
| Reserved
 
|-
 
|-
Line 109: Line 113:  
|-
 
|-
 
| 4
 
| 4
| OptimizeMemoryAllocation
+
| [7.0.0+] OptimizeMemoryAllocation
 +
|-
 +
| 5
 +
| [11.0.0+] DisableDeviceAddressSpaceMerge
 +
|-
 +
| 6
 +
| [18.0.0+] EnableAliasRegionExtraSize
 +
|-
 +
| 7
 +
| [19.0.0+] PreventCodeReads
 
|}
 
|}
   Line 116: Line 129:     
== SystemResourceSize ==
 
== SystemResourceSize ==
This is the size of PersonalMmHeap. Maximum size as of 5.0.0 is 0x1FE00000.
+
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 140:     
[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.
 
  −
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 145: Line 163:  
| 0x200
 
| 0x200
 
| 0x4
 
| 0x4
| Magicnum "ACID"
+
| Magic ("ACID")
 
|-
 
|-
 
| 0x204
 
| 0x204
Line 152: Line 170:  
|-
 
|-
 
| 0x208
 
| 0x208
| 0x4
+
| 0x1
 +
| [9.0.0+] Version
 +
|-
 +
| 0x209
 +
| 0x1
 +
| [14.0.0+]
 +
|-
 +
| 0x20A
 +
| 0x2
 
| Reserved
 
| Reserved
 
|-
 
|-
Line 169: Line 195:  
| 0x220
 
| 0x220
 
| 0x4
 
| 0x4
| [[#FsAccessControl|FsAccessControlOffset]]
+
| [[#FsAccessControl|FacOffset]]
 
|-
 
|-
 
| 0x224
 
| 0x224
 
| 0x4
 
| 0x4
| [[#FsAccessControl|FsAccessControlSize]]
+
| [[#FsAccessControl|FacSize]]
 
|-
 
|-
 
| 0x228
 
| 0x228
 
| 0x4
 
| 0x4
| [[#SrvAccessControl|SrvAccessControlOffset]]
+
| [[#SrvAccessControl|SacOffset]]
 
|-
 
|-
 
| 0x22C
 
| 0x22C
 
| 0x4
 
| 0x4
| [[#SrvAccessControl|SrvAccessControlSize]]
+
| [[#SrvAccessControl|SacSize]]
 
|-
 
|-
 
| 0x230
 
| 0x230
 
| 0x4
 
| 0x4
| [[#KernelCapability|KernelCapabilityOffset]]
+
| [[#KernelCapability|KcOffset]]
 
|-
 
|-
 
| 0x234
 
| 0x234
 
| 0x4
 
| 0x4
| [[#KernelCapability|KernelCapabilitySize]]
+
| [[#KernelCapability|KcSize]]
 
|-
 
|-
 
| 0x238
 
| 0x238
Line 208: Line 234:  
| UnqualifiedApproval
 
| UnqualifiedApproval
 
|-
 
|-
| 2-3
+
| 2-5
| [5.0.0+ ] MemoryRegion (0 = Application, 1 = Applet, 2 = SecureSystem, 3 = NonSecureSystem)
+
| [5.0.0+] MemoryRegion (0 = Application, 1 = Applet, 2 = SecureSystem, 3 = NonSecureSystem)
 
|}
 
|}
   Line 223: Line 249:  
| 0x0
 
| 0x0
 
| 0x4
 
| 0x4
| Magicnum "ACI0"
+
| Magic ("ACI0")
 
|-
 
|-
 
| 0x4
 
| 0x4
Line 239: Line 265:  
| 0x20
 
| 0x20
 
| 0x4
 
| 0x4
| [[#FsAccessControl|FsAccessControlOffset]]
+
| [[#FsAccessControl|FacOffset]]
 
|-
 
|-
 
| 0x24
 
| 0x24
 
| 0x4
 
| 0x4
| [[#FsAccessControl|FsAccessControlSize]]
+
| [[#FsAccessControl|FacSize]]
 
|-
 
|-
 
| 0x28
 
| 0x28
 
| 0x4
 
| 0x4
| [[#SrvAccessControl|SrvAccessControlOffset]]
+
| [[#SrvAccessControl|SacOffset]]
 
|-
 
|-
 
| 0x2C
 
| 0x2C
 
| 0x4
 
| 0x4
| [[#SrvAccessControl|SrvAccessControlSize]]
+
| [[#SrvAccessControl|SacSize]]
 
|-
 
|-
 
| 0x30
 
| 0x30
 
| 0x4
 
| 0x4
| [[#KernelCapability|KernelCapabilityOffset]]
+
| [[#KernelCapability|KcOffset]]
 
|-
 
|-
 
| 0x34
 
| 0x34
 
| 0x4
 
| 0x4
| [[#KernelCapability|KernelCapabilitySize]]
+
| [[#KernelCapability|KcSize]]
 
|-
 
|-
 
| 0x38
 
| 0x38
Line 279: Line 305:  
|-
 
|-
 
| 0x1
 
| 0x1
 +
| 0x1
 +
| [5.0.0+] ContentOwnerIdCount
 +
|-
 +
| 0x2
 +
| 0x1
 +
| [5.0.0+] SaveDataOwnerIdCount
 +
|-
 
| 0x3
 
| 0x3
 +
| 0x1
 
| Padding
 
| Padding
 
|-
 
|-
Line 287: Line 321:  
|-
 
|-
 
| 0xC
 
| 0xC
| 0x20
+
| 0x8
| Reserved
+
| ContentOwnerIdMin
 +
|-
 +
| 0x14
 +
| 0x8
 +
| ContentOwnerIdMax
 +
|-
 +
| 0x1C
 +
| 0x8
 +
| SaveDataOwnerIdMin
 +
|-
 +
| 0x24
 +
| 0x8
 +
| SaveDataOwnerIdMax
 +
|-
 +
| 0x2C
 +
| 0x8 * ContentOwnerIdCount
 +
| [5.0.0+] ContentOwnerIds
 +
|-
 +
| Variable
 +
| 0x8 * SaveDataOwnerIdCount
 +
| [5.0.0+] SaveDataOwnerIds
 
|}
 
|}
   Line 328: Line 382:  
| 0x1C
 
| 0x1C
 
| 0x4
 
| 0x4
| (Optional) Amount of content owner id's
+
| (Optional) ContentOwnerIdCount
 
|-
 
|-
 
| 0x1C
 
| 0x1C
| 0x8 * Content Owner ID's
+
| 0x8 * ContentOwnerIdCount
| Content owner ID's as uint64's.
+
| ContentOwnerIds
 
|-
 
|-
 
| Variable
 
| Variable
 
| 0x4
 
| 0x4
| Amount of save owner id's
+
| SaveDataOwnerIdCount
 
|-
 
|-
 
| Variable
 
| Variable
| 0x1 * Save data owner accessibilities (?)
+
| 0x1 * SaveDataOwnerIdCount
| Sets flags for what save data owners can do with other applications save data (?)
+
| Accessibilities (1=Read, 2=Write, 3=ReadWrite)
 
|-
 
|-
 
| Variable (padded to nearest 4 bytes)
 
| Variable (padded to nearest 4 bytes)
| 0x8 * Amount of save owner ID's
+
| 0x8 * SaveDataOwnerIdCount
| Save data owner ID's
+
| SaveDataOwnerIds
 
|}
 
|}
   Line 498: Line 552:  
|  
 
|  
 
|-
 
|-
| 36-61
+
| 36
 +
| MoveCacheStorage
 +
|
 +
|-
 +
| 37
 +
| DeviceTreeBlob
 +
|
 +
|-
 +
| 38
 +
| NotifyErrorContextServiceReady
 +
|
 +
|-
 +
| 39-61
 
| Reserved
 
| Reserved
 
|  
 
|  
Line 586: Line 652:  
| All ones
 
| All ones
 
|  
 
|  
| Ignored
+
| Invalid
 
|}
 
|}
   Line 624: Line 690:     
== 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 697:  
|-
 
|-
 
| 7-30
 
| 7-30
| BeginAddress or Size
+
| BeginAddress
 
|-
 
|-
 
| 31
 
| 31
| IsRw or IsIo
+
| PermissionType (0=RW, 1=RO)
 
|}
 
|}
   −
MemoryMap entries are stored alternating between BeginAddress + IsRw and Size + IsIo.
+
{| class="wikitable" border="1"
 +
|-
 +
! Bits
 +
! Description
 +
|-
 +
| 7-26
 +
| Size
 +
|-
 +
| 27-30
 +
| Reserved
 +
|-
 +
| 31
 +
| MappingType (0=Io, 1=Static)
 +
|}
    
=== Restrictions ===
 
=== Restrictions ===
Line 672: Line 752:  
|-
 
|-
 
| 11-16
 
| 11-16
| RegionType0
+
| RegionType0 (0 = NoMapping, 1 = KernelTraceBuffer, 2 = OnMemoryBootImage, 3 = DTB)
 
|-
 
|-
 
| 17
 
| 17
Line 678: Line 758:  
|-
 
|-
 
| 18-23
 
| 18-23
| RegionType1
+
| RegionType1 (0 = NoMapping, 1 = KernelTraceBuffer, 2 = OnMemoryBootImage, 3 = DTB)
 
|-
 
|-
 
| 24
 
| 24
Line 684: Line 764:  
|-
 
|-
 
| 25-30
 
| 25-30
| RegionType2
+
| RegionType2 (0 = NoMapping, 1 = KernelTraceBuffer, 2 = OnMemoryBootImage, 3 = DTB)
 
|-
 
|-
 
| 31
 
| 31
 
| RegionIsReadOnly2
 
| RegionIsReadOnly2
 
|}
 
|}
  −
MemoryRegionMap is supported by the kernel but not by [[Loader_services|Loader]]. Thus, only initial processes may possess this capability.
      
== EnableInterrupts ==
 
== EnableInterrupts ==
Line 732: Line 810:  
|}
 
|}
   −
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.
+
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 || Minimum Allowed
+
! 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
 
|-
 
|-
| 1.0.0 || 5.0.0 || 3.0.0
+
| 3.0.2 || 7.4 || 3.4.0.0
 
|-
 
|-
| 2.0.0 || 6.1.0 || 3.0.0
+
| 5.0.0 || 9.3 || 5.3.0.0
 
|-
 
|-
| 3.0.0 || 7.4.0 || 3.0.0
+
| 10.0.0 || 14.4 || 10.4.0.0
 
|-
 
|-
| 3.0.2 || 7.4.0 || 3.0.0
+
| 11.0.0 || 15.4 || 11.4.0.0
 
|-
 
|-
| 5.0.0 || 9.3.0 || 3.0.0
+
| 11.0.1 || 15.4 || 11.4.0.0
 
|}
 
|}
   Line 770: Line 860:  
|-
 
|-
 
| 18
 
| 18
| ForceDebug
+
| [19.0.0+] ForceDebugProd ([1.0.0-18.1.0] ForceDebug)
 +
|-
 +
| 19
 +
| [19.0.0+] ForceDebug
 
|}
 
|}