]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/bcm64/l.s
bcm64: no need to flush instruction cache when switching TTBR0
[plan9front.git] / sys / src / 9 / bcm64 / l.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-KZERO(SB), R28
9         BL      svcmode<>(SB)
10
11         /* use dedicated stack pointer per exception level */
12         MOVWU   $1, R1
13         MSR     R1, SPSel
14
15         BL      mmudisable<>(SB)
16
17         /* invalidate local caches */
18         BL      cachedinv(SB)
19         BL      cacheiinv(SB)
20
21         MOV     $(MACHADDR(0)-KZERO), R27
22         MRS     MPIDR_EL1, R1
23         ANDW    $(MAXMACH-1), R1
24         MOVWU   $MACHSIZE, R2
25         MULW    R1, R2, R2
26         SUB     R2, R27
27
28         ADD     $(MACHSIZE-16), R27, R2
29         MOV     R2, SP
30
31         CBNZ    R1, _startup
32
33         /* clear page table and machs */
34         MOV     $(L1-KZERO), R1
35         MOV     $(MACHADDR(-1)-KZERO), R2
36 _zerol1:
37         MOV     ZR, (R1)8!
38         CMP     R1, R2
39         BNE     _zerol1
40
41         /* clear BSS */
42         MOV     $edata-KZERO(SB), R1
43         MOV     $end-KZERO(SB), R2
44 _zerobss:
45         MOV     ZR, (R1)8!
46         CMP     R1, R2
47         BNE     _zerobss
48
49         /* setup page tables */
50         MOV     $(L1-KZERO), R0
51         BL      mmu0init(SB)
52
53         SEVL
54 _startup:
55         WFE
56         BL      mmuenable<>(SB)
57
58         MOV     $0, R26
59         ORR     $KZERO, R27
60         MSR     R27, TPIDR_EL1
61         MOV     $setSB(SB), R28
62
63         BL      main(SB)
64
65 TEXT    stop<>(SB), 1, $-4
66 _stop:
67         WFE
68         B       _stop
69
70 TEXT sev(SB), 1, $-4
71         SEV
72         WFE
73         RETURN
74
75 TEXT PUTC(SB), 1, $-4
76         MOVWU $(0x3F000000+0x215040), R14
77         MOVB R0, (R14)
78         RETURN
79
80 TEXT svcmode<>(SB), 1, $-4
81         MSR     $0xF, DAIFSet
82         MRS     CurrentEL, R0
83         ANDW    $(3<<2), R0
84         CMPW    $(1<<2), R0
85         BEQ     el1
86         CMPW    $(2<<2), R0
87         BEQ     el2
88         B       stop<>(SB)
89 el2:
90         MOV     $0, R0
91         MSR     R0, MDCR_EL2
92         ISB     $SY
93
94         /* HCR = RW, HCD, SWIO, BSU, FB */
95         MOVWU   $(1<<31 | 1<<29 | 1<<2 | 0<<10 | 0<<9), R0
96         MSR     R0, HCR_EL2
97         ISB     $SY
98
99         /* SCTLR = RES1 */
100         MOVWU   $(3<<4 | 1<<11 | 1<<16 | 1<<18 | 3<<22 | 3<<28), R0
101         ISB     $SY
102         MSR     R0, SCTLR_EL2
103         ISB     $SY
104
105         /* set VMID to zero */
106         MOV     $0, R0
107         MSR     R0, VTTBR_EL2
108         ISB     $SY
109
110         MOVWU   $(0xF<<6 | 4), R0
111         MSR     R0, SPSR_EL2
112         MSR     LR, ELR_EL2
113         ERET
114 el1:
115         RETURN
116
117 TEXT mmudisable<>(SB), 1, $-4
118 #define SCTLRCLR \
119         /* RES0 */      ( 3<<30 \
120         /* RES0 */      | 1<<27 \
121         /* UCI */       | 1<<26 \
122         /* EE */        | 1<<25 \
123         /* RES0 */      | 1<<21 \
124         /* E0E */       | 1<<24 \
125         /* WXN */       | 1<<19 \
126         /* nTWE */      | 1<<18 \
127         /* RES0 */      | 1<<17 \
128         /* nTWI */      | 1<<16 \
129         /* UCT */       | 1<<15 \
130         /* DZE */       | 1<<14 \
131         /* RES0 */      | 1<<13 \
132         /* RES0 */      | 1<<10 \
133         /* UMA */       | 1<<9 \
134         /* SA0 */       | 1<<4 \
135         /* SA */        | 1<<3 \
136         /* A */         | 1<<1 )
137 #define SCTLRSET \
138         /* RES1 */      ( 3<<28 \
139         /* RES1 */      | 3<<22 \
140         /* RES1 */      | 1<<20 \
141         /* RES1 */      | 1<<11 )
142 #define SCTLRMMU \
143         /* I */         ( 1<<12 \
144         /* C */         | 1<<2 \
145         /* M */         | 1<<0 )
146
147         /* initialise SCTLR, MMU and caches off */
148         ISB     $SY
149         MRS     SCTLR_EL1, R0
150         BIC     $(SCTLRCLR | SCTLRMMU), R0
151         ORR     $SCTLRSET, R0
152         ISB     $SY
153         MSR     R0, SCTLR_EL1
154         ISB     $SY
155
156         B       flushlocaltlb(SB)
157
158 TEXT mmuenable<>(SB), 1, $-4
159         /* return to virtual */
160         ORR     $KZERO, LR
161         MOV     LR, -16(RSP)!
162
163         BL      flushlocaltlb(SB)
164
165         /* memory attributes */
166 #define MAIRINIT \
167         ( 0xFF << MA_MEM_WB*8 \
168         | 0x33 << MA_MEM_WT*8 \
169         | 0x44 << MA_MEM_UC*8 \
170         | 0x00 << MA_DEV_nGnRnE*8 \
171         | 0x04 << MA_DEV_nGnRE*8 \
172         | 0x08 << MA_DEV_nGRE*8 \
173         | 0x0C << MA_DEV_GRE*8 )
174         MOV     $MAIRINIT, R1
175         MSR     R1, MAIR_EL1
176         ISB     $SY
177
178         /* translation control */
179 #define TCRINIT \
180         /* TBI1 */      ( 0<<38 \
181         /* TBI0 */      | 0<<37 \
182         /* AS */        | 0<<36 \
183         /* TG1 */       | (((3<<16|1<<14|2<<12)>>PGSHIFT)&3)<<30 \
184         /* SH1 */       | SHARE_INNER<<28 \
185         /* ORGN1 */     | CACHE_WB<<26 \
186         /* IRGN1 */     | CACHE_WB<<24 \
187         /* EPD1 */      | 0<<23 \
188         /* A1 */        | 0<<22 \
189         /* T1SZ */      | (64-EVASHIFT)<<16 \
190         /* TG0 */       | (((1<<16|2<<14|0<<12)>>PGSHIFT)&3)<<14 \
191         /* SH0 */       | SHARE_INNER<<12 \
192         /* ORGN0 */     | CACHE_WB<<10 \
193         /* IRGN0 */     | CACHE_WB<<8 \
194         /* EPD0 */      | 0<<7 \
195         /* T0SZ */      | (64-EVASHIFT)<<0 )
196         MOV     $TCRINIT, R1
197         MRS     ID_AA64MMFR0_EL1, R2
198         ANDW    $0x7, R2        // PARange
199         ADD     R2<<32, R1      // IPS
200         MSR     R1, TCR_EL1
201         ISB     $SY
202
203         /* load the page tables */
204         MOV     $(L1TOP-KZERO), R0
205         ISB     $SY
206         MSR     R0, TTBR0_EL1
207         MSR     R0, TTBR1_EL1
208         ISB     $SY
209
210         /* enable MMU and caches */
211         MRS     SCTLR_EL1, R1
212         ORR     $SCTLRMMU, R1
213         ISB     $SY
214         MSR     R1, SCTLR_EL1
215         ISB     $SY
216
217         MOV     RSP, R1
218         ORR     $KZERO, R1
219         MOV     R1, RSP
220         MOV     (RSP)16!, LR
221         B       cacheiinv(SB)
222
223 TEXT touser(SB), 1, $-4
224         MSR     $0x3, DAIFSet   // interrupts off
225         MOVWU   $0x10028, R1    // entry
226         MOVWU   $0, R2          // psr
227         MSR     R0, SP_EL0      // sp
228         MSR     R1, ELR_EL1
229         MSR     R2, SPSR_EL1
230         ERET
231
232 TEXT cas(SB), 1, $-4
233 TEXT cmpswap(SB), 1, $-4
234         MOVW    ov+8(FP), R1
235         MOVW    nv+16(FP), R2
236 _cas1:
237         LDXRW   (R0), R3
238         CMP     R3, R1
239         BNE     _cas0
240         STXRW   R2, (R0), R4
241         CBNZ    R4, _cas1
242         MOVW    $1, R0
243         DMB     $ISH
244         RETURN
245 _cas0:
246         CLREX
247         MOVW    $0, R0
248         RETURN
249
250 TEXT tas(SB), 1, $-4
251 TEXT _tas(SB), 1, $-4
252         MOVW    $0xdeaddead, R2
253 _tas1:
254         LDXRW   (R0), R1
255         STXRW   R2, (R0), R3
256         CBNZ    R3, _tas1
257         MOVW    R1, R0
258
259 TEXT coherence(SB), 1, $-4
260         DMB     $ISH
261         RETURN
262
263 TEXT islo(SB), 1, $-4
264         MRS     DAIF, R0
265         AND     $(0x2<<6), R0
266         EOR     $(0x2<<6), R0
267         RETURN
268
269 TEXT splhi(SB), 1, $-4
270         MRS     DAIF, R0
271         MSR     $0x2, DAIFSet
272         RETURN
273
274 TEXT splfhi(SB), 1, $-4
275         MRS     DAIF, R0
276         MSR     $0x3, DAIFSet
277         RETURN
278
279 TEXT spllo(SB), 1, $-4
280         MSR     $0x3, DAIFClr
281         RETURN
282
283 TEXT splflo(SB), 1, $-4
284         MSR     $0x1, DAIFClr
285         RETURN
286
287 TEXT splx(SB), 1, $-4
288         MSR     R0, DAIF
289         RETURN
290
291 TEXT idlehands(SB), 1, $-4
292         DMB     $ISH
293         MOV     $nrdy(SB), R1
294         LDXRW   (R1), R0
295         CBZ     R0, _goodnight
296         CLREX
297         SEVL
298 _goodnight:
299         WFE
300         RETURN
301
302 TEXT cycles(SB), 1, $-4
303 TEXT lcycles(SB), 1, $-4
304         MRS     PMCCNTR_EL0, R0
305         RETURN
306
307 TEXT setlabel(SB), 1, $-4
308         MOV     LR, 8(R0)
309         MOV     SP, R1
310         MOV     R1, 0(R0)
311         MOVW    $0, R0
312         RETURN
313
314 TEXT gotolabel(SB), 1, $-4
315         MOV     8(R0), LR       /* link */
316         MOV     0(R0), R1       /* sp */
317         MOV     R1, SP
318         MOVW    $1, R0
319         RETURN
320
321 TEXT returnto(SB), 1, $-4
322         MOV     R0, 0(SP)
323         RETURN
324
325 TEXT getfar(SB), 1, $-4
326         MRS     FAR_EL1, R0
327         RETURN
328
329 TEXT setttbr(SB), 1, $-4
330         DSB     $ISHST
331         MSR     R0, TTBR0_EL1
332         DSB     $ISH
333         ISB     $SY
334         RETURN
335
336 /*
337  * TLB maintenance operations.
338  * these broadcast to all cpu's in the cluser
339  * (inner sharable domain).
340  */
341 TEXT flushasidva(SB), 1, $-4
342 TEXT tlbivae1is(SB), 1, $-4
343         DSB     $ISHST
344         TLBI    R0, 0,8,3,1     /* VAE1IS */
345         DSB     $ISH
346         ISB     $SY
347         RETURN
348
349 TEXT flushasidvall(SB), 1, $-4
350 TEXT tlbivale1is(SB), 1, $-4
351         DSB     $ISHST
352         TLBI    R0, 0,8,3,5     /* VALE1IS */
353         DSB     $ISH
354         ISB     $SY
355         RETURN
356
357 TEXT flushasid(SB), 1, $-4
358 TEXT tlbiaside1is(SB), 1, $-4
359         DSB     $ISHST
360         TLBI    R0, 0,8,3,2     /* ASIDE1IS */
361         DSB     $ISH
362         ISB     $SY
363         RETURN
364
365 TEXT flushtlb(SB), 1, $-4
366 TEXT tlbivmalle1is(SB), 1, $-4
367         DSB     $ISHST
368         TLBI    R0, 0,8,3,0     /* VMALLE1IS */
369         DSB     $ISH
370         ISB     $SY
371         RETURN
372
373 /*
374  * flush the tlb of this cpu. no broadcast.
375  */
376 TEXT flushlocaltlb(SB), 1, $-4
377 TEXT tlbivmalle1(SB), 1, $-4
378         DSB     $NSHST
379         TLBI    R0, 0,8,7,0     /* VMALLE1 */
380         DSB     $NSH
381         ISB     $SY
382         RETURN
383
384 TEXT fpsaveregs(SB), 1, $-4
385         WORD    $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 0)  /* MOV { V0, V1, V2, V3  }, (R0)64! */
386         WORD    $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 4)  /* MOV { V4, V5, V6, V7  }, (R0)64! */
387         WORD    $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 8)  /* MOV { V8, V9, V10,V11 }, (R0)64! */
388         WORD    $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 12) /* MOV { V12,V13,V14,V15 }, (R0)64! */
389         WORD    $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 16) /* MOV { V16,V17,V18,V19 }, (R0)64! */
390         WORD    $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 20) /* MOV { V20,V21,V22,V23 }, (R0)64! */
391         WORD    $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 24) /* MOV { V24,V25,V26,V27 }, (R0)64! */
392         WORD    $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 28) /* MOV { V28,V29,V30,V31 }, (R0)64! */
393         RETURN
394
395 TEXT fploadregs(SB), 1, $-4
396         WORD    $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 0)  /* MOV (R0)64!, { V0, V1, V2, V3  } */
397         WORD    $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 4)  /* MOV (R0)64!, { V4, V5, V6, V7  } */
398         WORD    $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 8)  /* MOV (R0)64!, { V8, V9, V10,V11 } */
399         WORD    $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 12) /* MOV (R0)64!, { V12,V13,V14,V15 } */
400         WORD    $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 16) /* MOV (R0)64!, { V16,V17,V18,V19 } */
401         WORD    $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 20) /* MOV (R0)64!, { V20,V21,V22,V23 } */
402         WORD    $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 24) /* MOV (R0)64!, { V24,V25,V26,V27 } */
403         WORD    $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 28) /* MOV (R0)64!, { V28,V29,V30,V31 } */
404         RETURN
405
406 // syscall or trap from EL0
407 TEXT vsys0(SB), 1, $-4
408         LSRW    $26, R0, R17    // ec
409         CMPW    $0x15, R17      // SVC trap?
410         BNE     _itsatrap       // nope.
411
412         MOVP    R26, R27, 224(RSP)
413         MOVP    R28, R29, 240(RSP)
414
415         MRS     SP_EL0, R1
416         MRS     ELR_EL1, R2
417         MRS     SPSR_EL1, R3
418
419         MOV     R0, 288(RSP)    // type
420         MOV     R1, 264(RSP)    // sp
421         MOV     R2, 272(RSP)    // pc
422         MOV     R3, 280(RSP)    // psr
423
424         MOV     $setSB(SB), R28
425         MRS     TPIDR_EL1, R27
426         MOV     16(R27), R26
427
428         ADD     $16, RSP, R0    // ureg
429         BL      syscall(SB)
430
431 TEXT forkret(SB), 1, $-4
432         MSR     $0x3, DAIFSet   // interrupts off
433
434         ADD     $16, RSP, R0    // ureg
435
436         MOV     16(RSP), R0     // ret
437         MOV     264(RSP), R1    // sp
438         MOV     272(RSP), R2    // pc
439         MOV     280(RSP), R3    // psr
440
441         MSR     R1, SP_EL0
442         MSR     R2, ELR_EL1
443         MSR     R3, SPSR_EL1
444
445         MOVP    224(RSP), R26, R27
446         MOVP    240(RSP), R28, R29
447
448         MOV     256(RSP), R30   // link
449
450         ADD     $TRAPFRAMESIZE, RSP
451         ERET
452
453 TEXT itsatrap<>(SB), 1, $-4
454 _itsatrap:
455         MOVP    R1, R2, 24(RSP)
456         MOVP    R3, R4, 40(RSP)
457         MOVP    R5, R6, 56(RSP)
458         MOVP    R7, R8, 72(RSP)
459         MOVP    R9, R10, 88(RSP)
460         MOVP    R11, R12, 104(RSP)
461         MOVP    R13, R14, 120(RSP)
462         MOVP    R15, R16, 136(RSP)
463
464         MOVP    R18, R19, 160(RSP)
465         MOVP    R20, R21, 176(RSP)
466         MOVP    R22, R23, 192(RSP)
467         MOVP    R24, R25, 208(RSP)
468
469 // trap/irq/fiq/serr from EL0
470 TEXT vtrap0(SB), 1, $-4
471         MOVP    R26, R27, 224(RSP)
472         MOVP    R28, R29, 240(RSP)
473
474         MRS     SP_EL0, R1
475         MRS     ELR_EL1, R2
476         MRS     SPSR_EL1, R3
477
478         MOV     R0, 288(RSP)    // type
479         MOV     R1, 264(RSP)    // sp
480         MOV     R2, 272(RSP)    // pc
481         MOV     R3, 280(RSP)    // psr
482
483         MOV     $setSB(SB), R28
484         MRS     TPIDR_EL1, R27
485         MOV     16(R27), R26
486
487         ADD     $16, RSP, R0    // ureg
488         BL      trap(SB)
489
490 TEXT noteret(SB), 1, $-4
491         MSR     $0x3, DAIFSet   // interrupts off
492
493         ADD     $16, RSP, R0    // ureg
494
495         MOV     264(RSP), R1    // sp
496         MOV     272(RSP), R2    // pc
497         MOV     280(RSP), R3    // psr
498
499         MSR     R1, SP_EL0
500         MSR     R2, ELR_EL1
501         MSR     R3, SPSR_EL1
502
503         MOVP    224(RSP), R26, R27
504         MOVP    240(RSP), R28, R29
505
506 _intrreturn:
507         MOVP    16(RSP), R0, R1
508         MOVP    32(RSP), R2, R3
509         MOVP    48(RSP), R4, R5
510         MOVP    64(RSP), R6, R7
511         MOVP    80(RSP), R8, R9
512         MOVP    96(RSP), R10, R11
513         MOVP    112(RSP), R12, R13
514         MOVP    128(RSP), R14, R15
515         MOVP    144(RSP), R16, R17
516         MOVP    160(RSP), R18, R19
517         MOVP    176(RSP), R20, R21
518         MOVP    192(RSP), R22, R23
519         MOVP    208(RSP), R24, R25
520
521         MOV     256(RSP), R30   // link
522
523         ADD     $TRAPFRAMESIZE, RSP
524         ERET
525
526 // irq/fiq/trap/serr from EL1
527 TEXT vtrap1(SB), 1, $-4
528         MOV     R29, 248(RSP)   // special
529
530         ADD     $TRAPFRAMESIZE, RSP, R1
531         MRS     ELR_EL1, R2
532         MRS     SPSR_EL1, R3
533
534         MOV     R0, 288(RSP)    // type
535         MOV     R1, 264(RSP)    // sp
536         MOV     R2, 272(RSP)    // pc
537         MOV     R3, 280(RSP)    // psr
538
539         ADD     $16, RSP, R0    // ureg
540         BL      trap(SB)
541
542         MSR     $0x3, DAIFSet   // interrupts off
543
544         MOV     272(RSP), R2    // pc
545         MOV     280(RSP), R3    // psr
546
547         MSR     R2, ELR_EL1
548         MSR     R3, SPSR_EL1
549
550         MOV     248(RSP), R29   // special
551         B       _intrreturn     
552
553 // vector tables
554 TEXT vsys(SB), 1, $-4
555         SUB     $TRAPFRAMESIZE, RSP
556
557         MOV     R0, 16(RSP)
558         MOV     R30, 256(RSP)   // link
559
560         MOV     R17, 152(RSP)   // temp
561
562         MRS     ESR_EL1, R0     // type
563
564 _vsyspatch:
565         B       _vsyspatch      // branch to vsys0() patched in
566
567 TEXT vtrap(SB), 1, $-4
568         SUB     $TRAPFRAMESIZE, RSP
569
570         MOVP    R0, R1, 16(RSP)
571         MOVP    R2, R3, 32(RSP)
572         MOVP    R4, R5, 48(RSP)
573         MOVP    R6, R7, 64(RSP)
574         MOVP    R8, R9, 80(RSP)
575         MOVP    R10, R11, 96(RSP)
576         MOVP    R12, R13, 112(RSP)
577         MOVP    R14, R15, 128(RSP)
578         MOVP    R16, R17, 144(RSP)
579         MOVP    R18, R19, 160(RSP)
580         MOVP    R20, R21, 176(RSP)
581         MOVP    R22, R23, 192(RSP)
582         MOVP    R24, R25, 208(RSP)
583
584         MOV     R30, 256(RSP)   // link
585
586         MRS     ESR_EL1, R0     // type
587
588 _vtrappatch:
589         B       _vtrappatch     // branch to vtrapX() patched in
590
591 TEXT virq(SB), 1, $-4
592         SUB     $TRAPFRAMESIZE, RSP
593
594         MOVP    R0, R1, 16(RSP)
595         MOVP    R2, R3, 32(RSP)
596         MOVP    R4, R5, 48(RSP)
597         MOVP    R6, R7, 64(RSP)
598         MOVP    R8, R9, 80(RSP)
599         MOVP    R10, R11, 96(RSP)
600         MOVP    R12, R13, 112(RSP)
601         MOVP    R14, R15, 128(RSP)
602         MOVP    R16, R17, 144(RSP)
603         MOVP    R18, R19, 160(RSP)
604         MOVP    R20, R21, 176(RSP)
605         MOVP    R22, R23, 192(RSP)
606         MOVP    R24, R25, 208(RSP)
607
608         MOV     R30, 256(RSP)   // link
609
610         MOV     $(1<<32), R0    // type irq
611
612 _virqpatch:
613         B       _virqpatch      // branch to vtrapX() patched in
614
615 TEXT vfiq(SB), 1, $-4
616         SUB     $TRAPFRAMESIZE, RSP
617
618         MOVP    R0, R1, 16(RSP)
619         MOVP    R2, R3, 32(RSP)
620         MOVP    R4, R5, 48(RSP)
621         MOVP    R6, R7, 64(RSP)
622         MOVP    R8, R9, 80(RSP)
623         MOVP    R10, R11, 96(RSP)
624         MOVP    R12, R13, 112(RSP)
625         MOVP    R14, R15, 128(RSP)
626         MOVP    R16, R17, 144(RSP)
627         MOVP    R18, R19, 160(RSP)
628         MOVP    R20, R21, 176(RSP)
629         MOVP    R22, R23, 192(RSP)
630         MOVP    R24, R25, 208(RSP)
631
632         MOV     R30, 256(RSP)   // link
633         MOV     $(2<<32), R0    // type fiq
634
635 _vfiqpatch:
636         B       _vfiqpatch      // branch to vtrapX() patched in
637
638 TEXT vserr(SB), 1, $-4
639         SUB     $TRAPFRAMESIZE, RSP
640
641         MOVP    R0, R1, 16(RSP)
642         MOVP    R2, R3, 32(RSP)
643         MOVP    R4, R5, 48(RSP)
644         MOVP    R6, R7, 64(RSP)
645         MOVP    R8, R9, 80(RSP)
646         MOVP    R10, R11, 96(RSP)
647         MOVP    R12, R13, 112(RSP)
648         MOVP    R14, R15, 128(RSP)
649         MOVP    R16, R17, 144(RSP)
650         MOVP    R18, R19, 160(RSP)
651         MOVP    R20, R21, 176(RSP)
652         MOVP    R22, R23, 192(RSP)
653         MOVP    R24, R25, 208(RSP)
654
655         MOV     R30, 256(RSP)   // link
656
657         MRS     ESR_EL1, R0
658         ORR     $(3<<32), R0    // type
659 _vserrpatch:
660         B       _vserrpatch     // branch to vtrapX() patched in