5 #define SYSREG(op0,op1,Cn,Cm,op2) SPR(((op0)<<19|(op1)<<16|(Cn)<<12|(Cm)<<8|(op2)<<5))
7 TEXT _start(SB), 1, $-4
8 MOV $setSB-KZERO(SB), R28
11 /* use dedicated stack pointer per exception level */
17 /* invalidate local caches */
21 MOV $(MACHADDR(0)-KZERO), R27
28 ADD $(MACHSIZE-16), R27, R2
33 /* clear page table and machs */
35 MOV $(MACHADDR(-1)-KZERO), R2
42 MOV $edata-KZERO(SB), R1
43 MOV $end-KZERO(SB), R2
49 /* setup page tables */
65 TEXT stop<>(SB), 1, $-4
76 MOVWU $(0x3F000000+0x215040), R14
80 TEXT svcmode<>(SB), 1, $-4
94 /* HCR = RW, HCD, SWIO, BSU, FB */
95 MOVWU $(1<<31 | 1<<29 | 1<<2 | 0<<10 | 0<<9), R0
100 MOVWU $(3<<4 | 1<<11 | 1<<16 | 1<<18 | 3<<22 | 3<<28), R0
105 /* set VMID to zero */
110 MOVWU $(0xF<<6 | 4), R0
117 TEXT mmudisable<>(SB), 1, $-4
147 /* initialise SCTLR, MMU and caches off */
150 BIC $(SCTLRCLR | SCTLRMMU), R0
158 TEXT mmuenable<>(SB), 1, $-4
159 /* return to virtual */
165 /* memory attributes */
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 )
178 /* translation control */
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 \
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 \
195 /* T0SZ */ | (64-EVASHIFT)<<0 )
197 MRS ID_AA64MMFR0_EL1, R2
198 ANDW $0x7, R2 // PARange
199 ADD R2<<32, R1 // IPS
203 /* load the page tables */
204 MOV $(L1TOP-KZERO), R0
210 /* enable MMU and caches */
223 TEXT touser(SB), 1, $-4
224 MSR $0x3, DAIFSet // interrupts off
225 MOVWU $0x10028, R1 // entry
233 TEXT cmpswap(SB), 1, $-4
251 TEXT _tas(SB), 1, $-4
259 TEXT coherence(SB), 1, $-4
263 TEXT islo(SB), 1, $-4
269 TEXT splhi(SB), 1, $-4
274 TEXT splfhi(SB), 1, $-4
279 TEXT spllo(SB), 1, $-4
283 TEXT splflo(SB), 1, $-4
287 TEXT splx(SB), 1, $-4
291 TEXT idlehands(SB), 1, $-4
302 TEXT cycles(SB), 1, $-4
303 TEXT lcycles(SB), 1, $-4
307 TEXT setlabel(SB), 1, $-4
314 TEXT gotolabel(SB), 1, $-4
315 MOV 8(R0), LR /* link */
316 MOV 0(R0), R1 /* sp */
321 TEXT returnto(SB), 1, $-4
325 TEXT getfar(SB), 1, $-4
329 TEXT setttbr(SB), 1, $-4
337 * TLB maintenance operations.
338 * these broadcast to all cpu's in the cluser
339 * (inner sharable domain).
341 TEXT flushasidva(SB), 1, $-4
342 TEXT tlbivae1is(SB), 1, $-4
344 TLBI R0, 0,8,3,1 /* VAE1IS */
349 TEXT flushasidvall(SB), 1, $-4
350 TEXT tlbivale1is(SB), 1, $-4
352 TLBI R0, 0,8,3,5 /* VALE1IS */
357 TEXT flushasid(SB), 1, $-4
358 TEXT tlbiaside1is(SB), 1, $-4
360 TLBI R0, 0,8,3,2 /* ASIDE1IS */
365 TEXT flushtlb(SB), 1, $-4
366 TEXT tlbivmalle1is(SB), 1, $-4
368 TLBI R0, 0,8,3,0 /* VMALLE1IS */
374 * flush the tlb of this cpu. no broadcast.
376 TEXT flushlocaltlb(SB), 1, $-4
377 TEXT tlbivmalle1(SB), 1, $-4
379 TLBI R0, 0,8,7,0 /* VMALLE1 */
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! */
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 } */
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.
412 MOVP R26, R27, 224(RSP)
413 MOVP R28, R29, 240(RSP)
419 MOV R0, 288(RSP) // type
420 MOV R1, 264(RSP) // sp
421 MOV R2, 272(RSP) // pc
422 MOV R3, 280(RSP) // psr
428 ADD $16, RSP, R0 // ureg
431 TEXT forkret(SB), 1, $-4
432 MSR $0x3, DAIFSet // interrupts off
434 ADD $16, RSP, R0 // ureg
436 MOV 16(RSP), R0 // ret
437 MOV 264(RSP), R1 // sp
438 MOV 272(RSP), R2 // pc
439 MOV 280(RSP), R3 // psr
445 MOVP 224(RSP), R26, R27
446 MOVP 240(RSP), R28, R29
448 MOV 256(RSP), R30 // link
450 ADD $TRAPFRAMESIZE, RSP
453 TEXT itsatrap<>(SB), 1, $-4
459 MOVP R9, R10, 88(RSP)
460 MOVP R11, R12, 104(RSP)
461 MOVP R13, R14, 120(RSP)
462 MOVP R15, R16, 136(RSP)
464 MOVP R18, R19, 160(RSP)
465 MOVP R20, R21, 176(RSP)
466 MOVP R22, R23, 192(RSP)
467 MOVP R24, R25, 208(RSP)
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)
478 MOV R0, 288(RSP) // type
479 MOV R1, 264(RSP) // sp
480 MOV R2, 272(RSP) // pc
481 MOV R3, 280(RSP) // psr
487 ADD $16, RSP, R0 // ureg
490 TEXT noteret(SB), 1, $-4
491 MSR $0x3, DAIFSet // interrupts off
493 ADD $16, RSP, R0 // ureg
495 MOV 264(RSP), R1 // sp
496 MOV 272(RSP), R2 // pc
497 MOV 280(RSP), R3 // psr
503 MOVP 224(RSP), R26, R27
504 MOVP 240(RSP), R28, R29
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
521 MOV 256(RSP), R30 // link
523 ADD $TRAPFRAMESIZE, RSP
526 // irq/fiq/trap/serr from EL1
527 TEXT vtrap1(SB), 1, $-4
528 MOV R29, 248(RSP) // special
530 ADD $TRAPFRAMESIZE, RSP, R1
534 MOV R0, 288(RSP) // type
535 MOV R1, 264(RSP) // sp
536 MOV R2, 272(RSP) // pc
537 MOV R3, 280(RSP) // psr
539 ADD $16, RSP, R0 // ureg
542 MSR $0x3, DAIFSet // interrupts off
544 MOV 272(RSP), R2 // pc
545 MOV 280(RSP), R3 // psr
550 MOV 248(RSP), R29 // special
554 TEXT vsys(SB), 1, $-4
555 SUB $TRAPFRAMESIZE, RSP
558 MOV R30, 256(RSP) // link
560 MOV R17, 152(RSP) // temp
562 MRS ESR_EL1, R0 // type
565 B _vsyspatch // branch to vsys0() patched in
567 TEXT vtrap(SB), 1, $-4
568 SUB $TRAPFRAMESIZE, 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)
584 MOV R30, 256(RSP) // link
586 MRS ESR_EL1, R0 // type
589 B _vtrappatch // branch to vtrapX() patched in
591 TEXT virq(SB), 1, $-4
592 SUB $TRAPFRAMESIZE, 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)
608 MOV R30, 256(RSP) // link
610 MOV $(1<<32), R0 // type irq
613 B _virqpatch // branch to vtrapX() patched in
615 TEXT vfiq(SB), 1, $-4
616 SUB $TRAPFRAMESIZE, 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)
632 MOV R30, 256(RSP) // link
633 MOV $(2<<32), R0 // type fiq
636 B _vfiqpatch // branch to vtrapX() patched in
638 TEXT vserr(SB), 1, $-4
639 SUB $TRAPFRAMESIZE, 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)
655 MOV R30, 256(RSP) // link
658 ORR $(3<<32), R0 // type
660 B _vserrpatch // branch to vtrapX() patched in