sun3_pgtable.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:8k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _SUN3_PGTABLE_H
  2. #define _SUN3_PGTABLE_H
  3. #include <asm/sun3mmu.h>
  4. #ifndef __ASSEMBLY__
  5. #include <asm/virtconvert.h>
  6. #include <linux/linkage.h>
  7. /*
  8.  * This file contains all the things which change drastically for the sun3
  9.  * pagetable stuff, to avoid making too much of a mess of the generic m68k
  10.  * `pgtable.h'; this should only be included from the generic file. --m
  11.  */
  12. /* For virtual address to physical address conversion */
  13. #define VTOP(addr) __pa(addr)
  14. #define PTOV(addr) __va(addr)
  15. #endif /* !__ASSEMBLY__ */
  16. /* These need to be defined for compatibility although the sun3 doesn't use them */
  17. #define _PAGE_NOCACHE030 0x040
  18. #define _CACHEMASK040   (~0x060)
  19. #define _PAGE_NOCACHE_S 0x040
  20. /* Page protection values within PTE. */
  21. #define SUN3_PAGE_VALID     (0x80000000)
  22. #define SUN3_PAGE_WRITEABLE (0x40000000)
  23. #define SUN3_PAGE_SYSTEM    (0x20000000)
  24. #define SUN3_PAGE_NOCACHE   (0x10000000)
  25. #define SUN3_PAGE_ACCESSED  (0x02000000)
  26. #define SUN3_PAGE_MODIFIED  (0x01000000)
  27. /* Externally used page protection values. */
  28. #define _PAGE_PRESENT (SUN3_PAGE_VALID)
  29. #define _PAGE_ACCESSED (SUN3_PAGE_ACCESSED)
  30. /* Compound page protection values. */
  31. //todo: work out which ones *should* have SUN3_PAGE_NOCACHE and fix...
  32. // is it just PAGE_KERNEL and PAGE_SHARED?
  33. #define PAGE_NONE __pgprot(SUN3_PAGE_VALID 
  34.  | SUN3_PAGE_ACCESSED 
  35.  | SUN3_PAGE_NOCACHE)
  36. #define PAGE_SHARED __pgprot(SUN3_PAGE_VALID 
  37.  | SUN3_PAGE_WRITEABLE 
  38.  | SUN3_PAGE_ACCESSED 
  39.  | SUN3_PAGE_NOCACHE)
  40. #define PAGE_COPY __pgprot(SUN3_PAGE_VALID 
  41.  | SUN3_PAGE_ACCESSED 
  42.  | SUN3_PAGE_NOCACHE)
  43. #define PAGE_READONLY __pgprot(SUN3_PAGE_VALID 
  44.  | SUN3_PAGE_ACCESSED 
  45.  | SUN3_PAGE_NOCACHE)
  46. #define PAGE_KERNEL __pgprot(SUN3_PAGE_VALID 
  47.  | SUN3_PAGE_WRITEABLE 
  48.  | SUN3_PAGE_SYSTEM 
  49.  | SUN3_PAGE_NOCACHE 
  50.  | SUN3_PAGE_ACCESSED 
  51.  | SUN3_PAGE_MODIFIED)
  52. #define PAGE_INIT __pgprot(SUN3_PAGE_VALID 
  53.  | SUN3_PAGE_WRITEABLE 
  54.  | SUN3_PAGE_SYSTEM 
  55.  | SUN3_PAGE_NOCACHE)
  56. /*
  57.  * Page protections for initialising protection_map. The sun3 has only two
  58.  * protection settings, valid (implying read and execute) and writeable. These
  59.  * are as close as we can get...
  60.  */
  61. #define __P000 PAGE_NONE
  62. #define __P001 PAGE_READONLY
  63. #define __P010 PAGE_COPY
  64. #define __P011 PAGE_COPY
  65. #define __P100 PAGE_READONLY
  66. #define __P101 PAGE_READONLY
  67. #define __P110 PAGE_COPY
  68. #define __P111 PAGE_COPY
  69. #define __S000 PAGE_NONE
  70. #define __S001 PAGE_READONLY
  71. #define __S010 PAGE_SHARED
  72. #define __S011 PAGE_SHARED
  73. #define __S100 PAGE_READONLY
  74. #define __S101 PAGE_READONLY
  75. #define __S110 PAGE_SHARED
  76. #define __S111 PAGE_SHARED
  77. /* Use these fake page-protections on PMDs. */
  78. #define SUN3_PMD_VALID (0x00000001)
  79. #define SUN3_PMD_MASK (0x0000003F)
  80. #define SUN3_PMD_MAGIC (0x0000002B)
  81. #ifndef __ASSEMBLY__
  82. /*
  83.  * Conversion functions: convert a page and protection to a page entry,
  84.  * and a page entry and page directory to the page they refer to.
  85.  */
  86. #define __mk_pte(page, pgprot) 
  87. ({ pte_t __pte; pte_val(__pte) = (__pa(page) >> PAGE_SHIFT) | pgprot_val(pgprot); __pte; })
  88. #define mk_pte(page, pgprot) __mk_pte(page_address(page), (pgprot))
  89. #define mk_pte_phys(physpage, pgprot) 
  90. ({ pte_t __pte; pte_val(__pte) = ((physpage) >> PAGE_SHIFT) | pgprot_val(pgprot); __pte; })
  91. extern inline pte_t pte_modify (pte_t pte, pgprot_t newprot)
  92. { pte_val(pte) = (pte_val(pte) & SUN3_PAGE_CHG_MASK) | pgprot_val(newprot); return pte; }
  93. #define pmd_set(pmdp,ptep) do {} while (0)
  94. extern inline void pgd_set(pgd_t * pgdp, pmd_t * pmdp)
  95. { pgd_val(*pgdp) = virt_to_phys(pmdp); }
  96. #define __pte_page(pte) 
  97. ((unsigned long) __va ((pte_val (pte) & SUN3_PAGE_PGNUM_MASK) << PAGE_SHIFT))
  98. #define __pmd_page(pmd) 
  99. ((unsigned long) __va (pmd_val (pmd) & PAGE_MASK))
  100. extern inline int pte_none (pte_t pte) { return !pte_val (pte); }
  101. extern inline int pte_present (pte_t pte) { return pte_val (pte) & SUN3_PAGE_VALID; }
  102. extern inline void pte_clear (pte_t *ptep) { pte_val (*ptep) = 0; }
  103. /* FIXME: this is only a guess */
  104. #define pte_pagenr(pte) ((__pte_page(pte) - PAGE_OFFSET) >> PAGE_SHIFT)
  105. #define pte_page(pte) (mem_map+pte_pagenr(pte))
  106. extern inline int pmd_none2 (pmd_t *pmd) { return !pmd_val (*pmd); }
  107. #define pmd_none(pmd) pmd_none2(&(pmd))
  108. //extern inline int pmd_bad (pmd_t pmd) { return (pmd_val (pmd) & SUN3_PMD_MASK) != SUN3_PMD_MAGIC; }
  109. extern inline int pmd_bad2 (pmd_t *pmd) { return 0; }
  110. #define pmd_bad(pmd) pmd_bad2(&(pmd))
  111. extern inline int pmd_present2 (pmd_t *pmd) { return pmd_val (*pmd) & SUN3_PMD_VALID; }
  112. /* #define pmd_present(pmd) pmd_present2(&(pmd)) */
  113. #define pmd_present(pmd) (!pmd_none2(&(pmd)))
  114. extern inline void pmd_clear (pmd_t *pmdp) { pmd_val (*pmdp) = 0; }
  115. extern inline int pgd_none (pgd_t pgd) { return 0; }
  116. extern inline int pgd_bad (pgd_t pgd) { return 0; }
  117. extern inline int pgd_present (pgd_t pgd) { return 1; }
  118. extern inline void pgd_clear (pgd_t *pgdp) {}
  119. #define pte_ERROR(e) 
  120. printk("%s:%d: bad pte %08lx.n", __FILE__, __LINE__, pte_val(e))
  121. #define pmd_ERROR(e) 
  122. printk("%s:%d: bad pmd %08lx.n", __FILE__, __LINE__, pmd_val(e))
  123. #define pgd_ERROR(e) 
  124. printk("%s:%d: bad pgd %08lx.n", __FILE__, __LINE__, pgd_val(e))
  125. /*
  126.  * The following only work if pte_present() is true.
  127.  * Undefined behaviour if not...
  128.  * [we have the full set here even if they don't change from m68k]
  129.  */
  130. extern inline int pte_read(pte_t pte) { return 1; }
  131. extern inline int pte_write(pte_t pte) { return pte_val(pte) & SUN3_PAGE_WRITEABLE; }
  132. extern inline int pte_exec(pte_t pte) { return 1; }
  133. extern inline int pte_dirty(pte_t pte) { return pte_val(pte) & SUN3_PAGE_MODIFIED; }
  134. extern inline int pte_young(pte_t pte) { return pte_val(pte) & SUN3_PAGE_ACCESSED; }
  135. extern inline pte_t pte_wrprotect(pte_t pte) { pte_val(pte) &= ~SUN3_PAGE_WRITEABLE; return pte; }
  136. extern inline pte_t pte_rdprotect(pte_t pte) { return pte; }
  137. extern inline pte_t pte_exprotect(pte_t pte) { return pte; }
  138. extern inline pte_t pte_mkclean(pte_t pte) { pte_val(pte) &= ~SUN3_PAGE_MODIFIED; return pte; }
  139. extern inline pte_t pte_mkold(pte_t pte) { pte_val(pte) &= ~SUN3_PAGE_ACCESSED; return pte; }
  140. extern inline pte_t pte_mkwrite(pte_t pte) { pte_val(pte) |= SUN3_PAGE_WRITEABLE; return pte; }
  141. extern inline pte_t pte_mkread(pte_t pte) { return pte; }
  142. extern inline pte_t pte_mkexec(pte_t pte) { return pte; }
  143. extern inline pte_t pte_mkdirty(pte_t pte) { pte_val(pte) |= SUN3_PAGE_MODIFIED; return pte; }
  144. extern inline pte_t pte_mkyoung(pte_t pte) { pte_val(pte) |= SUN3_PAGE_ACCESSED; return pte; }
  145. extern inline pte_t pte_mknocache(pte_t pte) { pte_val(pte) |= SUN3_PAGE_NOCACHE; return pte; }
  146. // use this version when caches work...
  147. //extern inline pte_t pte_mkcache(pte_t pte) { pte_val(pte) &= SUN3_PAGE_NOCACHE; return pte; }
  148. // until then, use:
  149. extern inline pte_t pte_mkcache(pte_t pte) { return pte; }
  150. extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
  151. extern pgd_t kernel_pg_dir[PTRS_PER_PGD];
  152. /* Find an entry in a pagetable directory. */
  153. #define pgd_index(address)     ((address) >> PGDIR_SHIFT)
  154. #define pgd_offset(mm, address) 
  155. ((mm)->pgd + pgd_index(address))
  156. /* Find an entry in a kernel pagetable directory. */
  157. #define pgd_offset_k(address) pgd_offset(&init_mm, address)
  158. /* Find an entry in the second-level pagetable. */
  159. extern inline pmd_t *pmd_offset (pgd_t *pgd, unsigned long address)
  160. {
  161. return (pmd_t *) pgd;
  162. }
  163. /* Find an entry in the third-level pagetable. */
  164. #define pte_offset(pmd, address) 
  165. ((pte_t *) __pmd_page (*pmd) + ((address >> PAGE_SHIFT) & (PTRS_PER_PTE-1)))
  166. /* Disable caching for page at given kernel virtual address. */
  167. static inline void nocache_page (unsigned long vaddr)
  168. {
  169. /* Don't think this is required on sun3. --m */
  170. }
  171. /* Enable caching for page at given kernel virtual address. */
  172. static inline void cache_page (unsigned long vaddr)
  173. {
  174. /* Don't think this is required on sun3. --m */
  175. }
  176. #endif /* !__ASSEMBLY__ */
  177. #endif /* !_SUN3_PGTABLE_H */