pgtable.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
  4. *
  5. * Derived from MIPS:
  6. * Copyright (C) 1994, 95, 96, 97, 98, 99, 2000, 2003 Ralf Baechle
  7. * Copyright (C) 1999, 2000, 2001 Silicon Graphics, Inc.
  8. */
  9. #ifndef _ASM_PGTABLE_H
  10. #define _ASM_PGTABLE_H
  11. #include <linux/compiler.h>
  12. #include <asm/addrspace.h>
  13. #include <asm/pgtable-bits.h>
  14. #if CONFIG_PGTABLE_LEVELS == 2
  15. #include <asm-generic/pgtable-nopmd.h>
  16. #elif CONFIG_PGTABLE_LEVELS == 3
  17. #include <asm-generic/pgtable-nopud.h>
  18. #else
  19. #include <asm-generic/pgtable-nop4d.h>
  20. #endif
  21. #if CONFIG_PGTABLE_LEVELS == 2
  22. #define PGDIR_SHIFT (PAGE_SHIFT + (PAGE_SHIFT - 3))
  23. #elif CONFIG_PGTABLE_LEVELS == 3
  24. #define PMD_SHIFT (PAGE_SHIFT + (PAGE_SHIFT - 3))
  25. #define PMD_SIZE (1UL << PMD_SHIFT)
  26. #define PMD_MASK (~(PMD_SIZE-1))
  27. #define PGDIR_SHIFT (PMD_SHIFT + (PAGE_SHIFT - 3))
  28. #elif CONFIG_PGTABLE_LEVELS == 4
  29. #define PMD_SHIFT (PAGE_SHIFT + (PAGE_SHIFT - 3))
  30. #define PMD_SIZE (1UL << PMD_SHIFT)
  31. #define PMD_MASK (~(PMD_SIZE-1))
  32. #define PUD_SHIFT (PMD_SHIFT + (PAGE_SHIFT - 3))
  33. #define PUD_SIZE (1UL << PUD_SHIFT)
  34. #define PUD_MASK (~(PUD_SIZE-1))
  35. #define PGDIR_SHIFT (PUD_SHIFT + (PAGE_SHIFT - 3))
  36. #endif
  37. #define PGDIR_SIZE (1UL << PGDIR_SHIFT)
  38. #define PGDIR_MASK (~(PGDIR_SIZE-1))
  39. #define VA_BITS (PGDIR_SHIFT + (PAGE_SHIFT - 3))
  40. #define PTRS_PER_PGD (PAGE_SIZE >> 3)
  41. #if CONFIG_PGTABLE_LEVELS > 3
  42. #define PTRS_PER_PUD (PAGE_SIZE >> 3)
  43. #endif
  44. #if CONFIG_PGTABLE_LEVELS > 2
  45. #define PTRS_PER_PMD (PAGE_SIZE >> 3)
  46. #endif
  47. #define PTRS_PER_PTE (PAGE_SIZE >> 3)
  48. #define USER_PTRS_PER_PGD ((TASK_SIZE64 / PGDIR_SIZE)?(TASK_SIZE64 / PGDIR_SIZE):1)
  49. #ifndef __ASSEMBLY__
  50. #include <linux/mm_types.h>
  51. #include <linux/mmzone.h>
  52. #include <asm/fixmap.h>
  53. struct mm_struct;
  54. struct vm_area_struct;
  55. /*
  56. * ZERO_PAGE is a global shared page that is always zero; used
  57. * for zero-mapped memory areas etc..
  58. */
  59. extern unsigned long empty_zero_page;
  60. extern unsigned long zero_page_mask;
  61. #define ZERO_PAGE(vaddr) \
  62. (virt_to_page((void *)(empty_zero_page + (((unsigned long)(vaddr)) & zero_page_mask))))
  63. #define __HAVE_COLOR_ZERO_PAGE
  64. /*
  65. * TLB refill handlers may also map the vmalloc area into xkvrange.
  66. * Avoid the first couple of pages so NULL pointer dereferences will
  67. * still reliably trap.
  68. */
  69. #define MODULES_VADDR (vm_map_base + PCI_IOSIZE + (2 * PAGE_SIZE))
  70. #define MODULES_END (MODULES_VADDR + SZ_256M)
  71. #define VMALLOC_START MODULES_END
  72. #define VMALLOC_END \
  73. (vm_map_base + \
  74. min(PTRS_PER_PGD * PTRS_PER_PUD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE, (1UL << cpu_vabits)) - PMD_SIZE)
  75. #define pte_ERROR(e) \
  76. pr_err("%s:%d: bad pte %016lx.\n", __FILE__, __LINE__, pte_val(e))
  77. #ifndef __PAGETABLE_PMD_FOLDED
  78. #define pmd_ERROR(e) \
  79. pr_err("%s:%d: bad pmd %016lx.\n", __FILE__, __LINE__, pmd_val(e))
  80. #endif
  81. #ifndef __PAGETABLE_PUD_FOLDED
  82. #define pud_ERROR(e) \
  83. pr_err("%s:%d: bad pud %016lx.\n", __FILE__, __LINE__, pud_val(e))
  84. #endif
  85. #define pgd_ERROR(e) \
  86. pr_err("%s:%d: bad pgd %016lx.\n", __FILE__, __LINE__, pgd_val(e))
  87. extern pte_t invalid_pte_table[PTRS_PER_PTE];
  88. #ifndef __PAGETABLE_PUD_FOLDED
  89. typedef struct { unsigned long pud; } pud_t;
  90. #define pud_val(x) ((x).pud)
  91. #define __pud(x) ((pud_t) { (x) })
  92. extern pud_t invalid_pud_table[PTRS_PER_PUD];
  93. /*
  94. * Empty pgd/p4d entries point to the invalid_pud_table.
  95. */
  96. static inline int p4d_none(p4d_t p4d)
  97. {
  98. return p4d_val(p4d) == (unsigned long)invalid_pud_table;
  99. }
  100. static inline int p4d_bad(p4d_t p4d)
  101. {
  102. return p4d_val(p4d) & ~PAGE_MASK;
  103. }
  104. static inline int p4d_present(p4d_t p4d)
  105. {
  106. return p4d_val(p4d) != (unsigned long)invalid_pud_table;
  107. }
  108. static inline void p4d_clear(p4d_t *p4dp)
  109. {
  110. p4d_val(*p4dp) = (unsigned long)invalid_pud_table;
  111. }
  112. static inline pud_t *p4d_pgtable(p4d_t p4d)
  113. {
  114. return (pud_t *)p4d_val(p4d);
  115. }
  116. static inline void set_p4d(p4d_t *p4d, p4d_t p4dval)
  117. {
  118. *p4d = p4dval;
  119. }
  120. #define p4d_phys(p4d) PHYSADDR(p4d_val(p4d))
  121. #define p4d_page(p4d) (pfn_to_page(p4d_phys(p4d) >> PAGE_SHIFT))
  122. #endif
  123. #ifndef __PAGETABLE_PMD_FOLDED
  124. typedef struct { unsigned long pmd; } pmd_t;
  125. #define pmd_val(x) ((x).pmd)
  126. #define __pmd(x) ((pmd_t) { (x) })
  127. extern pmd_t invalid_pmd_table[PTRS_PER_PMD];
  128. /*
  129. * Empty pud entries point to the invalid_pmd_table.
  130. */
  131. static inline int pud_none(pud_t pud)
  132. {
  133. return pud_val(pud) == (unsigned long)invalid_pmd_table;
  134. }
  135. static inline int pud_bad(pud_t pud)
  136. {
  137. return pud_val(pud) & ~PAGE_MASK;
  138. }
  139. static inline int pud_present(pud_t pud)
  140. {
  141. return pud_val(pud) != (unsigned long)invalid_pmd_table;
  142. }
  143. static inline void pud_clear(pud_t *pudp)
  144. {
  145. pud_val(*pudp) = ((unsigned long)invalid_pmd_table);
  146. }
  147. static inline pmd_t *pud_pgtable(pud_t pud)
  148. {
  149. return (pmd_t *)pud_val(pud);
  150. }
  151. #define set_pud(pudptr, pudval) do { *(pudptr) = (pudval); } while (0)
  152. #define pud_phys(pud) PHYSADDR(pud_val(pud))
  153. #define pud_page(pud) (pfn_to_page(pud_phys(pud) >> PAGE_SHIFT))
  154. #endif
  155. /*
  156. * Empty pmd entries point to the invalid_pte_table.
  157. */
  158. static inline int pmd_none(pmd_t pmd)
  159. {
  160. return pmd_val(pmd) == (unsigned long)invalid_pte_table;
  161. }
  162. static inline int pmd_bad(pmd_t pmd)
  163. {
  164. return (pmd_val(pmd) & ~PAGE_MASK);
  165. }
  166. static inline int pmd_present(pmd_t pmd)
  167. {
  168. if (unlikely(pmd_val(pmd) & _PAGE_HUGE))
  169. return !!(pmd_val(pmd) & (_PAGE_PRESENT | _PAGE_PROTNONE | _PAGE_PRESENT_INVALID));
  170. return pmd_val(pmd) != (unsigned long)invalid_pte_table;
  171. }
  172. static inline void pmd_clear(pmd_t *pmdp)
  173. {
  174. pmd_val(*pmdp) = ((unsigned long)invalid_pte_table);
  175. }
  176. #define set_pmd(pmdptr, pmdval) do { *(pmdptr) = (pmdval); } while (0)
  177. #define pmd_phys(pmd) PHYSADDR(pmd_val(pmd))
  178. #ifndef CONFIG_TRANSPARENT_HUGEPAGE
  179. #define pmd_page(pmd) (pfn_to_page(pmd_phys(pmd) >> PAGE_SHIFT))
  180. #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
  181. #define pmd_page_vaddr(pmd) pmd_val(pmd)
  182. extern pmd_t mk_pmd(struct page *page, pgprot_t prot);
  183. extern void set_pmd_at(struct mm_struct *mm, unsigned long addr, pmd_t *pmdp, pmd_t pmd);
  184. #define pte_page(x) pfn_to_page(pte_pfn(x))
  185. #define pte_pfn(x) ((unsigned long)(((x).pte & _PFN_MASK) >> _PFN_SHIFT))
  186. #define pfn_pte(pfn, prot) __pte(((pfn) << _PFN_SHIFT) | pgprot_val(prot))
  187. #define pfn_pmd(pfn, prot) __pmd(((pfn) << _PFN_SHIFT) | pgprot_val(prot))
  188. /*
  189. * Initialize a new pgd / pmd table with invalid pointers.
  190. */
  191. extern void pgd_init(unsigned long page);
  192. extern void pud_init(unsigned long page, unsigned long pagetable);
  193. extern void pmd_init(unsigned long page, unsigned long pagetable);
  194. /*
  195. * Non-present pages: high 40 bits are offset, next 8 bits type,
  196. * low 16 bits zero.
  197. */
  198. static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
  199. { pte_t pte; pte_val(pte) = (type << 16) | (offset << 24); return pte; }
  200. #define __swp_type(x) (((x).val >> 16) & 0xff)
  201. #define __swp_offset(x) ((x).val >> 24)
  202. #define __swp_entry(type, offset) ((swp_entry_t) { pte_val(mk_swap_pte((type), (offset))) })
  203. #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
  204. #define __swp_entry_to_pte(x) ((pte_t) { (x).val })
  205. #define __pmd_to_swp_entry(pmd) ((swp_entry_t) { pmd_val(pmd) })
  206. #define __swp_entry_to_pmd(x) ((pmd_t) { (x).val | _PAGE_HUGE })
  207. extern void paging_init(void);
  208. #define pte_none(pte) (!(pte_val(pte) & ~_PAGE_GLOBAL))
  209. #define pte_present(pte) (pte_val(pte) & (_PAGE_PRESENT | _PAGE_PROTNONE))
  210. #define pte_no_exec(pte) (pte_val(pte) & _PAGE_NO_EXEC)
  211. static inline void set_pte(pte_t *ptep, pte_t pteval)
  212. {
  213. *ptep = pteval;
  214. if (pte_val(pteval) & _PAGE_GLOBAL) {
  215. pte_t *buddy = ptep_buddy(ptep);
  216. /*
  217. * Make sure the buddy is global too (if it's !none,
  218. * it better already be global)
  219. */
  220. #ifdef CONFIG_SMP
  221. /*
  222. * For SMP, multiple CPUs can race, so we need to do
  223. * this atomically.
  224. */
  225. unsigned long page_global = _PAGE_GLOBAL;
  226. unsigned long tmp;
  227. __asm__ __volatile__ (
  228. "1:" __LL "%[tmp], %[buddy] \n"
  229. " bnez %[tmp], 2f \n"
  230. " or %[tmp], %[tmp], %[global] \n"
  231. __SC "%[tmp], %[buddy] \n"
  232. " beqz %[tmp], 1b \n"
  233. " nop \n"
  234. "2: \n"
  235. __WEAK_LLSC_MB
  236. : [buddy] "+m" (buddy->pte), [tmp] "=&r" (tmp)
  237. : [global] "r" (page_global));
  238. #else /* !CONFIG_SMP */
  239. if (pte_none(*buddy))
  240. pte_val(*buddy) = pte_val(*buddy) | _PAGE_GLOBAL;
  241. #endif /* CONFIG_SMP */
  242. }
  243. }
  244. static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
  245. pte_t *ptep, pte_t pteval)
  246. {
  247. set_pte(ptep, pteval);
  248. }
  249. static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
  250. {
  251. /* Preserve global status for the pair */
  252. if (pte_val(*ptep_buddy(ptep)) & _PAGE_GLOBAL)
  253. set_pte_at(mm, addr, ptep, __pte(_PAGE_GLOBAL));
  254. else
  255. set_pte_at(mm, addr, ptep, __pte(0));
  256. }
  257. #define PGD_T_LOG2 (__builtin_ffs(sizeof(pgd_t)) - 1)
  258. #define PMD_T_LOG2 (__builtin_ffs(sizeof(pmd_t)) - 1)
  259. #define PTE_T_LOG2 (__builtin_ffs(sizeof(pte_t)) - 1)
  260. extern pgd_t swapper_pg_dir[];
  261. extern pgd_t invalid_pg_dir[];
  262. /*
  263. * The following only work if pte_present() is true.
  264. * Undefined behaviour if not..
  265. */
  266. static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_WRITE; }
  267. static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; }
  268. static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_MODIFIED; }
  269. static inline pte_t pte_mkold(pte_t pte)
  270. {
  271. pte_val(pte) &= ~_PAGE_ACCESSED;
  272. return pte;
  273. }
  274. static inline pte_t pte_mkyoung(pte_t pte)
  275. {
  276. pte_val(pte) |= _PAGE_ACCESSED;
  277. return pte;
  278. }
  279. static inline pte_t pte_mkclean(pte_t pte)
  280. {
  281. pte_val(pte) &= ~(_PAGE_DIRTY | _PAGE_MODIFIED);
  282. return pte;
  283. }
  284. static inline pte_t pte_mkdirty(pte_t pte)
  285. {
  286. pte_val(pte) |= _PAGE_MODIFIED;
  287. if (pte_val(pte) & _PAGE_WRITE)
  288. pte_val(pte) |= _PAGE_DIRTY;
  289. return pte;
  290. }
  291. static inline pte_t pte_mkwrite(pte_t pte)
  292. {
  293. pte_val(pte) |= _PAGE_WRITE;
  294. if (pte_val(pte) & _PAGE_MODIFIED)
  295. pte_val(pte) |= _PAGE_DIRTY;
  296. return pte;
  297. }
  298. static inline pte_t pte_wrprotect(pte_t pte)
  299. {
  300. pte_val(pte) &= ~(_PAGE_WRITE | _PAGE_DIRTY);
  301. return pte;
  302. }
  303. static inline int pte_huge(pte_t pte) { return pte_val(pte) & _PAGE_HUGE; }
  304. static inline pte_t pte_mkhuge(pte_t pte)
  305. {
  306. pte_val(pte) |= _PAGE_HUGE;
  307. return pte;
  308. }
  309. #if defined(CONFIG_ARCH_HAS_PTE_SPECIAL)
  310. static inline int pte_special(pte_t pte) { return pte_val(pte) & _PAGE_SPECIAL; }
  311. static inline pte_t pte_mkspecial(pte_t pte) { pte_val(pte) |= _PAGE_SPECIAL; return pte; }
  312. #endif /* CONFIG_ARCH_HAS_PTE_SPECIAL */
  313. #define pte_accessible pte_accessible
  314. static inline unsigned long pte_accessible(struct mm_struct *mm, pte_t a)
  315. {
  316. if (pte_val(a) & _PAGE_PRESENT)
  317. return true;
  318. if ((pte_val(a) & _PAGE_PROTNONE) &&
  319. atomic_read(&mm->tlb_flush_pending))
  320. return true;
  321. return false;
  322. }
  323. /*
  324. * Conversion functions: convert a page and protection to a page entry,
  325. * and a page entry and page directory to the page they refer to.
  326. */
  327. #define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot))
  328. static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
  329. {
  330. return __pte((pte_val(pte) & _PAGE_CHG_MASK) |
  331. (pgprot_val(newprot) & ~_PAGE_CHG_MASK));
  332. }
  333. extern void __update_tlb(struct vm_area_struct *vma,
  334. unsigned long address, pte_t *ptep);
  335. static inline void update_mmu_cache(struct vm_area_struct *vma,
  336. unsigned long address, pte_t *ptep)
  337. {
  338. __update_tlb(vma, address, ptep);
  339. }
  340. #define __HAVE_ARCH_UPDATE_MMU_TLB
  341. #define update_mmu_tlb update_mmu_cache
  342. static inline void update_mmu_cache_pmd(struct vm_area_struct *vma,
  343. unsigned long address, pmd_t *pmdp)
  344. {
  345. __update_tlb(vma, address, (pte_t *)pmdp);
  346. }
  347. #define kern_addr_valid(addr) (1)
  348. static inline unsigned long pmd_pfn(pmd_t pmd)
  349. {
  350. return (pmd_val(pmd) & _PFN_MASK) >> _PFN_SHIFT;
  351. }
  352. #ifdef CONFIG_TRANSPARENT_HUGEPAGE
  353. /* We don't have hardware dirty/accessed bits, generic_pmdp_establish is fine.*/
  354. #define pmdp_establish generic_pmdp_establish
  355. static inline int pmd_trans_huge(pmd_t pmd)
  356. {
  357. return !!(pmd_val(pmd) & _PAGE_HUGE) && pmd_present(pmd);
  358. }
  359. static inline pmd_t pmd_mkhuge(pmd_t pmd)
  360. {
  361. pmd_val(pmd) = (pmd_val(pmd) & ~(_PAGE_GLOBAL)) |
  362. ((pmd_val(pmd) & _PAGE_GLOBAL) << (_PAGE_HGLOBAL_SHIFT - _PAGE_GLOBAL_SHIFT));
  363. pmd_val(pmd) |= _PAGE_HUGE;
  364. return pmd;
  365. }
  366. #define pmd_write pmd_write
  367. static inline int pmd_write(pmd_t pmd)
  368. {
  369. return !!(pmd_val(pmd) & _PAGE_WRITE);
  370. }
  371. static inline pmd_t pmd_mkwrite(pmd_t pmd)
  372. {
  373. pmd_val(pmd) |= _PAGE_WRITE;
  374. if (pmd_val(pmd) & _PAGE_MODIFIED)
  375. pmd_val(pmd) |= _PAGE_DIRTY;
  376. return pmd;
  377. }
  378. static inline pmd_t pmd_wrprotect(pmd_t pmd)
  379. {
  380. pmd_val(pmd) &= ~(_PAGE_WRITE | _PAGE_DIRTY);
  381. return pmd;
  382. }
  383. static inline int pmd_dirty(pmd_t pmd)
  384. {
  385. return !!(pmd_val(pmd) & _PAGE_MODIFIED);
  386. }
  387. static inline pmd_t pmd_mkclean(pmd_t pmd)
  388. {
  389. pmd_val(pmd) &= ~(_PAGE_DIRTY | _PAGE_MODIFIED);
  390. return pmd;
  391. }
  392. static inline pmd_t pmd_mkdirty(pmd_t pmd)
  393. {
  394. pmd_val(pmd) |= _PAGE_MODIFIED;
  395. if (pmd_val(pmd) & _PAGE_WRITE)
  396. pmd_val(pmd) |= _PAGE_DIRTY;
  397. return pmd;
  398. }
  399. #define pmd_young pmd_young
  400. static inline int pmd_young(pmd_t pmd)
  401. {
  402. return !!(pmd_val(pmd) & _PAGE_ACCESSED);
  403. }
  404. static inline pmd_t pmd_mkold(pmd_t pmd)
  405. {
  406. pmd_val(pmd) &= ~_PAGE_ACCESSED;
  407. return pmd;
  408. }
  409. static inline pmd_t pmd_mkyoung(pmd_t pmd)
  410. {
  411. pmd_val(pmd) |= _PAGE_ACCESSED;
  412. return pmd;
  413. }
  414. static inline struct page *pmd_page(pmd_t pmd)
  415. {
  416. if (pmd_trans_huge(pmd))
  417. return pfn_to_page(pmd_pfn(pmd));
  418. return pfn_to_page(pmd_phys(pmd) >> PAGE_SHIFT);
  419. }
  420. static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
  421. {
  422. pmd_val(pmd) = (pmd_val(pmd) & _HPAGE_CHG_MASK) |
  423. (pgprot_val(newprot) & ~_HPAGE_CHG_MASK);
  424. return pmd;
  425. }
  426. static inline pmd_t pmd_mkinvalid(pmd_t pmd)
  427. {
  428. pmd_val(pmd) |= _PAGE_PRESENT_INVALID;
  429. pmd_val(pmd) &= ~(_PAGE_PRESENT | _PAGE_VALID | _PAGE_DIRTY | _PAGE_PROTNONE);
  430. return pmd;
  431. }
  432. /*
  433. * The generic version pmdp_huge_get_and_clear uses a version of pmd_clear() with a
  434. * different prototype.
  435. */
  436. #define __HAVE_ARCH_PMDP_HUGE_GET_AND_CLEAR
  437. static inline pmd_t pmdp_huge_get_and_clear(struct mm_struct *mm,
  438. unsigned long address, pmd_t *pmdp)
  439. {
  440. pmd_t old = *pmdp;
  441. pmd_clear(pmdp);
  442. return old;
  443. }
  444. #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
  445. #ifdef CONFIG_NUMA_BALANCING
  446. static inline long pte_protnone(pte_t pte)
  447. {
  448. return (pte_val(pte) & _PAGE_PROTNONE);
  449. }
  450. static inline long pmd_protnone(pmd_t pmd)
  451. {
  452. return (pmd_val(pmd) & _PAGE_PROTNONE);
  453. }
  454. #endif /* CONFIG_NUMA_BALANCING */
  455. #define pmd_leaf(pmd) ((pmd_val(pmd) & _PAGE_HUGE) != 0)
  456. #define pud_leaf(pud) ((pud_val(pud) & _PAGE_HUGE) != 0)
  457. /*
  458. * We provide our own get_unmapped area to cope with the virtual aliasing
  459. * constraints placed on us by the cache architecture.
  460. */
  461. #define HAVE_ARCH_UNMAPPED_AREA
  462. #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
  463. #endif /* !__ASSEMBLY__ */
  464. #endif /* _ASM_PGTABLE_H */