mirror of
https://github.com/cirosantilli/linux-kernel-module-cheat.git
synced 2026-01-29 04:54:27 +01:00
baremetal: arm multicore attempt
This commit is contained in:
27
README.adoc
27
README.adoc
@@ -10419,7 +10419,13 @@ help architecture
|
|||||||
|
|
||||||
shows ARM version up to `armv6`, so maybe `armv6` is not implemented?
|
shows ARM version up to `armv6`, so maybe `armv6` is not implemented?
|
||||||
|
|
||||||
=== ARM exception level
|
=== ARM baremetal
|
||||||
|
|
||||||
|
In this section we will focus on learning ARM architecture concepts that can only learnt on baremetal setups.
|
||||||
|
|
||||||
|
Userland information can be found at: https://github.com/cirosantilli/arm-assembly-cheat
|
||||||
|
|
||||||
|
==== ARM exception level
|
||||||
|
|
||||||
ARM exception levels are analogous to x86 <<ring0,rings>>.
|
ARM exception levels are analogous to x86 <<ring0,rings>>.
|
||||||
|
|
||||||
@@ -10491,6 +10497,25 @@ output:
|
|||||||
3
|
3
|
||||||
....
|
....
|
||||||
|
|
||||||
|
==== ARM multicore
|
||||||
|
|
||||||
|
TODO get working: CPU1 not waking up:
|
||||||
|
|
||||||
|
....
|
||||||
|
./run --arch aarch64 --baremetal arch/aarch64/no_bootloader/multicore
|
||||||
|
....
|
||||||
|
|
||||||
|
Source: link:baremetal/arch/aarch64/no_bootloader/multicore.S[]
|
||||||
|
|
||||||
|
CPU 0 of this program enters a spinlock loop: it repeatedly checks if a given memory address is `1`.
|
||||||
|
|
||||||
|
So, we need CPU 1 to come to the rescue to that memory address be `1`, otherwise CPU 0 will be stuck there forever.
|
||||||
|
|
||||||
|
Bibliography:
|
||||||
|
|
||||||
|
* https://stackoverflow.com/questions/20055754/arm-start-wakeup-bringup-the-other-cpu-cores-aps-and-pass-execution-start-addre
|
||||||
|
* https://stackoverflow.com/questions/980999/what-does-multicore-assembly-language-look-like/33651438#33651438
|
||||||
|
|
||||||
=== How we got some baremetal stuff to work
|
=== How we got some baremetal stuff to work
|
||||||
|
|
||||||
It is nice when thing just work.
|
It is nice when thing just work.
|
||||||
|
|||||||
35
baremetal/arch/aarch64/no_bootloader/multicore.S
Normal file
35
baremetal/arch/aarch64/no_bootloader/multicore.S
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/* https://github.com/cirosantilli/linux-kernel-module-cheat#arm-multicore */
|
||||||
|
|
||||||
|
.global mystart
|
||||||
|
mystart:
|
||||||
|
/* Reset spinlock. */
|
||||||
|
mov x0, #0
|
||||||
|
ldr x1, =spinlock
|
||||||
|
str x0, [x1]
|
||||||
|
|
||||||
|
/* Read cpu id into x1. */
|
||||||
|
mrs x1, mpidr_el1
|
||||||
|
and x1, x1, #3
|
||||||
|
cbz x1, 1f
|
||||||
|
/* Only CPU 1 reaches this point and sets the spinlock. */
|
||||||
|
mov x0, #1
|
||||||
|
ldr x1, =spinlock
|
||||||
|
str x0, [x1]
|
||||||
|
b .
|
||||||
|
1:
|
||||||
|
/* Only CPU 0 reaches this point. */
|
||||||
|
ldr x0, spinlock
|
||||||
|
cbz x0, 1b
|
||||||
|
|
||||||
|
/* Semihost exit. */
|
||||||
|
mov x1, #0x26
|
||||||
|
movk x1, #2, lsl #16
|
||||||
|
str x1, [sp,#0]
|
||||||
|
mov x0, #0
|
||||||
|
str x0, [sp,#8]
|
||||||
|
mov x1, sp
|
||||||
|
mov w0, #0x18
|
||||||
|
hlt 0xf000
|
||||||
|
|
||||||
|
spinlock:
|
||||||
|
.skip 8
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
/* https://github.com/cirosantilli/linux-kernel-module-cheat#semihosting */
|
||||||
|
|
||||||
.global mystart
|
.global mystart
|
||||||
mystart:
|
mystart:
|
||||||
mov x1, #0x26
|
mov x1, #0x26
|
||||||
|
|||||||
Reference in New Issue
Block a user