pgtable-bits.h 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. /*
  2. * This file is subject to the terms and conditions of the GNU General Public
  3. * License. See the file "COPYING" in the main directory of this archive
  4. * for more details.
  5. *
  6. * Copyright (C) 1994 - 2002 by Ralf Baechle
  7. * Copyright (C) 1999, 2000, 2001 Silicon Graphics, Inc.
  8. * Copyright (C) 2002 Maciej W. Rozycki
  9. */
  10. #ifndef _ASM_PGTABLE_BITS_H
  11. #define _ASM_PGTABLE_BITS_H
  12. /*
  13. * Note that we shift the lower 32bits of each EntryLo[01] entry
  14. * 6 bits to the left. That way we can convert the PFN into the
  15. * physical address by a single 'and' operation and gain 6 additional
  16. * bits for storing information which isn't present in a normal
  17. * MIPS page table.
  18. *
  19. * Similar to the Alpha port, we need to keep track of the ref
  20. * and mod bits in software. We have a software "yeah you can read
  21. * from this page" bit, and a hardware one which actually lets the
  22. * process read from the page. On the same token we have a software
  23. * writable bit and the real hardware one which actually lets the
  24. * process write to the page, this keeps a mod bit via the hardware
  25. * dirty bit.
  26. *
  27. * Certain revisions of the R4000 and R5000 have a bug where if a
  28. * certain sequence occurs in the last 3 instructions of an executable
  29. * page, and the following page is not mapped, the cpu can do
  30. * unpredictable things. The code (when it is written) to deal with
  31. * this problem will be in the update_mmu_cache() code for the r4k.
  32. */
  33. #if defined(CONFIG_XPA)
  34. /*
  35. * Page table bit offsets used for 64 bit physical addressing on
  36. * MIPS32r5 with XPA.
  37. */
  38. enum pgtable_bits {
  39. /* Used by TLB hardware (placed in EntryLo*) */
  40. _PAGE_NO_EXEC_SHIFT,
  41. _PAGE_NO_READ_SHIFT,
  42. _PAGE_GLOBAL_SHIFT,
  43. _PAGE_VALID_SHIFT,
  44. _PAGE_DIRTY_SHIFT,
  45. _CACHE_SHIFT,
  46. /* Used only by software (masked out before writing EntryLo*) */
  47. _PAGE_PRESENT_SHIFT = 24,
  48. _PAGE_WRITE_SHIFT,
  49. _PAGE_ACCESSED_SHIFT,
  50. _PAGE_MODIFIED_SHIFT,
  51. #if defined(CONFIG_ARCH_HAS_PTE_SPECIAL)
  52. _PAGE_SPECIAL_SHIFT,
  53. #endif
  54. #if defined(CONFIG_HAVE_ARCH_SOFT_DIRTY)
  55. _PAGE_SOFT_DIRTY_SHIFT,
  56. #endif
  57. };
  58. /*
  59. * Bits for extended EntryLo0/EntryLo1 registers
  60. */
  61. #define _PFNX_MASK 0xffffff
  62. #elif defined(CONFIG_PHYS_ADDR_T_64BIT) && defined(CONFIG_CPU_MIPS32)
  63. /*
  64. * Page table bit offsets used for 36 bit physical addressing on MIPS32,
  65. * for example with Alchemy or Netlogic XLP/XLR.
  66. */
  67. enum pgtable_bits {
  68. /* Used by TLB hardware (placed in EntryLo*) */
  69. _PAGE_GLOBAL_SHIFT,
  70. _PAGE_VALID_SHIFT,
  71. _PAGE_DIRTY_SHIFT,
  72. _CACHE_SHIFT,
  73. /* Used only by software (masked out before writing EntryLo*) */
  74. _PAGE_PRESENT_SHIFT = _CACHE_SHIFT + 3,
  75. _PAGE_NO_READ_SHIFT,
  76. _PAGE_WRITE_SHIFT,
  77. _PAGE_ACCESSED_SHIFT,
  78. _PAGE_MODIFIED_SHIFT,
  79. #if defined(CONFIG_ARCH_HAS_PTE_SPECIAL)
  80. _PAGE_SPECIAL_SHIFT,
  81. #endif
  82. #if defined(CONFIG_HAVE_ARCH_SOFT_DIRTY)
  83. _PAGE_SOFT_DIRTY_SHIFT,
  84. #endif
  85. };
  86. #elif defined(CONFIG_CPU_R3K_TLB)
  87. /* Page table bits used for r3k systems */
  88. enum pgtable_bits {
  89. /* Used only by software (writes to EntryLo ignored) */
  90. _PAGE_PRESENT_SHIFT,
  91. _PAGE_NO_READ_SHIFT,
  92. _PAGE_WRITE_SHIFT,
  93. _PAGE_ACCESSED_SHIFT,
  94. _PAGE_MODIFIED_SHIFT,
  95. #if defined(CONFIG_ARCH_HAS_PTE_SPECIAL)
  96. _PAGE_SPECIAL_SHIFT,
  97. #endif
  98. #if defined(CONFIG_HAVE_ARCH_SOFT_DIRTY)
  99. _PAGE_SOFT_DIRTY_SHIFT,
  100. #endif
  101. /* Used by TLB hardware (placed in EntryLo) */
  102. _PAGE_GLOBAL_SHIFT = 8,
  103. _PAGE_VALID_SHIFT,
  104. _PAGE_DIRTY_SHIFT,
  105. _CACHE_UNCACHED_SHIFT,
  106. };
  107. #else
  108. /* Page table bits used for r4k systems */
  109. enum pgtable_bits {
  110. /* Used only by software (masked out before writing EntryLo*) */
  111. _PAGE_PRESENT_SHIFT,
  112. #if !defined(CONFIG_CPU_HAS_RIXI)
  113. _PAGE_NO_READ_SHIFT,
  114. #endif
  115. _PAGE_WRITE_SHIFT,
  116. _PAGE_ACCESSED_SHIFT,
  117. _PAGE_MODIFIED_SHIFT,
  118. #if defined(CONFIG_MIPS_HUGE_TLB_SUPPORT)
  119. _PAGE_HUGE_SHIFT,
  120. #endif
  121. #if defined(CONFIG_ARCH_HAS_PTE_SPECIAL)
  122. _PAGE_SPECIAL_SHIFT,
  123. #endif
  124. #if defined(CONFIG_HAVE_ARCH_SOFT_DIRTY)
  125. _PAGE_SOFT_DIRTY_SHIFT,
  126. #endif
  127. /* Used by TLB hardware (placed in EntryLo*) */
  128. #if defined(CONFIG_CPU_HAS_RIXI)
  129. _PAGE_NO_EXEC_SHIFT,
  130. _PAGE_NO_READ_SHIFT,
  131. #endif
  132. _PAGE_GLOBAL_SHIFT,
  133. _PAGE_VALID_SHIFT,
  134. _PAGE_DIRTY_SHIFT,
  135. _CACHE_SHIFT,
  136. };
  137. #endif /* defined(CONFIG_PHYS_ADDR_T_64BIT && defined(CONFIG_CPU_MIPS32) */
  138. /* Used only by software */
  139. #define _PAGE_PRESENT (1 << _PAGE_PRESENT_SHIFT)
  140. #define _PAGE_WRITE (1 << _PAGE_WRITE_SHIFT)
  141. #define _PAGE_ACCESSED (1 << _PAGE_ACCESSED_SHIFT)
  142. #define _PAGE_MODIFIED (1 << _PAGE_MODIFIED_SHIFT)
  143. #if defined(CONFIG_MIPS_HUGE_TLB_SUPPORT)
  144. # define _PAGE_HUGE (1 << _PAGE_HUGE_SHIFT)
  145. #endif
  146. #if defined(CONFIG_ARCH_HAS_PTE_SPECIAL)
  147. # define _PAGE_SPECIAL (1 << _PAGE_SPECIAL_SHIFT)
  148. #else
  149. # define _PAGE_SPECIAL 0
  150. #endif
  151. #if defined(CONFIG_HAVE_ARCH_SOFT_DIRTY)
  152. # define _PAGE_SOFT_DIRTY (1 << _PAGE_SOFT_DIRTY_SHIFT)
  153. #else
  154. # define _PAGE_SOFT_DIRTY 0
  155. #endif
  156. /* Used by TLB hardware (placed in EntryLo*) */
  157. #if defined(CONFIG_XPA)
  158. # define _PAGE_NO_EXEC (1 << _PAGE_NO_EXEC_SHIFT)
  159. #elif defined(CONFIG_CPU_HAS_RIXI)
  160. # define _PAGE_NO_EXEC (cpu_has_rixi ? (1 << _PAGE_NO_EXEC_SHIFT) : 0)
  161. #endif
  162. #define _PAGE_NO_READ (1 << _PAGE_NO_READ_SHIFT)
  163. #define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT)
  164. #define _PAGE_VALID (1 << _PAGE_VALID_SHIFT)
  165. #define _PAGE_DIRTY (1 << _PAGE_DIRTY_SHIFT)
  166. #if defined(CONFIG_CPU_R3K_TLB)
  167. # define _CACHE_UNCACHED (1 << _CACHE_UNCACHED_SHIFT)
  168. # define _CACHE_MASK _CACHE_UNCACHED
  169. # define _PFN_SHIFT PAGE_SHIFT
  170. #else
  171. # define _CACHE_MASK (7 << _CACHE_SHIFT)
  172. # define _PFN_SHIFT (PAGE_SHIFT - 12 + _CACHE_SHIFT + 3)
  173. #endif
  174. #ifndef _PAGE_NO_EXEC
  175. #define _PAGE_NO_EXEC 0
  176. #endif
  177. #define _PAGE_SILENT_READ _PAGE_VALID
  178. #define _PAGE_SILENT_WRITE _PAGE_DIRTY
  179. #define _PFN_MASK (~((1 << (_PFN_SHIFT)) - 1))
  180. /*
  181. * The final layouts of the PTE bits are:
  182. *
  183. * 64-bit, R1 or earlier: CCC D V G [S H] M A W R P
  184. * 32-bit, R1 or earler: CCC D V G M A W R P
  185. * 64-bit, R2 or later: CCC D V G RI/R XI [S H] M A W P
  186. * 32-bit, R2 or later: CCC D V G RI/R XI M A W P
  187. */
  188. /*
  189. * pte_to_entrylo converts a page table entry (PTE) into a Mips
  190. * entrylo0/1 value.
  191. */
  192. static inline uint64_t pte_to_entrylo(unsigned long pte_val)
  193. {
  194. #ifdef CONFIG_CPU_HAS_RIXI
  195. if (cpu_has_rixi) {
  196. int sa;
  197. #ifdef CONFIG_32BIT
  198. sa = 31 - _PAGE_NO_READ_SHIFT;
  199. #else
  200. sa = 63 - _PAGE_NO_READ_SHIFT;
  201. #endif
  202. /*
  203. * C has no way to express that this is a DSRL
  204. * _PAGE_NO_EXEC_SHIFT followed by a ROTR 2. Luckily
  205. * in the fast path this is done in assembly
  206. */
  207. return (pte_val >> _PAGE_GLOBAL_SHIFT) |
  208. ((pte_val & (_PAGE_NO_EXEC | _PAGE_NO_READ)) << sa);
  209. }
  210. #endif
  211. return pte_val >> _PAGE_GLOBAL_SHIFT;
  212. }
  213. /*
  214. * Cache attributes
  215. */
  216. #if defined(CONFIG_CPU_R3K_TLB)
  217. #define _CACHE_CACHABLE_NONCOHERENT 0
  218. #define _CACHE_UNCACHED_ACCELERATED _CACHE_UNCACHED
  219. #elif defined(CONFIG_CPU_SB1)
  220. /* No penalty for being coherent on the SB1, so just
  221. use it for "noncoherent" spaces, too. Shouldn't hurt. */
  222. #define _CACHE_CACHABLE_NONCOHERENT (5<<_CACHE_SHIFT)
  223. #endif
  224. #ifndef _CACHE_CACHABLE_NO_WA
  225. #define _CACHE_CACHABLE_NO_WA (0<<_CACHE_SHIFT)
  226. #endif
  227. #ifndef _CACHE_CACHABLE_WA
  228. #define _CACHE_CACHABLE_WA (1<<_CACHE_SHIFT)
  229. #endif
  230. #ifndef _CACHE_UNCACHED
  231. #define _CACHE_UNCACHED (2<<_CACHE_SHIFT)
  232. #endif
  233. #ifndef _CACHE_CACHABLE_NONCOHERENT
  234. #define _CACHE_CACHABLE_NONCOHERENT (3<<_CACHE_SHIFT)
  235. #endif
  236. #ifndef _CACHE_CACHABLE_CE
  237. #define _CACHE_CACHABLE_CE (4<<_CACHE_SHIFT)
  238. #endif
  239. #ifndef _CACHE_CACHABLE_COW
  240. #define _CACHE_CACHABLE_COW (5<<_CACHE_SHIFT)
  241. #endif
  242. #ifndef _CACHE_CACHABLE_CUW
  243. #define _CACHE_CACHABLE_CUW (6<<_CACHE_SHIFT)
  244. #endif
  245. #ifndef _CACHE_UNCACHED_ACCELERATED
  246. #define _CACHE_UNCACHED_ACCELERATED (7<<_CACHE_SHIFT)
  247. #endif
  248. #define __READABLE (_PAGE_SILENT_READ | _PAGE_ACCESSED)
  249. #define __WRITEABLE (_PAGE_SILENT_WRITE | _PAGE_WRITE | _PAGE_MODIFIED)
  250. #define _PAGE_CHG_MASK (_PAGE_ACCESSED | _PAGE_MODIFIED | \
  251. _PAGE_SOFT_DIRTY | _PFN_MASK | _CACHE_MASK)
  252. #endif /* _ASM_PGTABLE_BITS_H */