Cleaned up boot.S so it's clearer where the changes are from part9

This commit is contained in:
Adam Greenwood-Byrne 2021-02-22 11:28:55 +00:00
parent 56068acbb6
commit 75beaecccf

View file

@ -3,9 +3,10 @@
#define OSC_FREQ 54000000 #define OSC_FREQ 54000000
#define MAIN_STACK 0x400000 #define MAIN_STACK 0x400000
.section ".text.boot" .section ".text.boot" // Make sure the linker puts this at the start of the kernel image
.global _start // Execution starts here
.globl _start
_start: _start:
ldr x0, =LOCAL_CONTROL // Sort out the timer ldr x0, =LOCAL_CONTROL // Sort out the timer
str wzr, [x0] str wzr, [x0]
@ -16,37 +17,43 @@ _start:
msr cntfrq_el0, x0 msr cntfrq_el0, x0
msr cntvoff_el2, xzr msr cntvoff_el2, xzr
mrs x6, mpidr_el1 // Check processor ID is zero (executing on main core), else hang
and x6, x6,#0xFF // Check processor id mrs x1, mpidr_el1
cbz x6, primary_cpu // Hang for all non-primary CPU and x1, x1, #3
cbz x1, 2f
// We're not on the main core, so hang in an infinite wait loop
adr x5, spin_cpu0 adr x5, spin_cpu0
proc_hang: 1: wfe
wfe ldr x4, [x5, x1, lsl #3]
ldr x4, [x5, x6, lsl #3] cbz x4, 1b
cbz x4, proc_hang
ldr x1, =__test_stack // Get ourselves a fresh stack ldr x1, =__test_stack // Get ourselves a fresh stack
mov sp, x1 mov sp, x1
secondary_cpu:
mov x0, #0 mov x0, #0
mov x1, #0 mov x1, #0
mov x2, #0 mov x2, #0
mov x3, #0 mov x3, #0
br x4 br x4
b proc_hang b 1b
primary_cpu: 2: // We're on the main core!
ldr x1, =__bss_start
ldr w2, =__bss_size // Set stack to start somewhere safe
memzero: mov sp, #MAIN_STACK
cbz w2, startup
// Clean the BSS section
ldr x1, =__bss_start // Start address
ldr w2, =__bss_size // Size of the section
3: cbz w2, 4f // Quit loop if zero
str xzr, [x1], #8 str xzr, [x1], #8
sub w2, w2, #1 sub w2, w2, #1
cbnz w2, memzero cbnz w2, 3b // Loop if non-zero
startup:
mov sp, #MAIN_STACK // Jump to our main() routine in C (make sure it doesn't return)
bl main 4: bl main
b proc_hang // should never come here // In case it does return, halt the master core too
b 1b
.ltorg .ltorg