Package2: Difference between revisions

No edit summary
 
(10 intermediate revisions by 4 users not shown)
Line 71: Line 71:
|-
|-
| 0x5C
| 0x5C
| 0x2
| 0x1
| Version. HighByte must be <{maxver} and LowByte must be >{minver}, where {maxver} and {minver} are constants used by TZ updated with each package1 update.
| Package2 version. Must be >= {minimum valid package2 version} constant in TZ.
|-
| 0x5D
| 0x1
| Bootloader version. Must be <= {current bootloader version} constant in TZ.
|-
|-
| 0x5E
| 0x5E
Line 132: Line 136:
Before being decrypted, the encrypted header's CTR additionally encodes metadata used to validate package2's contents as follows:
Before being decrypted, the encrypted header's CTR additionally encodes metadata used to validate package2's contents as follows:
* Size of the entire package2 with the raw header = ctr_word2 ^ ctr_word3 ^ ctr_word0
* Size of the entire package2 with the raw header = ctr_word2 ^ ctr_word3 ^ ctr_word0
* Metadata version field = ((ctr_word1 ^ (ctr_word1 >> 16)) & 0xFF) ^ (ctr_word1 >> 24)
* Key generation = ((ctr_word1 ^ (ctr_word1 >> 16)) & 0xFF) ^ (ctr_word1 >> 24)


In [4.0.0], the metadata version field must be less or equal to 4.
In [4.0.0], the key generation must be less or equal to 4.


== Section 0 ==
== Section 0 ==
Line 167: Line 171:
| Reserved
| Reserved
|}
|}
==== KIP1 ====
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x4
| Magic "KIP1"
|-
| 0x4
| 0xC
| Name
|-
| 0x10
| 0x8
| Program ID
|-
| 0x18
| 0x4
| Version
|-
| 0x1C
| 0x1
| Main Thread Priority
|-
| 0x1D
| 0x1
| Main Thread Core Number
|-
| 0x1E
| 0x1
| Reserved
|-
| 0x1F
| 0x1
| Flags (bit0=TextCompress, bit1=RoCompress, bit2=DataCompress, bit3=Is64BitInstruction, bit4=ProcessAddressSpace64Bit, bit5=[2.0.0+] UseSecureMemory)
|-
| 0x20
| 0xC
| Text [[#Segment_Header|Segment Header]]
|-
| 0x2C
| 0x4
| Main Thread Affinity Mask
|-
| 0x30
| 0xC
| Ro [[#Segment_Header|Segment Header]]
|-
| 0x3C
| 0x4
| Main Thread Stack Size
|-
| 0x40
| 0xC
| Data [[#Segment_Header|Segment Header]]
|-
| 0x4C
| 0x4
| Reserved
|-
| 0x50
| 0xC
| Bss [[#Segment_Header|Segment Header]]
|-
| 0x5C
| 0x24
| Reserved (2 unused [[#Segment_Header|Segment Headers]])
|-
| 0x80
| 0x80
| [[NPDM#KernelCapability|Kernel Capability Data]]
|}
===== Segment Header =====
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x4
| Offset
|-
| 0x4
| 0x4
| Size
|-
| 0x8
| 0x4
| Compressed/Binary Size
|}
Compressed/Binary size can be 0 or lower than expected, this is the case for BSS for example.
===== Compression =====
The compression used here is BLZ, with a modified footer since 3ds. The footer is now 0xC bytes instead of 0x8, and has the form u32 compressed_data_len; u32 footer_size; u32 additional_len_when_uncompressed;


== Section 2 ==
== Section 2 ==
Line 279: Line 182:
|-
|-
! System version
! System version
! Bootloader maximum version
! Package2 minimum version
! Bootloader current version
! Bootloader current version
! Package2 current version
! Package2 minimum valid version
|-
|-
| [[1.0.0]]
| [[1.0.0]]
| 0x2
| 0x3
| 0x1
| 0x1
| 0x4
| 0x4
|-
|-
| [[2.0.0]]
| [[2.0.0]]
| 0x3
| 0x4
| 0x2
| 0x2
| 0x5
| 0x5
|-
|-
| [[3.0.0]]
| [[3.0.0]]
| 0x4
| 0x5
| 0x3
| 0x3
| 0x6
| 0x6
|-
|-
| [[3.0.2]]
| [[3.0.2]]
| 0x5
| 0x6
| 0x4
| 0x4
| 0x7
| 0x7
|-
|-
| [[4.0.0]]
| [[4.0.0]]
| 0x6
| 0x7
| 0x5
| 0x5
| 0x8
| 0x8
|-
|-
| [[5.0.0]]
| [[5.0.0]]
| 0x7
| 0x8
| 0x6
| 0x6
| 0x9
| 0x9
|-
|-
| [[6.0.0]]
| [[6.0.0]]
| 0x8
| 0x9
| 0x7
| 0x7
| 0xA
| 0xA
|-
|-
| [[6.2.0]]
| [[6.2.0]]
| 0x9
| 0xA
| 0x8
| 0x8
| 0xB
| 0xB
|-
|-
| [[7.0.0]]
| [[7.0.0]]
| 0xA
| 0xB
| 0x9
| 0x9
| 0xC
| 0xC
|-
|-
| [[8.1.0]]
| [[8.1.0]]
| 0xB
| 0xC
| 0xA
| 0xA
| 0xD
| 0xD
|-
|-
| [[9.0.0]]
| [[9.0.0]]
| 0xC
| 0xD
| 0xB
| 0xB
| 0xE
| 0xE
|-
|-
| [[9.1.0]]
| [[9.1.0]]
| 0xD
| 0xE
| 0xC
| 0xC
| 0xF
| 0xF
|-
|-
| [[10.0.0]]
| [[10.0.0]]
| 0xD
| 0x10
|-
| [[11.0.0]]
| 0xE
| 0xE
| 0x11
|-
| [[12.0.2]]
| 0xF
| 0xF
| 0xD
| 0x12
| 0x10
|-
| [[12.1.0]]
| 0xF
| 0x13
|-
| [[13.0.0]]
| 0xF
| 0x14
|}
|}