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
301 TEXT lcycles(SB), 1, $-4
305 TEXT setlabel(SB), 1, $-4
312 TEXT gotolabel(SB), 1, $-4
313 MOV 8(R0), LR /* link */
314 MOV 0(R0), R1 /* sp */
319 TEXT returnto(SB), 1, $-4
323 TEXT getfar(SB), 1, $-4
327 TEXT setttbr(SB), 1, $-4
335 * TLB maintenance operations.
336 * these broadcast to all cpu's in the cluser
337 * (inner sharable domain).
339 TEXT flushasidva(SB), 1, $-4
340 TEXT tlbivae1is(SB), 1, $-4
342 TLBI R0, 0,8,3,1 /* VAE1IS */
347 TEXT flushasidvall(SB), 1, $-4
348 TEXT tlbivale1is(SB), 1, $-4
350 TLBI R0, 0,8,3,5 /* VALE1IS */
355 TEXT flushasid(SB), 1, $-4
356 TEXT tlbiaside1is(SB), 1, $-4
358 TLBI R0, 0,8,3,2 /* ASIDE1IS */
363 TEXT flushtlb(SB), 1, $-4
364 TEXT tlbivmalle1is(SB), 1, $-4
366 TLBI R0, 0,8,3,0 /* VMALLE1IS */
372 * flush the tlb of this cpu. no broadcast.
374 TEXT flushlocaltlb(SB), 1, $-4
375 TEXT tlbivmalle1(SB), 1, $-4
377 TLBI R0, 0,8,7,0 /* VMALLE1 */
382 TEXT fpsaveregs(SB), 1, $-4
383 WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 0) /* MOV { V0, V1, V2, V3 }, (R0)64! */
384 WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 4) /* MOV { V4, V5, V6, V7 }, (R0)64! */
385 WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 8) /* MOV { V8, V9, V10,V11 }, (R0)64! */
386 WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 12) /* MOV { V12,V13,V14,V15 }, (R0)64! */
387 WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 16) /* MOV { V16,V17,V18,V19 }, (R0)64! */
388 WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 20) /* MOV { V20,V21,V22,V23 }, (R0)64! */
389 WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 24) /* MOV { V24,V25,V26,V27 }, (R0)64! */
390 WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 28) /* MOV { V28,V29,V30,V31 }, (R0)64! */
393 TEXT fploadregs(SB), 1, $-4
394 WORD $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 0) /* MOV (R0)64!, { V0, V1, V2, V3 } */
395 WORD $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 4) /* MOV (R0)64!, { V4, V5, V6, V7 } */
396 WORD $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 8) /* MOV (R0)64!, { V8, V9, V10,V11 } */
397 WORD $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 12) /* MOV (R0)64!, { V12,V13,V14,V15 } */
398 WORD $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 16) /* MOV (R0)64!, { V16,V17,V18,V19 } */
399 WORD $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 20) /* MOV (R0)64!, { V20,V21,V22,V23 } */
400 WORD $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 24) /* MOV (R0)64!, { V24,V25,V26,V27 } */
401 WORD $(1<<30 | 3 << 26 | 3<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 28) /* MOV (R0)64!, { V28,V29,V30,V31 } */
404 // syscall or trap from EL0
405 TEXT vsys0(SB), 1, $-4
406 LSRW $26, R0, R17 // ec
407 CMPW $0x15, R17 // SVC trap?
408 BNE _itsatrap // nope.
410 MOVP R26, R27, 224(RSP)
411 MOVP R28, R29, 240(RSP)
417 MOV R0, 288(RSP) // type
418 MOV R1, 264(RSP) // sp
419 MOV R2, 272(RSP) // pc
420 MOV R3, 280(RSP) // psr
426 ADD $16, RSP, R0 // ureg
429 TEXT forkret(SB), 1, $-4
430 MSR $0x3, DAIFSet // interrupts off
432 ADD $16, RSP, R0 // ureg
434 MOV 16(RSP), R0 // ret
435 MOV 264(RSP), R1 // sp
436 MOV 272(RSP), R2 // pc
437 MOV 280(RSP), R3 // psr
443 MOVP 224(RSP), R26, R27
444 MOVP 240(RSP), R28, R29
446 MOV 256(RSP), R30 // link
448 ADD $TRAPFRAMESIZE, RSP
451 TEXT itsatrap<>(SB), 1, $-4
457 MOVP R9, R10, 88(RSP)
458 MOVP R11, R12, 104(RSP)
459 MOVP R13, R14, 120(RSP)
460 MOVP R15, R16, 136(RSP)
462 MOVP R18, R19, 160(RSP)
463 MOVP R20, R21, 176(RSP)
464 MOVP R22, R23, 192(RSP)
465 MOVP R24, R25, 208(RSP)
467 // trap/irq/fiq/serr from EL0
468 TEXT vtrap0(SB), 1, $-4
469 MOVP R26, R27, 224(RSP)
470 MOVP R28, R29, 240(RSP)
476 MOV R0, 288(RSP) // type
477 MOV R1, 264(RSP) // sp
478 MOV R2, 272(RSP) // pc
479 MOV R3, 280(RSP) // psr
485 ADD $16, RSP, R0 // ureg
488 TEXT noteret(SB), 1, $-4
489 MSR $0x3, DAIFSet // interrupts off
491 ADD $16, RSP, R0 // ureg
493 MOV 264(RSP), R1 // sp
494 MOV 272(RSP), R2 // pc
495 MOV 280(RSP), R3 // psr
501 MOVP 224(RSP), R26, R27
502 MOVP 240(RSP), R28, R29
510 MOVP 96(RSP), R10, R11
511 MOVP 112(RSP), R12, R13
512 MOVP 128(RSP), R14, R15
513 MOVP 144(RSP), R16, R17
514 MOVP 160(RSP), R18, R19
515 MOVP 176(RSP), R20, R21
516 MOVP 192(RSP), R22, R23
517 MOVP 208(RSP), R24, R25
519 MOV 256(RSP), R30 // link
521 ADD $TRAPFRAMESIZE, RSP
524 // irq/fiq/trap/serr from EL1
525 TEXT vtrap1(SB), 1, $-4
526 MOV R29, 248(RSP) // special
528 ADD $TRAPFRAMESIZE, RSP, R1
532 MOV R0, 288(RSP) // type
533 MOV R1, 264(RSP) // sp
534 MOV R2, 272(RSP) // pc
535 MOV R3, 280(RSP) // psr
537 ADD $16, RSP, R0 // ureg
540 MSR $0x3, DAIFSet // interrupts off
542 MOV 272(RSP), R2 // pc
543 MOV 280(RSP), R3 // psr
548 MOV 248(RSP), R29 // special
552 TEXT vsys(SB), 1, $-4
553 SUB $TRAPFRAMESIZE, RSP
556 MOV R30, 256(RSP) // link
558 MOV R17, 152(RSP) // temp
560 MRS ESR_EL1, R0 // type
563 B _vsyspatch // branch to vsys0() patched in
565 TEXT vtrap(SB), 1, $-4
566 SUB $TRAPFRAMESIZE, RSP
573 MOVP R10, R11, 96(RSP)
574 MOVP R12, R13, 112(RSP)
575 MOVP R14, R15, 128(RSP)
576 MOVP R16, R17, 144(RSP)
577 MOVP R18, R19, 160(RSP)
578 MOVP R20, R21, 176(RSP)
579 MOVP R22, R23, 192(RSP)
580 MOVP R24, R25, 208(RSP)
582 MOV R30, 256(RSP) // link
584 MRS ESR_EL1, R0 // type
587 B _vtrappatch // branch to vtrapX() patched in
589 TEXT virq(SB), 1, $-4
590 SUB $TRAPFRAMESIZE, RSP
597 MOVP R10, R11, 96(RSP)
598 MOVP R12, R13, 112(RSP)
599 MOVP R14, R15, 128(RSP)
600 MOVP R16, R17, 144(RSP)
601 MOVP R18, R19, 160(RSP)
602 MOVP R20, R21, 176(RSP)
603 MOVP R22, R23, 192(RSP)
604 MOVP R24, R25, 208(RSP)
606 MOV R30, 256(RSP) // link
608 MOV $(1<<32), R0 // type irq
611 B _virqpatch // branch to vtrapX() patched in
613 TEXT vfiq(SB), 1, $-4
614 SUB $TRAPFRAMESIZE, RSP
621 MOVP R10, R11, 96(RSP)
622 MOVP R12, R13, 112(RSP)
623 MOVP R14, R15, 128(RSP)
624 MOVP R16, R17, 144(RSP)
625 MOVP R18, R19, 160(RSP)
626 MOVP R20, R21, 176(RSP)
627 MOVP R22, R23, 192(RSP)
628 MOVP R24, R25, 208(RSP)
630 MOV R30, 256(RSP) // link
631 MOV $(2<<32), R0 // type fiq
634 B _vfiqpatch // branch to vtrapX() patched in
636 TEXT vserr(SB), 1, $-4
637 SUB $TRAPFRAMESIZE, RSP
644 MOVP R10, R11, 96(RSP)
645 MOVP R12, R13, 112(RSP)
646 MOVP R14, R15, 128(RSP)
647 MOVP R16, R17, 144(RSP)
648 MOVP R18, R19, 160(RSP)
649 MOVP R20, R21, 176(RSP)
650 MOVP R22, R23, 192(RSP)
651 MOVP R24, R25, 208(RSP)
653 MOV R30, 256(RSP) // link
656 ORR $(3<<32), R0 // type
658 B _vserrpatch // branch to vtrapX() patched in
660 /* fault-proof memcpy */
661 TEXT peek(SB), 1, $-4
665 TEXT _peekinst(SB), 1, $-4