hc
2024-10-12 a5969cabbb4660eab42b6ef0412cbbd1200cf14d
kernel/arch/m68k/include/asm/motorola_pgalloc.h
....@@ -5,93 +5,77 @@
55 #include <asm/tlb.h>
66 #include <asm/tlbflush.h>
77
8
-extern pmd_t *get_pointer_table(void);
9
-extern int free_pointer_table(pmd_t *);
8
+extern void mmu_page_ctor(void *page);
9
+extern void mmu_page_dtor(void *page);
1010
11
-static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
11
+enum m68k_table_types {
12
+ TABLE_PGD = 0,
13
+ TABLE_PMD = 0, /* same size as PGD */
14
+ TABLE_PTE = 1,
15
+};
16
+
17
+extern void init_pointer_table(void *table, int type);
18
+extern void *get_pointer_table(int type);
19
+extern int free_pointer_table(void *table, int type);
20
+
21
+/*
22
+ * Allocate and free page tables. The xxx_kernel() versions are
23
+ * used to allocate a kernel page table - this turns on ASN bits
24
+ * if any.
25
+ */
26
+
27
+static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
1228 {
13
- pte_t *pte;
14
-
15
- pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_ZERO);
16
- if (pte) {
17
- __flush_page_to_ram(pte);
18
- flush_tlb_kernel_page(pte);
19
- nocache_page(pte);
20
- }
21
-
22
- return pte;
29
+ return get_pointer_table(TABLE_PTE);
2330 }
2431
2532 static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
2633 {
27
- cache_page(pte);
28
- free_page((unsigned long) pte);
34
+ free_pointer_table(pte, TABLE_PTE);
2935 }
3036
31
-static inline pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address)
37
+static inline pgtable_t pte_alloc_one(struct mm_struct *mm)
3238 {
33
- struct page *page;
34
- pte_t *pte;
35
-
36
- page = alloc_pages(GFP_KERNEL|__GFP_ZERO, 0);
37
- if(!page)
38
- return NULL;
39
- if (!pgtable_page_ctor(page)) {
40
- __free_page(page);
41
- return NULL;
42
- }
43
-
44
- pte = kmap(page);
45
- __flush_page_to_ram(pte);
46
- flush_tlb_kernel_page(pte);
47
- nocache_page(pte);
48
- kunmap(page);
49
- return page;
39
+ return get_pointer_table(TABLE_PTE);
5040 }
5141
52
-static inline void pte_free(struct mm_struct *mm, pgtable_t page)
42
+static inline void pte_free(struct mm_struct *mm, pgtable_t pgtable)
5343 {
54
- pgtable_page_dtor(page);
55
- cache_page(kmap(page));
56
- kunmap(page);
57
- __free_page(page);
44
+ free_pointer_table(pgtable, TABLE_PTE);
5845 }
5946
60
-static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t page,
47
+static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pgtable,
6148 unsigned long address)
6249 {
63
- pgtable_page_dtor(page);
64
- cache_page(kmap(page));
65
- kunmap(page);
66
- __free_page(page);
50
+ free_pointer_table(pgtable, TABLE_PTE);
6751 }
6852
6953
7054 static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
7155 {
72
- return get_pointer_table();
56
+ return get_pointer_table(TABLE_PMD);
7357 }
7458
7559 static inline int pmd_free(struct mm_struct *mm, pmd_t *pmd)
7660 {
77
- return free_pointer_table(pmd);
61
+ return free_pointer_table(pmd, TABLE_PMD);
7862 }
7963
8064 static inline int __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
8165 unsigned long address)
8266 {
83
- return free_pointer_table(pmd);
67
+ return free_pointer_table(pmd, TABLE_PMD);
8468 }
8569
8670
8771 static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
8872 {
89
- pmd_free(mm, (pmd_t *)pgd);
73
+ free_pointer_table(pgd, TABLE_PGD);
9074 }
9175
9276 static inline pgd_t *pgd_alloc(struct mm_struct *mm)
9377 {
94
- return (pgd_t *)get_pointer_table();
78
+ return get_pointer_table(TABLE_PGD);
9579 }
9680
9781
....@@ -102,13 +86,13 @@
10286
10387 static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t page)
10488 {
105
- pmd_set(pmd, page_address(page));
89
+ pmd_set(pmd, page);
10690 }
107
-#define pmd_pgtable(pmd) pmd_page(pmd)
91
+#define pmd_pgtable(pmd) ((pgtable_t)pmd_page_vaddr(pmd))
10892
109
-static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
93
+static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
11094 {
111
- pgd_set(pgd, pmd);
95
+ pud_set(pud, pmd);
11296 }
11397
11498 #endif /* _MOTOROLA_PGALLOC_H */