sneaking up on richard's version Reference: /n/atom/patch/applied/pireboot2 Date: Tue Jan 5 04:44:10 CET 2016 Signed-off-by: quanstro@quanstro.net --- /sys/src/9/bcm/rebootcode.s Tue Jan 5 04:43:59 2016 +++ /sys/src/9/bcm/rebootcode.s Tue Jan 5 04:44:00 2016 @@ -3,6 +3,11 @@ */ #include "arm.s" +#define PTEDRAM (Dom0|L1AP(Krw)|Section) + +#define WFI WORD $0xe320f003 /* wait for interrupt */ +#define WFE WORD $0xe320f002 /* wait for event */ + /* * Turn off MMU, then copy the new kernel to its correct location * in physical memory. Then jump to the start of the kernel. @@ -15,7 +20,7 @@ /* copy in arguments before stack gets unmapped */ MOVW R0, R8 /* entry point */ MOVW p2+4(FP), R9 /* source */ - MOVW n+8(FP), R10 /* byte count */ + MOVW n+8(FP), R6 /* byte count */ /* SVC mode, interrupts disabled */ MOVW $(PsrDirq|PsrDfiq|PsrMsvc), R1 @@ -29,6 +34,28 @@ BIC $CpCmmu, R1 MCR CpSC, 0, R1, C(CpCONTROL), C(0), CpMainctl + /* continue with reboot only on cpu0 */ + CPUID(R2) + BEQ bootcpu + + /* other cpus wait for inter processor interrupt from cpu0 */ + /* turn icache back on */ + MRC CpSC, 0, R1, C(CpCONTROL), C(0), CpMainctl + ORR $(CpCicache), R1 + MCR CpSC, 0, R1, C(CpCONTROL), C(0), CpMainctl + BARRIERS +dowfi: + WFI + MOVW $0x40000060, R1 + ADD R2<<2, R1 + MOVW 0(R1), R0 + AND $0x10, R0 + BEQ dowfi + MOVW $0x8000, R1 + BL (R1) + B dowfi + +bootcpu: /* set up a tiny stack for local vars and memmove args */ MOVW R8, SP /* stack top just before kernel dest */ SUB $20, SP /* allocate stack frame */ @@ -37,7 +64,7 @@ MOVW R8, 16(SP) /* save dest (entry point) */ MOVW R8, R0 /* first arg is dest */ MOVW R9, 8(SP) /* push src */ - MOVW R10, 12(SP) /* push size */ + MOVW R6, 12(SP) /* push size */ BL memmove(SB) MOVW 16(SP), R8 /* restore entry point */ @@ -52,16 +79,12 @@ */ TEXT cachesoff(SB), 1, $-4 - /* write back and invalidate caches */ - BARRIERS - MOVW $0, R0 - MCR CpSC, 0, R0, C(CpCACHE), C(CpCACHEwbi), CpCACHEall - MCR CpSC, 0, R0, C(CpCACHE), C(CpCACHEinvi), CpCACHEall - /* turn caches off */ MRC CpSC, 0, R1, C(CpCONTROL), C(0), CpMainctl BIC $(CpCdcache|CpCicache|CpCpredict), R1 MCR CpSC, 0, R1, C(CpCONTROL), C(0), CpMainctl + MOVW $0, R0 + MCR CpSC, 0, R0, C(CpCACHE), C(CpCACHEinvi), CpCACHEall /* invalidate stale TLBs before changing them */ BARRIERS