diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-05-13 19:20:21 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-05-13 19:20:21 +0200 |
commit | a3b5e3994f7f2897ab1b5bb20b91224d145c1fc1 (patch) | |
tree | ceea2105303a45715bb44151be9b9420aad179bb /sys/src/9/bcm64/rebootcode.s | |
parent | 3b36daa2bb8c0f4169455baf829b9695b520c5fc (diff) |
bcm64: implement reboot support
Diffstat (limited to 'sys/src/9/bcm64/rebootcode.s')
-rw-r--r-- | sys/src/9/bcm64/rebootcode.s | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/sys/src/9/bcm64/rebootcode.s b/sys/src/9/bcm64/rebootcode.s new file mode 100644 index 000000000..b3eb307ac --- /dev/null +++ b/sys/src/9/bcm64/rebootcode.s @@ -0,0 +1,51 @@ +#include "mem.h" +#include "sysreg.h" + +#undef SYSREG +#define SYSREG(op0,op1,Cn,Cm,op2) SPR(((op0)<<19|(op1)<<16|(Cn)<<12|(Cm)<<8|(op2)<<5)) + +TEXT _start(SB), 1, $-4 + MOV $setSB(SB), R28 + + MRS MPIDR_EL1, R27 + ANDW $(MAXMACH-1), R27 + LSL $3, R27 + ADD $(SPINTABLE-KZERO), R27 + + CBZ R0, _mmuoff + MOV R0, (R27) + MOV code+8(FP), R1 + MOVWU size+16(FP), R2 + BIC $3, R2 + ADD R1, R2, R3 + +_copy: + MOVW (R1)4!, R4 + MOVW R4, (R0)4! + CMP R1, R3 + BNE _copy + + BL cachedwbinv(SB) + BL l2cacheuwbinv(SB) + SEVL + +_mmuoff: + ISB $SY + MRS SCTLR_EL1, R0 + BIC $(1<<0 | 1<<2 | 1<<12), R0 + ISB $SY + MSR R0, SCTLR_EL1 + ISB $SY + + DSB $NSHST + TLBI R0, 0,8,7,0 /* VMALLE1 */ + DSB $NSH + ISB $SY + + BL cachedwbinv(SB) + BL cacheiinv(SB) +_wait: + WFE + MOV (R27), LR + CBZ LR, _wait + RETURN |