summaryrefslogtreecommitdiff
path: root/sys/src/9/bcm64/rebootcode.s
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2019-05-13 19:20:21 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2019-05-13 19:20:21 +0200
commita3b5e3994f7f2897ab1b5bb20b91224d145c1fc1 (patch)
treeceea2105303a45715bb44151be9b9420aad179bb /sys/src/9/bcm64/rebootcode.s
parent3b36daa2bb8c0f4169455baf829b9695b520c5fc (diff)
bcm64: implement reboot support
Diffstat (limited to 'sys/src/9/bcm64/rebootcode.s')
-rw-r--r--sys/src/9/bcm64/rebootcode.s51
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