add basic secure monitor code for armv7+, for some reason sdram security does not...
[rpi-open-firmware.git] / arm_chainloader / start.s
index 183f033..124f9c9 100644 (file)
@@ -24,37 +24,83 @@ the boot process.
 \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
-L_all_cores_start:\r
-        /* check CPU id */\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_core0                     @ no, assume UP\r
-       ands r0, r0, #0x03              @ CPU 0?\r
-       bne L_deadloop                  @ if not, spin.\r
-\r
-L_core0:\r
-       mov sp, #(MEM_STACK_END)\r
+       b _common_start /* reset */\r
+       nop /* undefined */\r
+       b _secure_monitor /* swi/smc */\r
+       nop /* prefetch abort */\r
+       nop /* data abort */\r
+       nop /* reserved */\r
+       nop /* irq */\r
+       nop /* 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
+_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
-        /* we are loaded in secure supervisor mode -- drop permissions */\r
-        mrc p15, 0, r0, c1, c1, 0\r
-        orr r0, r0, #1\r
-        mcr p15, 0, r0, c1, c1, 0\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
+       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.03933 seconds and 4 git commands to generate.