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
10 MOV $setSB-KZERO(SB), R28
13 /* use dedicated stack pointer per exception level */
19 /* invalidate local caches */
23 MOV $(MACHADDR(0)-KZERO), R27
30 ADD $(MACHSIZE-16), R27, R2
35 /* clear page table and machs */
37 MOV $(MACHADDR(-1)-KZERO), R2
44 MOV $edata-KZERO(SB), R1
45 MOV $end-KZERO(SB), R2
51 /* setup page tables */
68 TEXT stop<>(SB), 1, $-4
78 TEXT svcmode<>(SB), 1, $-4
92 /* HCR = RW, HCD, SWIO, BSU, FB */
93 MOVWU $(1<<31 | 1<<29 | 1<<2 | 0<<10 | 0<<9), R0
98 MOVWU $(3<<4 | 1<<11 | 1<<16 | 1<<18 | 3<<22 | 3<<28), R0
103 /* set VMID to zero */
108 MOVWU $(0xF<<6 | 4), R0
115 TEXT mmudisable<>(SB), 1, $-4
145 /* initialise SCTLR, MMU and caches off */
148 BIC $(SCTLRCLR | SCTLRMMU), R0
156 TEXT mmuenable<>(SB), 1, $-4
157 /* return to virtual */
163 /* memory attributes */
165 ( 0xFF << MA_MEM_WB*8 \
166 | 0x33 << MA_MEM_WT*8 \
167 | 0x44 << MA_MEM_UC*8 \
168 | 0x00 << MA_DEV_nGnRnE*8 \
169 | 0x04 << MA_DEV_nGnRE*8 \
170 | 0x08 << MA_DEV_nGRE*8 \
171 | 0x0C << MA_DEV_GRE*8 )
176 /* translation control */
181 /* TG1 */ | (((3<<16|1<<14|2<<12)>>PGSHIFT)&3)<<30 \
182 /* SH1 */ | SHARE_INNER<<28 \
183 /* ORGN1 */ | CACHE_WB<<26 \
184 /* IRGN1 */ | CACHE_WB<<24 \
187 /* T1SZ */ | (64-EVASHIFT)<<16 \
188 /* TG0 */ | (((1<<16|2<<14|0<<12)>>PGSHIFT)&3)<<14 \
189 /* SH0 */ | SHARE_INNER<<12 \
190 /* ORGN0 */ | CACHE_WB<<10 \
191 /* IRGN0 */ | CACHE_WB<<8 \
193 /* T0SZ */ | (64-EVASHIFT)<<0 )
195 MRS ID_AA64MMFR0_EL1, R2
196 ANDW $0x7, R2 // PARange
197 ADD R2<<32, R1 // IPS
201 /* load the page tables */
202 MOV $(L1TOP-KZERO), R0
208 /* enable MMU and caches */
221 TEXT touser(SB), 1, $-4
222 MSR $0x3, DAIFSet // interrupts off
223 MOVWU $0x10028, R1 // entry
231 TEXT cmpswap(SB), 1, $-4
249 TEXT _tas(SB), 1, $-4
257 TEXT coherence(SB), 1, $-4
261 TEXT islo(SB), 1, $-4
267 TEXT splhi(SB), 1, $-4
272 TEXT splfhi(SB), 1, $-4
277 TEXT spllo(SB), 1, $-4
281 TEXT splflo(SB), 1, $-4
285 TEXT splx(SB), 1, $-4
289 TEXT idlehands(SB), 1, $-4
300 TEXT vcycles(SB), 1, $-4
304 TEXT lcycles(SB), 1, $-4
308 TEXT setlabel(SB), 1, $-4
315 TEXT gotolabel(SB), 1, $-4
316 MOV 8(R0), LR /* link */
317 MOV 0(R0), R1 /* sp */
322 TEXT returnto(SB), 1, $-4
326 TEXT getfar(SB), 1, $-4
330 TEXT setttbr(SB), 1, $-4
338 * TLB maintenance operations.
339 * these broadcast to all cpu's in the cluser
340 * (inner sharable domain).
342 TEXT flushasidva(SB), 1, $-4
343 TEXT tlbivae1is(SB), 1, $-4
345 TLBI R0, 0,8,3,1 /* VAE1IS */
350 TEXT flushasidvall(SB), 1, $-4
351 TEXT tlbivale1is(SB), 1, $-4
353 TLBI R0, 0,8,3,5 /* VALE1IS */
358 TEXT flushasid(SB), 1, $-4
359 TEXT tlbiaside1is(SB), 1, $-4
361 TLBI R0, 0,8,3,2 /* ASIDE1IS */
366 TEXT flushtlb(SB), 1, $-4
367 TEXT tlbivmalle1is(SB), 1, $-4
369 TLBI R0, 0,8,3,0 /* VMALLE1IS */
375 * flush the tlb of this cpu. no broadcast.
377 TEXT flushlocaltlb(SB), 1, $-4
378 TEXT tlbivmalle1(SB), 1, $-4
380 TLBI R0, 0,8,7,0 /* VMALLE1 */
385 TEXT fpsaveregs(SB), 1, $-4
386 WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 0) /* MOV { V0, V1, V2, V3 }, (R0)64! */
387 WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 4) /* MOV { V4, V5, V6, V7 }, (R0)64! */
388 WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 8) /* MOV { V8, V9, V10,V11 }, (R0)64! */
389 WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 12) /* MOV { V12,V13,V14,V15 }, (R0)64! */
390 WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 16) /* MOV { V16,V17,V18,V19 }, (R0)64! */
391 WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 20) /* MOV { V20,V21,V22,V23 }, (R0)64! */
392 WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 24) /* MOV { V24,V25,V26,V27 }, (R0)64! */
393 WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 28) /* MOV { V28,V29,V30,V31 }, (R0)64! */
396 TEXT fploadregs(SB), 1, $-4
397 WORD $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 0) /* MOV (R0)64!, { V0, V1, V2, V3 } */
398 WORD $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 4) /* MOV (R0)64!, { V4, V5, V6, V7 } */
399 WORD $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 8) /* MOV (R0)64!, { V8, V9, V10,V11 } */
400 WORD $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 12) /* MOV (R0)64!, { V12,V13,V14,V15 } */
401 WORD $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 16) /* MOV (R0)64!, { V16,V17,V18,V19 } */
402 WORD $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 20) /* MOV (R0)64!, { V20,V21,V22,V23 } */
403 WORD $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 24) /* MOV (R0)64!, { V24,V25,V26,V27 } */
404 WORD $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 28) /* MOV (R0)64!, { V28,V29,V30,V31 } */
407 // syscall or trap from EL0
408 TEXT vsys0(SB), 1, $-4
409 LSRW $26, R0, R17 // ec
410 CMPW $0x15, R17 // SVC trap?
411 BNE _itsatrap // nope.
413 MOVP R26, R27, 224(RSP)
414 MOVP R28, R29, 240(RSP)
420 MOV R0, 288(RSP) // type
421 MOV R1, 264(RSP) // sp
422 MOV R2, 272(RSP) // pc
423 MOV R3, 280(RSP) // psr
429 ADD $16, RSP, R0 // ureg
432 TEXT forkret(SB), 1, $-4
433 MSR $0x3, DAIFSet // interrupts off
435 ADD $16, RSP, R0 // ureg
437 MOV 16(RSP), R0 // ret
438 MOV 264(RSP), R1 // sp
439 MOV 272(RSP), R2 // pc
440 MOV 280(RSP), R3 // psr
446 MOVP 224(RSP), R26, R27
447 MOVP 240(RSP), R28, R29
449 MOV 256(RSP), R30 // link
451 ADD $TRAPFRAMESIZE, RSP
454 TEXT itsatrap<>(SB), 1, $-4
460 MOVP R9, R10, 88(RSP)
461 MOVP R11, R12, 104(RSP)
462 MOVP R13, R14, 120(RSP)
463 MOVP R15, R16, 136(RSP)
465 MOVP R18, R19, 160(RSP)
466 MOVP R20, R21, 176(RSP)
467 MOVP R22, R23, 192(RSP)
468 MOVP R24, R25, 208(RSP)
470 // trap/irq/fiq/serr from EL0
471 TEXT vtrap0(SB), 1, $-4
472 MOVP R26, R27, 224(RSP)
473 MOVP R28, R29, 240(RSP)
479 MOV R0, 288(RSP) // type
480 MOV R1, 264(RSP) // sp
481 MOV R2, 272(RSP) // pc
482 MOV R3, 280(RSP) // psr
488 ADD $16, RSP, R0 // ureg
491 TEXT noteret(SB), 1, $-4
492 MSR $0x3, DAIFSet // interrupts off
494 ADD $16, RSP, R0 // ureg
496 MOV 264(RSP), R1 // sp
497 MOV 272(RSP), R2 // pc
498 MOV 280(RSP), R3 // psr
504 MOVP 224(RSP), R26, R27
505 MOVP 240(RSP), R28, R29
513 MOVP 96(RSP), R10, R11
514 MOVP 112(RSP), R12, R13
515 MOVP 128(RSP), R14, R15
516 MOVP 144(RSP), R16, R17
517 MOVP 160(RSP), R18, R19
518 MOVP 176(RSP), R20, R21
519 MOVP 192(RSP), R22, R23
520 MOVP 208(RSP), R24, R25
522 MOV 256(RSP), R30 // link
524 ADD $TRAPFRAMESIZE, RSP
527 // irq/fiq/trap/serr from EL1
528 TEXT vtrap1(SB), 1, $-4
529 MOV R29, 248(RSP) // special
531 ADD $TRAPFRAMESIZE, RSP, R1
535 MOV R0, 288(RSP) // type
536 MOV R1, 264(RSP) // sp
537 MOV R2, 272(RSP) // pc
538 MOV R3, 280(RSP) // psr
540 ADD $16, RSP, R0 // ureg
543 MSR $0x3, DAIFSet // interrupts off
545 MOV 272(RSP), R2 // pc
546 MOV 280(RSP), R3 // psr
551 MOV 248(RSP), R29 // special
555 TEXT vsys(SB), 1, $-4
556 SUB $TRAPFRAMESIZE, RSP
559 MOV R30, 256(RSP) // link
561 MOV R17, 152(RSP) // temp
563 MRS ESR_EL1, R0 // type
566 B _vsyspatch // branch to vsys0() patched in
568 TEXT vtrap(SB), 1, $-4
569 SUB $TRAPFRAMESIZE, RSP
576 MOVP R10, R11, 96(RSP)
577 MOVP R12, R13, 112(RSP)
578 MOVP R14, R15, 128(RSP)
579 MOVP R16, R17, 144(RSP)
580 MOVP R18, R19, 160(RSP)
581 MOVP R20, R21, 176(RSP)
582 MOVP R22, R23, 192(RSP)
583 MOVP R24, R25, 208(RSP)
585 MOV R30, 256(RSP) // link
587 MRS ESR_EL1, R0 // type
590 B _vtrappatch // branch to vtrapX() patched in
592 TEXT virq(SB), 1, $-4
593 SUB $TRAPFRAMESIZE, RSP
600 MOVP R10, R11, 96(RSP)
601 MOVP R12, R13, 112(RSP)
602 MOVP R14, R15, 128(RSP)
603 MOVP R16, R17, 144(RSP)
604 MOVP R18, R19, 160(RSP)
605 MOVP R20, R21, 176(RSP)
606 MOVP R22, R23, 192(RSP)
607 MOVP R24, R25, 208(RSP)
609 MOV R30, 256(RSP) // link
611 MOV $(1<<32), R0 // type irq
614 B _virqpatch // branch to vtrapX() patched in
616 TEXT vfiq(SB), 1, $-4
617 SUB $TRAPFRAMESIZE, RSP
624 MOVP R10, R11, 96(RSP)
625 MOVP R12, R13, 112(RSP)
626 MOVP R14, R15, 128(RSP)
627 MOVP R16, R17, 144(RSP)
628 MOVP R18, R19, 160(RSP)
629 MOVP R20, R21, 176(RSP)
630 MOVP R22, R23, 192(RSP)
631 MOVP R24, R25, 208(RSP)
633 MOV R30, 256(RSP) // link
634 MOV $(2<<32), R0 // type fiq
637 B _vfiqpatch // branch to vtrapX() patched in
639 TEXT vserr(SB), 1, $-4
640 SUB $TRAPFRAMESIZE, RSP
647 MOVP R10, R11, 96(RSP)
648 MOVP R12, R13, 112(RSP)
649 MOVP R14, R15, 128(RSP)
650 MOVP R16, R17, 144(RSP)
651 MOVP R18, R19, 160(RSP)
652 MOVP R20, R21, 176(RSP)
653 MOVP R22, R23, 192(RSP)
654 MOVP R24, R25, 208(RSP)
656 MOV R30, 256(RSP) // link
659 ORR $(3<<32), R0 // type
661 B _vserrpatch // branch to vtrapX() patched in
663 /* fault-proof memcpy */
664 TEXT peek(SB), 1, $-4
668 TEXT _peekinst(SB), 1, $-4