.text /* * The head of l-loader is defined in below. * struct l_loader_head { * unsigned int first_instr; * unsigned char magic[16]; @ BOOTMAGICNUMBER! * unsigned int l_loader_start; * unsigned int l_loader_end; * }; */ #define CPU0_CTRL_OFFSET 0x100 #define CPU7_CTRL_OFFSET 0x800 #define CPU0_RVBARADDR_OFFSET 0x158 #define CPU7_RVBARADDR_OFFSET 0x858 #define CPU_CTRL_AARCH64_MODE (1 << 7) #define SC_PERIPH_CLKEN3 0x230 #define SC_PERIPH_RSTDIS3 0x334 .global _start _start: b reset @ Android magic number: "BOOTMAGICNUMBER!" android_magic: .word 0x544f4f42 .word 0x4947414d .word 0x4d554e43 .word 0x21524542 .word LLOADER_START @ LLOADER_START in RAM .word 0 @ LLOADER_END in RAM entries: @ 5 entries with 7 words .space 140 .align 7 reset: ldr r8, =(0xf9800000 + 0x700) str r0, [r8] @ download mode (1:usb,2:uart,0:boot) ldr r4, =0xf6504000 @ ACPU_CTRL register base @ set RVBAR for cpu0 ldr r5, =CPU0_RVBARADDR_OFFSET ldr r6, =LLOADER_BL1_BIN mov r6, r6, lsr #2 str r6, [r4, r5] 1: ldr r0, [r4, r5] cmp r0, r6 bne 1b mov r5, #CPU0_CTRL_OFFSET mov r6, #CPU7_CTRL_OFFSET 2: ldr r0, [r4, r5] @ Load ACPU_SC_CPUx_CTRL orr r0, r0, #CPU_CTRL_AARCH64_MODE str r0, [r4, r5] @ Save to ACPU_SC_CPUx_CTRL ldr r0, [r4, r5] add r5, r5, #0x100 @ Iterate ACPU_SC_CPUx_CTRL cmp r5, r6 ble 2b /* * Prepare UART2 & UART3 without baud rate initialization. * So always output on UART0 in l-loader. */ ldr r4, =0xf70100e0 @ UART2_RXD IOMG register mov r0, #0 str r0, [r4] str r0, [r4, #4] @ UART2_TXD IOMG register ldr r0, [r4] ldr r4, =0xf7010188 @ UART3_RXD IOMG register mov r0, #1 str r0, [r4] str r0, [r4, #4] @ UART3_TXD IOMG register ldr r1, [r4] ldr r4, =0xf7030000 @ PERI_CTRL register base @ By default, CLK_TXCO is the parent of CLK_UART3 in SC_CLK_SEL0 ldr r5, =SC_PERIPH_RSTDIS3 @ unreset ldr r6, =SC_PERIPH_CLKEN3 @ enable PCLK mov r0, #(3 << 6) @ bit'6' & bit'7' (UART2 & UART3) str r0, [r4, r5] str r0, [r4, r6] @ execute warm reset to switch aarch64 mov r2, #3 mcr p15, 0, r2, c12, c0, 2 wfi panic: b panic str_aarch64: .asciz "\nSwitch to aarch64 mode. CPU0 executes at 0x"