Line 1,244: |
Line 1,244: |
| | | |
| = IRAM = | | = IRAM = |
− | == [[BCT|BCT]] == | + | == [[BIT|BIT]] == |
− | When copied to IRAM at address 0x40000000, the BCT has an additional header as follows. | + | When copied to IRAM at address 0x40000000, the BCT has an additional header called Boot Info Table as follows. |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 1,255: |
Line 1,255: |
| |- | | |- |
| | 0x00 | | | 0x00 |
− | | 0x50 | + | | 0x04 |
− | | bct_global_header | + | | unk_version0 |
| | | | | |
− | 0x00: unk_version0 (0x00210001) | + | 0x00210001 |
− | 0x04: unk_version1 (0x00210001)
| |
− | 0x08: unk_version2 (0x00210001)
| |
− | 0x0C: boot_type (1 (COLD) PK11 panics if it's not)
| |
− | 0x4C: bct_data_addr (address of the actual BCT)
| |
| |- | | |- |
− | | 0x50 | + | | 0x04 |
− | | 0x18 | + | | 0x04 |
− | | bootloader0_header | + | | unk_version1 |
| | | | | |
− | 0x00: is_active (if set to 0x01, bootloader0 is used) | + | 0x00210001 |
| |- | | |- |
− | | 0x68 | + | | 0x08 |
− | | 0x18 | + | | 0x04 |
− | | bootloader1_header | + | | unk_version2 |
| | | | | |
− | 0x00: is_active (if set to 0x01, bootloader1 is used) | + | 0x00210001 |
| |- | | |- |
− | | 0x80 | + | | 0x0C |
− | | 0x18 | + | | 0x04 |
− | | bootloader2_header | + | | boot_type |
| | | | | |
− | 0x00: is_active (if set to 0x01, bootloader2 is used) | + | BOOT_TYPE_COLD = 1 |
| + | BOOT_TYPE_RECOVERY = 2 |
| + | BOOT_TYPE_UART = 3 |
| + | BOOT_TYPE_EXIT_RCM = 4 |
| |- | | |- |
− | | 0x98 | + | 0x4C: bct_data_addr (address of the actual BCT) |
− | | 0x18 | + | |- |
− | | bootloader3_header | + | | 0x50 |
| + | | 0x18*4 |
| + | | bootloader_headers[4] |
| | | | | |
− | 0x00: is_active (if set to 0x01, bootloader3 is used) | + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Field |
| + | |- |
| + | | 0x00 |
| + | | 0x04 |
| + | | is_active |
| + | |- |
| + | | 0x04 |
| + | | 0x04 |
| + | | start_block |
| + | |- |
| + | | 0x08 |
| + | | 0x04 |
| + | | start_page |
| + | |- |
| + | | 0x0C |
| + | | 0x04 |
| + | | length |
| + | |- |
| + | | 0x10 |
| + | | 0x04 |
| + | | signed_start |
| + | |- |
| + | | 0x14 |
| + | | 0x04 |
| + | | signature |
| + | |- |
| + | |} |
| |- | | |- |
| | 0xB0 | | | 0xB0 |
− | | 0x50 | + | | 0x40 |
| + | | |
| + | | |
| + | |- |
| + | | 0xF0 |
| + | | 0x04 |
| + | | |
| + | | |
| + | bct_end_addr |
| + | |- |
| + | | 0xF4 |
| + | | 0x0C |
| | | | | |
| | | | | |
− | 0x40: bct_end_addr
| |
| |- | | |- |
| |} | | |} |
| + | |
| + | bct_data_addr should pint to a bct that contains the keyblob. |
| + | |
| + | It's used in key generation in PK1. |
| + | |
| + | PK11 checks boot_type to be cold, if it's not it panics. |
| + | |
| + | bootloader_headers[0] or bootloader_headers[1] should be set to active. It is also checked by PK11. |
| | | |
| = Notes = | | = Notes = |