rpi4-osdev/part10-multicore/boot.S
2021-02-22 10:24:12 +00:00

71 lines
1.3 KiB
ArmAsm

#define LOCAL_CONTROL 0xff800000
#define LOCAL_PRESCALER 0xff800008
#define OSC_FREQ 54000000
#define MAIN_STACK 0x400000
.section ".text.boot"
.globl _start
_start:
ldr x0, =LOCAL_CONTROL // Sort out the timer
str wzr, [x0]
mov w1, 0x80000000
str w1, [x0, #(LOCAL_PRESCALER - LOCAL_CONTROL)]
ldr x0, =OSC_FREQ
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
secondary_cpu:
mov x0, #0
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:
mov sp, #MAIN_STACK
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