Merge pull request #6 from christinaa/bug/smp-fix
authorKristina Brooks <christinaa@users.noreply.github.com>
Thu, 25 Aug 2016 02:11:32 +0000 (03:11 +0100)
committerGitHub <noreply@github.com>
Thu, 25 Aug 2016 02:11:32 +0000 (03:11 +0100)
CPU select support

README.md
arm_chainloader/main.c
arm_chainloader/start.s
trap.c

index 5199b5d..42cd22c 100755 (executable)
--- a/README.md
+++ b/README.md
@@ -18,8 +18,6 @@ The current iteration of ARM chainloader (which I've still yet to commit) can ac
 \r
 The current makefiles in the ARM part of it aim at **RPi1** (ie. ARMv6) but they can be changed to ARMv7 if you want to build it for a newer model. I tested it on all RPi models and it works without any issues as far as I can tell (ARM can access peripherals and memory just fine as AXI supervisor). However it cannot access any secure peripherals (OTP/SDRAM/etc) since they appear to be on a separate bus accessible only to VC4.\r
 \r
-**Beware:** This doesn't handle SMP at the moment so if you run this on RPi2 and above, all ARM cores will start executing the ARM bootloader code at the start which could cause problems. I will fix this soon.\r
-\r
 ## Issues/Fixes\r
  * PLL rate on ARM is slow, it's a bit annoying. Need to tweak the PLL rate later.\r
  * All SDRAM configurations (including 1GB work), however, I'm not certain whether they will be reliable or not . ARM detection works for all of the RPi models I got to test it on which was two RPi2s, 1 RPi1 and 1 RPi3.\r
index 4106fdd..c82b445 100644 (file)
@@ -33,11 +33,10 @@ static void heap_init() {
 void main() {\r
        logf("Started on ARM, continuing boot from here ...\n", __FUNCTION__);\r
 \r
-       heap_init();\r
+        heap_init();\r
 \r
        /* c++ runtime */\r
        cxx_init();\r
-\r
        panic("Nothing else to do!");\r
 \r
 #if 0\r
@@ -47,4 +46,4 @@ void main() {
                udelay(1000000);\r
        }\r
 #endif\r
-}
\ No newline at end of file
+}\r
index be2c95c..afe5b3c 100644 (file)
@@ -16,7 +16,9 @@ FILE DESCRIPTION
 ARM entry point.\r
 \r
 This is where all cores start. For RPi1, only one core starts so we can jump\r
-straight to the main bootloader. For later models,\r
+straight to the main bootloader. For later models, the first core jumps to the\r
+bootloader. The other cores wait until SMP is enabled by the kernel later in\r
+the boot process.\r
 \r
 =============================================================================*/\r
 \r
@@ -40,6 +42,10 @@ _start:
        nop\r
 \r
 L_all_cores_start:\r
+        /* check CPU id */\r
+        mrc p15, 0, r0, c0, c0, 5\r
+        ands r0, r0, #0x03\r
+        bne L_deadloop\r
 \r
 L_core0:\r
        mov sp, #0x2000000\r
diff --git a/trap.c b/trap.c
index 0f3d5ba..1a8d169 100644 (file)
--- a/trap.c
+++ b/trap.c
@@ -85,4 +85,4 @@ void sleh_fatal(vc4_saved_state_t* pcb, uint32_t n) {
 \r
 void sleh_irq(vc4_saved_state_t* pcb) {\r
        panic("interrupt at 0x%X!", pcb->pc);\r
-}
\ No newline at end of file
+}\r
This page took 0.053575 seconds and 4 git commands to generate.