2021-02-22 10:24:12 +00:00
|
|
|
#define LOCAL_CONTROL 0xff800000
|
|
|
|
#define LOCAL_PRESCALER 0xff800008
|
|
|
|
#define OSC_FREQ 54000000
|
|
|
|
#define MAIN_STACK 0x400000
|
2021-02-21 20:58:04 +00:00
|
|
|
|
|
|
|
.section ".text.boot"
|
|
|
|
|
|
|
|
.globl _start
|
|
|
|
_start:
|
2021-02-22 10:24:12 +00:00
|
|
|
ldr x0, =LOCAL_CONTROL // Sort out the timer
|
2021-02-21 20:58:04 +00:00
|
|
|
str wzr, [x0]
|
|
|
|
mov w1, 0x80000000
|
|
|
|
str w1, [x0, #(LOCAL_PRESCALER - LOCAL_CONTROL)]
|
|
|
|
|
2021-02-22 10:24:12 +00:00
|
|
|
ldr x0, =OSC_FREQ
|
2021-02-21 20:58:04 +00:00
|
|
|
msr cntfrq_el0, x0
|
|
|
|
msr cntvoff_el2, xzr
|
|
|
|
|
|
|
|
mrs x6, mpidr_el1
|
|
|
|
and x6, x6,#0xFF // Check processor id
|
|
|
|
cbz x6, primary_cpu // Hang for all non-primary CPU
|
|
|
|
|
|
|
|
adr x5, spin_cpu0
|
|
|
|
proc_hang:
|
|
|
|
wfe
|
|
|
|
ldr x4, [x5, x6, lsl #3]
|
|
|
|
cbz x4, proc_hang
|
|
|
|
|
|
|
|
ldr x1, =__test_stack // Get ourselves a fresh stack
|
|
|
|
mov sp, x1
|
2021-02-22 10:24:12 +00:00
|
|
|
secondary_cpu:
|
|
|
|
mov x0, #0
|
2021-02-21 20:58:04 +00:00
|
|
|
mov x1, #0
|
|
|
|
mov x2, #0
|
|
|
|
mov x3, #0
|
|
|
|
br x4
|
|
|
|
b proc_hang
|
|
|
|
primary_cpu:
|
|
|
|
ldr x1, =__bss_start
|
|
|
|
ldr w2, =__bss_size
|
|
|
|
memzero:
|
|
|
|
cbz w2, startup
|
|
|
|
str xzr, [x1], #8
|
|
|
|
sub w2, w2, #1
|
|
|
|
cbnz w2, memzero
|
|
|
|
startup:
|
2021-02-22 10:24:12 +00:00
|
|
|
mov sp, #MAIN_STACK
|
2021-02-21 20:58:04 +00:00
|
|
|
bl main
|
|
|
|
b proc_hang // should never come here
|
|
|
|
|
|
|
|
.ltorg
|
|
|
|
|
|
|
|
.org 0xd8
|
|
|
|
.globl spin_cpu0
|
|
|
|
spin_cpu0:
|
|
|
|
.quad 0
|
|
|
|
|
|
|
|
.org 0xe0
|
|
|
|
.globl spin_cpu1
|
|
|
|
spin_cpu1:
|
|
|
|
.quad 0
|
|
|
|
|
|
|
|
.org 0xe8
|
|
|
|
.globl spin_cpu2
|
|
|
|
spin_cpu2:
|
|
|
|
.quad 0
|
|
|
|
|
|
|
|
.org 0xf0
|
|
|
|
.globl spin_cpu3
|
|
|
|
spin_cpu3:
|
|
|
|
.quad 0
|