]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/bcm64/rebootcode.s
amd64: FP: always use enough to fit AVX state and align to 64 bytes
[plan9front.git] / sys / src / 9 / bcm64 / rebootcode.s
1 #include "mem.h"
2 #include "sysreg.h"
3
4 #undef  SYSREG
5 #define SYSREG(op0,op1,Cn,Cm,op2)       SPR(((op0)<<19|(op1)<<16|(Cn)<<12|(Cm)<<8|(op2)<<5))
6
7 TEXT _start(SB), 1, $-4
8         MOV     $setSB(SB), R28
9
10         MRS     MPIDR_EL1, R27
11         ANDW    $(MAXMACH-1), R27
12         LSL     $3, R27
13         ADD     $(SPINTABLE-KZERO), R27
14
15         CBZ     R0, _mmuoff
16         MOV     R0, (R27)
17         MOV     code+8(FP), R1
18         MOVWU   size+16(FP), R2
19         BIC     $3, R2
20         ADD     R1, R2, R3
21
22 _copy:
23         MOVW    (R1)4!, R4
24         MOVW    R4, (R0)4!
25         CMP     R1, R3
26         BNE     _copy
27
28         BL      cachedwbinv(SB)
29         BL      l2cacheuwbinv(SB)
30         SEVL
31
32 _mmuoff:
33         ISB     $SY
34         MRS     SCTLR_EL1, R0
35         BIC     $(1<<0 | 1<<2 | 1<<12), R0
36         ISB     $SY
37         MSR     R0, SCTLR_EL1
38         ISB     $SY
39
40         DSB     $NSHST
41         TLBI    R0, 0,8,7,0     /* VMALLE1 */
42         DSB     $NSH
43         ISB     $SY
44
45         BL      cachedwbinv(SB)
46         BL      cacheiinv(SB)
47
48         MOVWU   $0, R0
49         MOVWU   $0, R1
50         MOVWU   $0, R2
51         MOVWU   $0, R3
52 _wait:
53         WFE
54         MOV     (R27), LR
55         CBZ     LR, _wait
56         RETURN