Bootloader: Difference between revisions

Myria (talk | contribs)
Boot9 startup: name of register
No edit summary
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 ==