diff options
author | 3gg <3gg@shellblade.net> | 2025-02-08 14:03:10 -0800 |
---|---|---|
committer | 3gg <3gg@shellblade.net> | 2025-02-08 14:03:10 -0800 |
commit | d9663547a1f4337e1a31d727abe15a8aafa0c9c8 (patch) | |
tree | 05795108e35cb8a9c5d05a19cd7a28487322ad6b /src/boot.s |
Initial commit.
Diffstat (limited to 'src/boot.s')
-rw-r--r-- | src/boot.s | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/boot.s b/src/boot.s new file mode 100644 index 0000000..7baa463 --- /dev/null +++ b/src/boot.s | |||
@@ -0,0 +1,44 @@ | |||
1 | /* | ||
2 | References: | ||
3 | https://wiki.osdev.org/Raspberry_Pi_Bare_Bones | ||
4 | https://jsandler18.github.io/tutorial/boot.html | ||
5 | https://jsandler18.github.io/explanations/boot_S.html | ||
6 | https://www.rpi4os.com/part1-bootstrapping/ | ||
7 | https://developer.arm.com/documentation/102422/0100/Example-solutions/System-control-solution | ||
8 | https://developer.arm.com/documentation/102422/0100/GAS-syntax-reference?lang=en | ||
9 | */ | ||
10 | |||
11 | .section ".text.boot" | ||
12 | |||
13 | .global _start | ||
14 | |||
15 | _start: | ||
16 | // Let core 0.0.0.0 be the only one running for now. The other cores halt. | ||
17 | // Each core has a unique affinity number: <aff3>.<aff2>.<aff1>.<aff0>. | ||
18 | // On AArch64, Aff3 takes bits 39-32. The code below copies bits 39-32 over | ||
19 | // to 31-24 so that we get a 32-bit value <aff3>.<aff2>.<aff1>.<aff0>. | ||
20 | mrs x0, MPIDR_EL1 | ||
21 | ubfx x1, x0, #32, #8 // x1[0..7] = Aff3; x[8..63] = 0 | ||
22 | bfi w0, w1, #24, #8 // w0[31..24] = Aff3 | ||
23 | cbnz w0, halt // All cores except 0.0.0.0 halt. | ||
24 | |||
25 | core0: | ||
26 | // Initialize the stack. The stack will grow below this boot code. | ||
27 | ldr x1, =_start | ||
28 | mov sp, x1 | ||
29 | |||
30 | // Zero-initialize the BSS section. | ||
31 | ldr x1, =__bss_start // Start address of BSS section. | ||
32 | ldr x2, =__bss_size // Size of the BSS section. | ||
33 | bss_init_loop: | ||
34 | str xzr, [x1], #8 // Store 64-bit 0 to addr; increment addr by 8 bytes. | ||
35 | sub x2, x2, #8 // Decrement remaining size. | ||
36 | cbnz x2, bss_init_loop // Loop back if remaining size is non-zero (>0). | ||
37 | |||
38 | // Jump to C main() | ||
39 | bl main | ||
40 | |||
41 | halt: | ||
42 | wfi // Wait for interrupt. Core enters low-power state. | ||
43 | b halt // Loop back. | ||
44 | |||