bztsrc--bootboot/aarch64-rpi/boot.S

160 lines
4.4 KiB
ArmAsm

/*
* aarch64-rpi/boot.S
*
* Copyright (C) 2017 - 2021 bzt (bztsrc@gitlab)
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* This file is part of the BOOTBOOT Protocol package.
* @brief Boot loader for the Raspberry Pi 3 and 4 ARMv8
*
*/
.section ".text.boot"
.global _start
/*********************************************************************
* Entry point called by start.elf *
*********************************************************************/
_start:
// magic
b 1f
.ascii "BOOTBOOT"
// set stack before our code
1: ldr x1, =_start
// set up EL1
mrs x0, CurrentEL
and x0, x0, #12
// running at EL3?
cmp x0, #12
bne 1f
msr sp_el2, x1
mov x2, #0x5b1
msr scr_el3, x2
mov x2, #0x3c9
msr spsr_el3, x2
adr x2, 1f
msr elr_el3, x2
eret
// running at EL2?
1: cmp x0, #4
beq 1f
msr sp_el1, x1
// set up exception handlers
ldr x2, =_vectors
msr vbar_el2, x2
// enable CNTP for EL1
mrs x0, cnthctl_el2
orr x0, x0, #3
msr cnthctl_el2, x0
msr cnthp_ctl_el2, xzr
// initialize virtual MPIDR
mrs x0, midr_el1
mrs x2, mpidr_el1
msr vpidr_el2, x0
msr vmpidr_el2, x2
// disable coprocessor traps
mov x0, #0x33FF
msr cptr_el2, x0
msr hstr_el2, xzr
mov x0, #(3 << 20)
msr cpacr_el1, x0
// enable AArch64 in EL1
mov x0, #(1 << 31) // AArch64
orr x0, x0, #(1 << 1) // SWIO hardwired on Pi3
msr hcr_el2, x0
mrs x0, hcr_el2
// Setup SCTLR access
mov x2, #0x0800
movk x2, #0x30d0, lsl #16
msr sctlr_el1, x2
// change exception level to EL1
mov x2, #0x3c4
msr spsr_el2, x2
adr x2, 1f
msr elr_el2, x2
eret
// set up exception handlers
1: ldr x2, =_vectors
msr vbar_el1, x2
// disable execution level dependent stacks, so that we have only 4 vectors
msr SPSel, #0
// read cpu id, start slave cores
mrs x7, mpidr_el1
and x7, x7, #3
cbnz x7, 3f
// start all cores
mov x2, #0xd8
str w1, [x2, #8]
str w1, [x2, #16]
str w1, [x2, #24]
sev
// clear bss
ldr x2, =__bss_start
ldr w3, =__bss_size
1: cbz w3, 2f
str xzr, [x2], #8
sub w3, w3, #1
cbnz w3, 1b
2: mov sp, x1
// jump to C code
bl bootboot_main
3: b bootboot_startcore
.align 11
_vectors:
.align 7
mov x0, #0
mrs x1, esr_el1
mrs x2, elr_el1
mrs x3, spsr_el1
mrs x4, far_el1
mrs x5, sctlr_el1
mrs x6, tcr_el1
b uart_exc
.align 7
mov x0, #1
mrs x1, esr_el1
mrs x2, elr_el1
mrs x3, spsr_el1
mrs x4, far_el1
mrs x5, sctlr_el1
mrs x6, tcr_el1
b uart_exc
.align 7
mov x0, #2
mrs x1, esr_el1
mrs x2, elr_el1
mrs x3, spsr_el1
mrs x4, far_el1
mrs x5, sctlr_el1
mrs x6, tcr_el1
b uart_exc
.align 7
mov x0, #3
mrs x1, esr_el1
mrs x2, elr_el1
mrs x3, spsr_el1
mrs x4, far_el1
mrs x5, sctlr_el1
mrs x6, tcr_el1
b uart_exc