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