mcf_pgalloc.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef M68K_MCF_PGALLOC_H
  3. #define M68K_MCF_PGALLOC_H
  4. #include <asm/tlb.h>
  5. #include <asm/tlbflush.h>
  6. extern inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
  7. {
  8. free_page((unsigned long) pte);
  9. }
  10. extern const char bad_pmd_string[];
  11. extern inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
  12. {
  13. unsigned long page = __get_free_page(GFP_DMA);
  14. if (!page)
  15. return NULL;
  16. memset((void *)page, 0, PAGE_SIZE);
  17. return (pte_t *) (page);
  18. }
  19. extern inline pmd_t *pmd_alloc_kernel(pgd_t *pgd, unsigned long address)
  20. {
  21. return (pmd_t *) pgd;
  22. }
  23. #define pmd_populate(mm, pmd, pte) (pmd_val(*pmd) = (unsigned long)(pte))
  24. #define pmd_populate_kernel pmd_populate
  25. static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pgtable,
  26. unsigned long address)
  27. {
  28. struct page *page = virt_to_page(pgtable);
  29. pgtable_pte_page_dtor(page);
  30. __free_page(page);
  31. }
  32. static inline pgtable_t pte_alloc_one(struct mm_struct *mm)
  33. {
  34. struct page *page = alloc_pages(GFP_DMA, 0);
  35. pte_t *pte;
  36. if (!page)
  37. return NULL;
  38. if (!pgtable_pte_page_ctor(page)) {
  39. __free_page(page);
  40. return NULL;
  41. }
  42. pte = page_address(page);
  43. clear_page(pte);
  44. return pte;
  45. }
  46. static inline void pte_free(struct mm_struct *mm, pgtable_t pgtable)
  47. {
  48. struct page *page = virt_to_page(pgtable);
  49. pgtable_pte_page_dtor(page);
  50. __free_page(page);
  51. }
  52. /*
  53. * In our implementation, each pgd entry contains 1 pmd that is never allocated
  54. * or freed. pgd_present is always 1, so this should never be called. -NL
  55. */
  56. #define pmd_free(mm, pmd) BUG()
  57. static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
  58. {
  59. free_page((unsigned long) pgd);
  60. }
  61. static inline pgd_t *pgd_alloc(struct mm_struct *mm)
  62. {
  63. pgd_t *new_pgd;
  64. new_pgd = (pgd_t *)__get_free_page(GFP_DMA | __GFP_NOWARN);
  65. if (!new_pgd)
  66. return NULL;
  67. memcpy(new_pgd, swapper_pg_dir, PTRS_PER_PGD * sizeof(pgd_t));
  68. memset(new_pgd, 0, PAGE_OFFSET >> PGDIR_SHIFT);
  69. return new_pgd;
  70. }
  71. #endif /* M68K_MCF_PGALLOC_H */