boot.S 4.37 KB
Newer Older
bzt's avatar
bzt committed
1 2
/*
 * aarch64-rpi/boot.S
bzt's avatar
bzt committed
3
 *
bzt's avatar
bzt committed
4
 * Copyright (C) 2017 - 2020 bzt (bztsrc@gitlab)
bzt's avatar
bzt committed
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 *
 * 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.
bzt's avatar
bzt committed
27
 * @brief Boot loader for the Raspberry Pi 3 and 4 ARMv8
bzt's avatar
bzt committed
28 29 30 31 32 33 34 35 36 37 38 39 40
 *
 */
.section ".text.boot"

.global _start

/*********************************************************************
 *                Entry point called by start.elf                    *
 *********************************************************************/
_start:
    // magic
    b       1f
    .ascii  "BOOTBOOT"
bzt's avatar
bzt committed
41 42
    // set stack before our code
1:  ldr     x1, =_start
bzt's avatar
bzt committed
43 44 45 46 47 48
    // set up EL1
    mrs     x0, CurrentEL
    and     x0, x0, #12
    // running at EL3?
    cmp     x0, #12
    bne     1f
49
    msr     sp_el2, x1
bzt's avatar
bzt committed
50 51 52 53 54 55 56 57 58 59
    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
60
    msr     sp_el1, x1
bzt's avatar
bzt committed
61
    // set up exception handlers
bzt's avatar
bzt committed
62 63
    ldr     x2, =_vectors
    msr     vbar_el2, x2
bzt's avatar
bzt committed
64 65 66 67
    // enable CNTP for EL1
    mrs     x0, cnthctl_el2
    orr     x0, x0, #3
    msr     cnthctl_el2, x0
bzt's avatar
bzt committed
68
    msr     cnthp_ctl_el2, xzr
bzt's avatar
bzt committed
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
    // 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
bzt's avatar
bzt committed
95 96 97
    // set up exception handlers
1:  ldr     x2, =_vectors
    msr     vbar_el1, x2
bzt's avatar
bzt committed
98 99
    // disable execution level dependent stacks, so that we have only 4 vectors
    msr     SPSel, #0
bzt's avatar
bzt committed
100 101 102 103
    // read cpu id, start slave cores
    mrs     x7, mpidr_el1
    and     x7, x7, #3
    cbnz    x7, 3f
bzt's avatar
bzt committed
104 105 106 107 108
    // start all cores
    mov     x2, #0xd8
    str     w1, [x2, #8]
    str     w1, [x2, #16]
    str     w1, [x2, #24]
bzt's avatar
bzt committed
109
    sev
bzt's avatar
bzt committed
110
    // clear bss
bzt's avatar
bzt committed
111 112 113 114 115 116 117 118 119
    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
bzt's avatar
bzt committed
120
3:  b       bootboot_startcore
bzt's avatar
bzt committed
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159

    .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