pgalloc_32.h 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #ifndef _SPARC_PGALLOC_H
  2. #define _SPARC_PGALLOC_H
  3. #include <linux/kernel.h>
  4. #include <linux/sched.h>
  5. #include <asm/pgtsrmmu.h>
  6. #include <asm/btfixup.h>
  7. #include <asm/pgtable.h>
  8. #include <asm/vaddrs.h>
  9. #include <asm/page.h>
  10. struct page;
  11. extern struct pgtable_cache_struct {
  12. unsigned long *pgd_cache;
  13. unsigned long *pte_cache;
  14. unsigned long pgtable_cache_sz;
  15. unsigned long pgd_cache_sz;
  16. } pgt_quicklists;
  17. unsigned long srmmu_get_nocache(int size, int align);
  18. void srmmu_free_nocache(unsigned long vaddr, int size);
  19. #define pgd_quicklist (pgt_quicklists.pgd_cache)
  20. #define pmd_quicklist ((unsigned long *)0)
  21. #define pte_quicklist (pgt_quicklists.pte_cache)
  22. #define pgtable_cache_size (pgt_quicklists.pgtable_cache_sz)
  23. #define pgd_cache_size (pgt_quicklists.pgd_cache_sz)
  24. #define check_pgt_cache() do { } while (0)
  25. pgd_t *get_pgd_fast(void);
  26. static inline void free_pgd_fast(pgd_t *pgd)
  27. {
  28. srmmu_free_nocache((unsigned long)pgd, SRMMU_PGD_TABLE_SIZE);
  29. }
  30. #define pgd_free(mm, pgd) free_pgd_fast(pgd)
  31. #define pgd_alloc(mm) get_pgd_fast()
  32. static inline void pgd_set(pgd_t * pgdp, pmd_t * pmdp)
  33. {
  34. unsigned long pa = __nocache_pa((unsigned long)pmdp);
  35. set_pte((pte_t *)pgdp, (SRMMU_ET_PTD | (pa >> 4)));
  36. }
  37. #define pgd_populate(MM, PGD, PMD) pgd_set(PGD, PMD)
  38. static inline pmd_t *pmd_alloc_one(struct mm_struct *mm,
  39. unsigned long address)
  40. {
  41. return (pmd_t *)srmmu_get_nocache(SRMMU_PMD_TABLE_SIZE,
  42. SRMMU_PMD_TABLE_SIZE);
  43. }
  44. static inline void free_pmd_fast(pmd_t * pmd)
  45. {
  46. srmmu_free_nocache((unsigned long)pmd, SRMMU_PMD_TABLE_SIZE);
  47. }
  48. #define pmd_free(mm, pmd) free_pmd_fast(pmd)
  49. #define __pmd_free_tlb(tlb, pmd, addr) pmd_free((tlb)->mm, pmd)
  50. void pmd_populate(struct mm_struct *mm, pmd_t *pmdp, struct page *ptep);
  51. #define pmd_pgtable(pmd) pmd_page(pmd)
  52. void pmd_set(pmd_t *pmdp, pte_t *ptep);
  53. #define pmd_populate_kernel(MM, PMD, PTE) pmd_set(PMD, PTE)
  54. pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address);
  55. static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
  56. unsigned long address)
  57. {
  58. return (pte_t *)srmmu_get_nocache(PTE_SIZE, PTE_SIZE);
  59. }
  60. static inline void free_pte_fast(pte_t *pte)
  61. {
  62. srmmu_free_nocache((unsigned long)pte, PTE_SIZE);
  63. }
  64. #define pte_free_kernel(mm, pte) free_pte_fast(pte)
  65. void pte_free(struct mm_struct * mm, pgtable_t pte);
  66. #define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, pte)
  67. #endif /* _SPARC_PGALLOC_H */