Line 122: |
Line 122: |
| * Then the instruction/data access permissions for the MPU regions are setup. | | * Then the instruction/data access permissions for the MPU regions are setup. |
| * Lastly bitmask 0x0005707d is orred in the cp15 control register. | | * Lastly bitmask 0x0005707d is orred in the cp15 control register. |
| + | |
| + | == Boot9 main() == |
| + | |
| + | The following functions are called: LT_ffff2024(), LT_ffff1ff8(), pxi_init(), rsa_init(), initialize_rsakeyslots_pubk(), crypto_initialize(), and aesengine_reset(). |
| + | Then AES keyslot 0x3F is setup: aesengine_setnormalkey(0x3f, 5, ptr) is called. ptr on retail(CFG_UNITINFO check) is 0xffffd6e0, 0xffffd700 for devunit. Then essentially, aesengine_setctr(5, ptr+0x10) is executed. |
| + | Then AES keyslot 0x3f is selected. |
| + | When calling the following functions, if any of them return zero, it will immediately jump to setting ptr to 0x10012000(otp), otherwise when all of them return non-zero ptr = sp+0x94. otp_decrypt(sp+4), otp_verify(sp+4), initialize_consoleunique_itcm(sp+4, 0x07ffb800). |
| + | Then the following is executed: initialize_aeskeys_wrap(ptr, 0x70); |
| + | Then sp+4 size 0x100 is cleared to zero. |
| + | |
| + | ... |
| + | |
| + | NAND firm-boot code-block, is described below. Note that boot9 is basically hard-coded to use deviceid NAND, not SD. |
| + | { |
| + | timer_updatestoredstate() is called, then the AES keyslot for NAND-FIRM is selected(0x6). |
| + | Then LT_ffff56c8() is called, if that returns non-zero the statuscode variable is set to ~2 then it jumps to NAND_BOOTEND. |
| + | Then LT_ffff5774(0x201) is called, if that returns non-zero the statuscode variable is set to ~1 then it jumps to NAND_BOOTEND. |
| + | Then fsdriver_setup_mmc() is called. Then nand_findfirmpartition_loadfirm(0) is called, with the statuscode variable set to the retval. |
| + | Executes a loop which runs 8 times: write the output from get_errorcode_arrayentry_xfff005e8(loopindex) to u8 0x1fffe000+0x10+loopindex(copy the array of 32bit error-codes for all 8 NCSD partitions initialized by nand_findfirmpartition_loadfirm() to the array of 8bit entries at 0x1fffe000+0x10). |
| + | |
| + | NAND_BOOTEND: |
| + | Then the statuscode variable is written to u8 0x1fffe000+0xc. |
| + | Then LT_ffff5690(0x201, 0x1fffe018, 0x1fffe01c) is called. |
| + | Then LT_ffff5644() is called. |
| + | Then timer_updatestoredstate() is called. |
| + | When statuscode==0 for success, it jumps to FIRMLOAD_END. Otherwise, it continues to the next code-block. |
| + | } |
| + | |
| + | Wifi spi-flash firm-boot code-block, executed when no FIRM was loaded successfully so far. |
| + | { |
| + | timer_updatestoredstate() is called. |
| + | |
| + | Then spi_wififlash_cmdgetstatusreg(sp+0x100) is executed. When bit0 of the output u8 at sp+0x100 is clear, it will continue this code-block, otherwise it will set the statuscode variable to ~1 then jump to SPIFLASH_BOOTEND. |
| + | Then fsdriver_setup_wififlash() is called. |
| + | Here read_firmhdr_validate_loadfirm(0, 2) is called, with the statuscode variable set to the retval. |
| + | |
| + | SPIFLASH_BOOTEND: |
| + | Then the statuscode variable is written to u8 0x1fffe000+0xe. |
| + | Then timer_updatestoredstate() is called. |
| + | When statuscode==0 for success, it jumps to FIRMLOAD_END. Otherwise, it executes writenormalkey_keyslot3f(), then jumps to FIRMLOAD_FAILURE. |
| + | } |
| + | |
| + | FIRMLOAD_END: |
| + | Here it calls firmhdr_getarm11_entrypoint() and firmhdr_getarm9_entrypoint(). Immediately after calling each function it checks if the retval is 0, if so it then jumps to FIRMLOAD_FAILURE. |
| + | After calling initialize_x07ffbd00_x07ffc100_rsakeyslotsprivk(), it jumps to FIRMLOAD_EXIT. |
| + | |
| + | FIRMLOAD_FAILURE: |
| + | Here it clears 0x07ffb800 size 0x3c70 to zero, endaddr = 0x07fff470. |
| + | Then it continues to FIRMLOAD_EXIT. |
| + | |
| + | FIRMLOAD_EXIT: |
| + | Here firmboot() is called, which should never return. The instruction after this bl is a call for panic(). |
| | | |
| == Boot Procedure == | | == Boot Procedure == |