pgalloc.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _ASM_PGALLOC_H
  3. #define _ASM_PGALLOC_H
  4. #include <linux/gfp.h>
  5. #include <linux/mm.h>
  6. #include <linux/threads.h>
  7. #include <asm/processor.h>
  8. #include <asm/fixmap.h>
  9. #include <asm/cache.h>
  10. #define __HAVE_ARCH_PMD_ALLOC_ONE
  11. #define __HAVE_ARCH_PMD_FREE
  12. #define __HAVE_ARCH_PGD_FREE
  13. #include <asm-generic/pgalloc.h>
  14. /* Allocate the top level pgd (page directory) */
  15. static inline pgd_t *pgd_alloc(struct mm_struct *mm)
  16. {
  17. pgd_t *pgd;
  18. pgd = (pgd_t *) __get_free_pages(GFP_KERNEL, PGD_TABLE_ORDER);
  19. if (unlikely(pgd == NULL))
  20. return NULL;
  21. memset(pgd, 0, PAGE_SIZE << PGD_TABLE_ORDER);
  22. return pgd;
  23. }
  24. static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
  25. {
  26. free_pages((unsigned long)pgd, PGD_TABLE_ORDER);
  27. }
  28. #if CONFIG_PGTABLE_LEVELS == 3
  29. /* Three Level Page Table Support for pmd's */
  30. static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
  31. {
  32. set_pud(pud, __pud((PxD_FLAG_PRESENT | PxD_FLAG_VALID) +
  33. (__u32)(__pa((unsigned long)pmd) >> PxD_VALUE_SHIFT)));
  34. }
  35. static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
  36. {
  37. pmd_t *pmd;
  38. pmd = (pmd_t *)__get_free_pages(GFP_PGTABLE_KERNEL, PMD_TABLE_ORDER);
  39. if (likely(pmd))
  40. memset ((void *)pmd, 0, PAGE_SIZE << PMD_TABLE_ORDER);
  41. return pmd;
  42. }
  43. static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
  44. {
  45. free_pages((unsigned long)pmd, PMD_TABLE_ORDER);
  46. }
  47. #endif
  48. static inline void
  49. pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte)
  50. {
  51. set_pmd(pmd, __pmd((PxD_FLAG_PRESENT | PxD_FLAG_VALID)
  52. + (__u32)(__pa((unsigned long)pte) >> PxD_VALUE_SHIFT)));
  53. }
  54. #define pmd_populate(mm, pmd, pte_page) \
  55. pmd_populate_kernel(mm, pmd, page_address(pte_page))
  56. #endif