added driver framework to prepare for driver unification, fixed USB driver, added...
[rpi-open-firmware.git] / arm_chainloader / start.s
index 19d8506..a758c58 100644 (file)
@@ -1,5 +1,5 @@
 /*=============================================================================\r
-Copyright (C) 2016 Kristina Brooks\r
+Copyright (C) 2016-2017 Authors of rpi-open-firmware\r
 All rights reserved.\r
 \r
 This program is free software; you can redistribute it and/or\r
@@ -22,37 +22,120 @@ the boot process.
 \r
 =============================================================================*/\r
 \r
+#include "memory_map.h"\r
+\r
+.arch_extension sec\r
+\r
 .text\r
 .globl _start\r
 _start:\r
        /* vectors */\r
-       b L_all_cores_start\r
-       nop\r
-       nop\r
-       nop\r
-       nop\r
-       nop\r
-       nop\r
-       nop\r
-\r
-       /* comm chan */\r
-       nop\r
-       nop\r
-       nop\r
-       nop\r
-\r
-L_all_cores_start:\r
-        /* check CPU id */\r
-       mrc p15, 0, r0, c0, c0, 5       @ read MPIDR
-       and r3, r0, #0xc0000000         @ multiprocessing extensions and
-       teq r3, #0x80000000             @ not part of a uniprocessor system?
-       bne L_core0                     @ no, assume UP
-       ands r0, r0, #0x03              @ CPU 0?
-       bne L_deadloop                  @ if not, spin.
-
-L_core0:\r
-       mov sp, #0x2000000\r
-       b _firmware_rendezvous\r
+       b _common_start /* reset */\r
+       b _fleh_undef /* undefined */\r
+       b _secure_monitor /* swi/smc */\r
+       b _fleh_prefabt /* prefetch abort */\r
+       b _fleh_dataabt /* data abort */\r
+       b _fleh_addrexc /* reserved */\r
+       b _fleh_irq /* irq */\r
+       b _fleh_fiq /* fiq */\r
+\r
+.globl g_FirmwareData\r
+g_FirmwareData:\r
+       .long 0 /* SDRAM capacity */\r
+       .long 0 /* VPU CPUID */\r
+       .long 0 /* Reserved */\r
+       .long 0 /* Reserved */\r
+       .long 0 /* Reserved */\r
+\r
+#define SaveRegisters() \\r
+       mov sp, #(MEM_STACK_END); \\r
+       stmea sp, {r0-lr}^; \\r
+       str lr, [sp, #60]; \\r
+       mrs r0, spsr\r
+       str r0, [sp, #64];\r
+\r
+_fleh_undef:\r
+       SaveRegisters()\r
+       b sleh_undef\r
+\r
+_fleh_prefabt:\r
+       SaveRegisters()\r
+       b sleh_prefabt\r
+\r
+_fleh_dataabt:\r
+       SaveRegisters()\r
+       b sleh_dataabt\r
+\r
+_fleh_addrexc:\r
+       SaveRegisters()\r
+       b sleh_addrexc\r
+\r
+_fleh_irq:\r
+       SaveRegisters()\r
+       b sleh_irq\r
+\r
+_fleh_fiq:\r
+       SaveRegisters()\r
+       b sleh_fiq\r
+\r
+_secure_monitor:\r
+       mrc p15, 0, r0, c1, c1, 0\r
+       //bic   r0, r0, #0x4a /* clear IRQ, EA, nET */\r
+       orr r0, r0, #1 /* set NS */\r
+       mcr p15, 0, r0, c1, c1, 0\r
+\r
+       //mov r0, #((1 << 7) | (1 << 8) | (1 << 6)) /* mask IRQ, AA and FIQ */\r
+       //orr r0, r0, #0x1a /* switch to hypervisor mode */\r
+       //msr spsr_cxfs, r0 \r
+\r
+       movs pc, lr\r
+\r
+_common_start:\r
+       /*\r
+        * read MIDR, see if this is an ARMv6 system, if it is, just\r
+        * assume single core (BCM2708) and not bother doing SMP stuff.\r
+        */\r
+       mrc p15, 0, r0, c0, c0, 0\r
+       lsr r0, #16\r
+       and r0, #0xF\r
+       cmp r0, #0x7\r
+       mov r12, #0\r
+       beq L_finish_init\r
+\r
+L_armv7_or_higher:\r
+       /*\r
+        * okay, we're an ARMv7 or an ARMv8.\r
+        */\r
+       mrc p15, 0, r0, c0, c0, 5       // read MPIDR\r
+       and r3, r0, #0xc0000000         // multiprocessing extensions and\r
+       teq r3, #0x80000000                     // not part of a uniprocessor system?\r
+       bne L_setup_monitor                     // no, assume UP\r
+       ands r0, r0, #0x03                      // CPU 0?\r
+       bne L_deadloop                          // if not, spin.\r
+\r
+L_setup_monitor:\r
+       adr     r1, _start\r
+       //mcr   p15, 0, r1, c12, c0, 1 /* MVBAR */\r
+       //mcr p15, 0, r1, c7, c5, 4 /* ISB (ARMv6 compatible way) */\r
+\r
+       mrc p15, 0, r0, c1, c1, 0\r
+       orr r0, r0, #1 /* set NS */\r
+       mcr p15, 0, r0, c1, c1, 0\r
+\r
+       mov r12, #1\r
+       //smc 0\r
+       \r
+L_finish_init:\r
+       /* enable instruction cache */\r
+       //mrc p15, 0, r0, c1, c0, 0\r
+       //orr r0, r0, #(1<<12)\r
+       //mcr p15, 0, r0, c1, c0, 0\r
+\r
+       mov sp, #(MEM_STACK_END)\r
+       mov r0, r12\r
+       b main\r
 \r
 L_deadloop:\r
+       cpsie if\r
+       wfi\r
        b L_deadloop\r
This page took 0.078955 seconds and 4 git commands to generate.