mmu.h 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*****************************************************************
  2. * mmu.h
  3. * by Zhiyi Huang, [email protected]
  4. * University of Otago
  5. *
  6. ********************************************************************/
  7. #define MBYTE 0x100000
  8. #define K_PDX_BASE 0x4000
  9. #define K_PTX_BASE 0x3000
  10. #define CACHELINESIZE 32
  11. /*
  12. * page table entries.
  13. */
  14. #define UNMAPPED 0x00000000
  15. #define COARSE (0<<4|1)
  16. #define SECTION (0<<4|2)
  17. #define LARGE 0x00000001
  18. #define SMALL 0x00000002
  19. #define BUFFERED 0x00000004
  20. #define CACHED 0x00000008
  21. #define DOMAIN0 0
  22. #define NOACCESS 0
  23. #define K_RW 1
  24. #define U_AP 2
  25. #define U_RW 3
  26. #define ACCESS_PERM(n, v) (((v) & 3) << (((n) * 2) + 4))
  27. #define PDX_AP(ap) (ACCESS_PERM(3, (ap)))
  28. #define PTX_AP(ap) (ACCESS_PERM(3, (ap)) | ACCESS_PERM(2, (ap)) \
  29. | ACCESS_PERM(1, (ap)) | ACCESS_PERM(0, (ap)))
  30. #define HVECTORS 0xffff0000
  31. // A virtual address 'la' has a three-part structure as follows:
  32. //
  33. // +--------12------+-------8--------+---------12----------+
  34. // | Page Directory | Page Table | Offset within Page |
  35. // | Index | Index | |
  36. // +----------------+----------------+---------------------+
  37. // \--- PDX(va) --/ \--- PTX(va) --/
  38. // page directory index
  39. #define PDX(va) (((uint)(va) >> PDXSHIFT) & 0xFFF)
  40. // page table index
  41. #define PTX(va) (((uint)(va) >> PTXSHIFT) & 0xFF)
  42. // construct virtual address from indexes and offset
  43. #define PGADDR(d, t, o) ((uint)((d) << PDXSHIFT | (t) << PTXSHIFT | (o)))
  44. // Address in page table or page directory entry
  45. #define PTE_ADDR(pte) ((uint)(pte) & ~0xFFF)
  46. #define PTE_FLAGS(pte) ((uint)(pte) & 0xFFF)
  47. // Page directory and page table constants.
  48. #define NPDENTRIES 1024 // # directory entries per page directory
  49. #define NPTENTRIES 1024 // # PTEs per page table
  50. #define PGSIZE 4096 // bytes mapped by a page
  51. #define PGSHIFT 12 // log2(PGSIZE)
  52. #define PTXSHIFT 12 // offset of PTX in a linear address
  53. #define PDXSHIFT 20 // offset of PDX in a linear address
  54. #define PGROUNDUP(sz) (((sz)+PGSIZE-1) & ~(PGSIZE-1))
  55. #define PGROUNDDOWN(a) (((a)) & ~(PGSIZE-1))
  56. #define PGDIR_BASE P2V(K_PDX_BASE)
  57. #define KVMPDXATTR DOMAIN0|PDX_AP(U_RW)|SECTION|CACHED|BUFFERED
  58. #define UVMPDXATTR DOMAIN0|COARSE
  59. #define UVMPTXATTR PTX_AP(U_RW)|CACHED|BUFFERED|SMALL