mmu.h 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #define MByte 0x100000
  2. #define L1 0x4000
  3. #define L2 0x3000
  4. #define CACHELINESIZE 32
  5. #define FEXT(d, o, w) (((d)>>(o)) & ((1<<(w))-1))
  6. #define L1X(va) FEXT((va), 20, 12)
  7. #define L2X(va) FEXT((va), 12, 8)
  8. /*
  9. * page table entries.
  10. */
  11. #define Mbz (0<<4)
  12. #define Fault 0x00000000 /* L[12] pte: unmapped */
  13. #define Coarse (Mbz|1) /* L1 */
  14. #define Section (Mbz|2) /* L1 1MB */
  15. #define Fine (Mbz|3) /* L1 */
  16. #define Large 0x00000001 /* L2 64KB */
  17. #define Small 0x00000002 /* L2 4KB */
  18. #define Tiny 0x00000003 /* L2 1KB: not in v7 */
  19. #define Buffered 0x00000004 /* L[12]: write-back not -thru */
  20. #define Cached 0x00000008 /* L[12] */
  21. #define Dom0 0
  22. #define Noaccess 0 /* AP, DAC */
  23. #define Krw 1 /* AP */
  24. /* armv7 deprecates AP[2] == 1 & AP[1:0] == 2 (Uro), prefers 3 (new in v7) */
  25. #define Uro 2 /* AP */
  26. #define Urw 3 /* AP */
  27. #define Client 1 /* DAC */
  28. #define Manager 3 /* DAC */
  29. #define F(v, o, w) (((v) & ((1<<(w))-1))<<(o))
  30. #define AP(n, v) F((v), ((n)*2)+4, 2)
  31. #define L1AP(ap) (AP(3, (ap)))
  32. #define L2AP(ap) (AP(3, (ap))|AP(2, (ap))|AP(1, (ap))|AP(0, (ap))) /* pre-armv7 */
  33. #define DAC(n, v) F((v), (n)*2, 2)
  34. #define HVECTORS 0xffff0000
  35. // A virtual address 'la' has a three-part structure as follows:
  36. //
  37. // +--------12------+-------8--------+---------12----------+
  38. // | Page Directory | Page Table | Offset within Page |
  39. // | Index | Index | |
  40. // +----------------+----------------+---------------------+
  41. // \--- PDX(va) --/ \--- PTX(va) --/
  42. // page directory index
  43. #define PDX(va) (((uint)(va) >> PDXSHIFT) & 0xFFF)
  44. // page table index
  45. #define PTX(va) (((uint)(va) >> PTXSHIFT) & 0xFF)
  46. // construct virtual address from indexes and offset
  47. #define PGADDR(d, t, o) ((uint)((d) << PDXSHIFT | (t) << PTXSHIFT | (o)))
  48. // Address in page table or page directory entry
  49. #define PTE_ADDR(pte) ((uint)(pte) & ~0xFFF)
  50. #define PTE_FLAGS(pte) ((uint)(pte) & 0xFFF)
  51. // Page directory and page table constants.
  52. #define NPDENTRIES 1024 // # directory entries per page directory
  53. #define NPTENTRIES 1024 // # PTEs per page table
  54. #define PGSIZE 4096 // bytes mapped by a page
  55. #define PGSHIFT 12 // log2(PGSIZE)
  56. #define PTXSHIFT 12 // offset of PTX in a linear address
  57. #define PDXSHIFT 20 // offset of PDX in a linear address
  58. #define PGROUNDUP(sz) (((sz)+PGSIZE-1) & ~(PGSIZE-1))
  59. #define PGROUNDDOWN(a) (((a)) & ~(PGSIZE-1))
  60. #define PGDIR_BASE P2V(L1)
  61. #define KVML1ATTR Dom0|L1AP(Urw)|Section|Cached|Buffered
  62. #define UVML1ATTR Dom0|Coarse
  63. #define UVML2ATTR L2AP(Urw)|Cached|Buffered|Small
  64. #define USER_MODE 0