lucu.h 935 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. /*
  2. * on return from this function we will be running in virtual mode.
  3. * We set up the Block Address Translation (BAT) registers thus:
  4. * 1) first 3 BATs are 256M blocks, starting from KZERO->0
  5. * 2) remaining BAT maps last 256M directly
  6. */
  7. TEXT mmuinit0(SB), $0
  8. /* reset all the tlbs */
  9. MOVW $64, R3
  10. MOVW R3, CTR
  11. MOVW $0, R4
  12. tlbloop:
  13. TLBIE R4
  14. SYNC
  15. ADD $BIT(19), R4
  16. BDNZ tlbloop
  17. TLBSYNC
  18. /* BATs 0 and 1 cover memory from 0x00000000 to 0x20000000 */
  19. /* KZERO -> 0, IBAT2 and DBAT2, 256 MB */
  20. MOVW $(KZERO|(0x7ff<<2)|2), R3
  21. MOVW $(PTEVALID|PTEWRITE), R4 /* PTEVALID => Cache coherency on */
  22. MOVW R3, SPR(DBATU(2))
  23. MOVW R4, SPR(DBATL(2))
  24. MOVW R3, SPR(IBATU(2))
  25. MOVW R4, SPR(IBATL(2))
  26. /* enable MMU */
  27. MOVW LR, R3
  28. OR $KZERO, R3
  29. MOVW R3, SPR(SRR0) /* Stored PC for RFI instruction */
  30. MOVW MSR, R4
  31. OR $(MSR_IR|MSR_DR|MSR_RI|MSR_FP), R4
  32. MOVW R4, SPR(SRR1)
  33. RFI /* resume in kernel mode in caller */
  34. RETURN