pgalloc-32.h 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #ifndef _ASM_POWERPC_PGALLOC_32_H
  2. #define _ASM_POWERPC_PGALLOC_32_H
  3. #include <linux/threads.h>
  4. /* For 32-bit, all levels of page tables are just drawn from get_free_page() */
  5. #define MAX_PGTABLE_INDEX_SIZE 0
  6. extern void __bad_pte(pmd_t *pmd);
  7. extern pgd_t *pgd_alloc(struct mm_struct *mm);
  8. extern void pgd_free(struct mm_struct *mm, pgd_t *pgd);
  9. /*
  10. * We don't have any real pmd's, and this code never triggers because
  11. * the pgd will always be present..
  12. */
  13. /* #define pmd_alloc_one(mm,address) ({ BUG(); ((pmd_t *)2); }) */
  14. #define pmd_free(mm, x) do { } while (0)
  15. #define __pmd_free_tlb(tlb,x,a) do { } while (0)
  16. /* #define pgd_populate(mm, pmd, pte) BUG() */
  17. #ifndef CONFIG_BOOKE
  18. #define pmd_populate_kernel(mm, pmd, pte) \
  19. (pmd_val(*(pmd)) = __pa(pte) | _PMD_PRESENT)
  20. #define pmd_populate(mm, pmd, pte) \
  21. (pmd_val(*(pmd)) = (page_to_pfn(pte) << PAGE_SHIFT) | _PMD_PRESENT)
  22. #define pmd_pgtable(pmd) pmd_page(pmd)
  23. #else
  24. #define pmd_populate_kernel(mm, pmd, pte) \
  25. (pmd_val(*(pmd)) = (unsigned long)pte | _PMD_PRESENT)
  26. #define pmd_populate(mm, pmd, pte) \
  27. (pmd_val(*(pmd)) = (unsigned long)lowmem_page_address(pte) | _PMD_PRESENT)
  28. #define pmd_pgtable(pmd) pmd_page(pmd)
  29. #endif
  30. extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr);
  31. extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr);
  32. static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
  33. {
  34. free_page((unsigned long)pte);
  35. }
  36. static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage)
  37. {
  38. pgtable_page_dtor(ptepage);
  39. __free_page(ptepage);
  40. }
  41. static inline void pgtable_free(void *table, unsigned index_size)
  42. {
  43. BUG_ON(index_size); /* 32-bit doesn't use this */
  44. free_page((unsigned long)table);
  45. }
  46. #define check_pgt_cache() do { } while (0)
  47. #ifdef CONFIG_SMP
  48. static inline void pgtable_free_tlb(struct mmu_gather *tlb,
  49. void *table, int shift)
  50. {
  51. unsigned long pgf = (unsigned long)table;
  52. BUG_ON(shift > MAX_PGTABLE_INDEX_SIZE);
  53. pgf |= shift;
  54. tlb_remove_table(tlb, (void *)pgf);
  55. }
  56. static inline void __tlb_remove_table(void *_table)
  57. {
  58. void *table = (void *)((unsigned long)_table & ~MAX_PGTABLE_INDEX_SIZE);
  59. unsigned shift = (unsigned long)_table & MAX_PGTABLE_INDEX_SIZE;
  60. pgtable_free(table, shift);
  61. }
  62. #else
  63. static inline void pgtable_free_tlb(struct mmu_gather *tlb,
  64. void *table, int shift)
  65. {
  66. pgtable_free(table, shift);
  67. }
  68. #endif
  69. static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table,
  70. unsigned long address)
  71. {
  72. tlb_flush_pgtable(tlb, address);
  73. pgtable_page_dtor(table);
  74. pgtable_free_tlb(tlb, page_address(table), 0);
  75. }
  76. #endif /* _ASM_POWERPC_PGALLOC_32_H */