hc
2024-02-19 890e1df1bec891d9203724541e81f8fbe5183388
kernel/arch/sparc/include/asm/pgtable_32.h
....@@ -11,8 +11,18 @@
1111
1212 #include <linux/const.h>
1313
14
+#define PMD_SHIFT 18
15
+#define PMD_SIZE (1UL << PMD_SHIFT)
16
+#define PMD_MASK (~(PMD_SIZE-1))
17
+#define PMD_ALIGN(__addr) (((__addr) + ~PMD_MASK) & PMD_MASK)
18
+
19
+#define PGDIR_SHIFT 24
20
+#define PGDIR_SIZE (1UL << PGDIR_SHIFT)
21
+#define PGDIR_MASK (~(PGDIR_SIZE-1))
22
+#define PGDIR_ALIGN(__addr) (((__addr) + ~PGDIR_MASK) & PGDIR_MASK)
23
+
1424 #ifndef __ASSEMBLY__
15
-#include <asm-generic/4level-fixup.h>
25
+#include <asm-generic/pgtable-nopud.h>
1626
1727 #include <linux/spinlock.h>
1828 #include <linux/mm_types.h>
....@@ -34,17 +44,10 @@
3444 #define pmd_ERROR(e) __builtin_trap()
3545 #define pgd_ERROR(e) __builtin_trap()
3646
37
-#define PMD_SHIFT 22
38
-#define PMD_SIZE (1UL << PMD_SHIFT)
39
-#define PMD_MASK (~(PMD_SIZE-1))
40
-#define PMD_ALIGN(__addr) (((__addr) + ~PMD_MASK) & PMD_MASK)
41
-#define PGDIR_SHIFT SRMMU_PGDIR_SHIFT
42
-#define PGDIR_SIZE SRMMU_PGDIR_SIZE
43
-#define PGDIR_MASK SRMMU_PGDIR_MASK
44
-#define PTRS_PER_PTE 1024
45
-#define PTRS_PER_PMD SRMMU_PTRS_PER_PMD
46
-#define PTRS_PER_PGD SRMMU_PTRS_PER_PGD
47
-#define USER_PTRS_PER_PGD PAGE_OFFSET / SRMMU_PGDIR_SIZE
47
+#define PTRS_PER_PTE 64
48
+#define PTRS_PER_PMD 64
49
+#define PTRS_PER_PGD 256
50
+#define USER_PTRS_PER_PGD PAGE_OFFSET / PGDIR_SIZE
4851 #define FIRST_USER_ADDRESS 0UL
4952 #define PTE_SIZE (PTRS_PER_PTE*4)
5053
....@@ -132,13 +135,30 @@
132135 return pfn_to_page((pmd_val(pmd) & SRMMU_PTD_PMASK) >> (PAGE_SHIFT-4));
133136 }
134137
135
-static inline unsigned long pgd_page_vaddr(pgd_t pgd)
138
+static inline unsigned long __pmd_page(pmd_t pmd)
136139 {
137
- if (srmmu_device_memory(pgd_val(pgd))) {
138
- return ~0;
140
+ unsigned long v;
141
+
142
+ if (srmmu_device_memory(pmd_val(pmd)))
143
+ BUG();
144
+
145
+ v = pmd_val(pmd) & SRMMU_PTD_PMASK;
146
+ return (unsigned long)__nocache_va(v << 4);
147
+}
148
+
149
+static inline unsigned long pmd_page_vaddr(pmd_t pmd)
150
+{
151
+ unsigned long v = pmd_val(pmd) & SRMMU_PTD_PMASK;
152
+ return (unsigned long)__nocache_va(v << 4);
153
+}
154
+
155
+static inline pmd_t *pud_pgtable(pud_t pud)
156
+{
157
+ if (srmmu_device_memory(pud_val(pud))) {
158
+ return (pmd_t *)~0;
139159 } else {
140
- unsigned long v = pgd_val(pgd) & SRMMU_PTD_PMASK;
141
- return (unsigned long)__nocache_va(v << 4);
160
+ unsigned long v = pud_val(pud) & SRMMU_PTD_PMASK;
161
+ return (pmd_t *)__nocache_va(v << 4);
142162 }
143163 }
144164
....@@ -179,29 +199,27 @@
179199
180200 static inline void pmd_clear(pmd_t *pmdp)
181201 {
182
- int i;
183
- for (i = 0; i < PTRS_PER_PTE/SRMMU_REAL_PTRS_PER_PTE; i++)
184
- set_pte((pte_t *)&pmdp->pmdv[i], __pte(0));
202
+ set_pte((pte_t *)&pmd_val(*pmdp), __pte(0));
185203 }
186204
187
-static inline int pgd_none(pgd_t pgd)
205
+static inline int pud_none(pud_t pud)
188206 {
189
- return !(pgd_val(pgd) & 0xFFFFFFF);
207
+ return !(pud_val(pud) & 0xFFFFFFF);
190208 }
191209
192
-static inline int pgd_bad(pgd_t pgd)
210
+static inline int pud_bad(pud_t pud)
193211 {
194
- return (pgd_val(pgd) & SRMMU_ET_MASK) != SRMMU_ET_PTD;
212
+ return (pud_val(pud) & SRMMU_ET_MASK) != SRMMU_ET_PTD;
195213 }
196214
197
-static inline int pgd_present(pgd_t pgd)
215
+static inline int pud_present(pud_t pud)
198216 {
199
- return ((pgd_val(pgd) & SRMMU_ET_MASK) == SRMMU_ET_PTD);
217
+ return ((pud_val(pud) & SRMMU_ET_MASK) == SRMMU_ET_PTD);
200218 }
201219
202
-static inline void pgd_clear(pgd_t *pgdp)
220
+static inline void pud_clear(pud_t *pudp)
203221 {
204
- set_pte((pte_t *)pgdp, __pte(0));
222
+ set_pte((pte_t *)pudp, __pte(0));
205223 }
206224
207225 /*
....@@ -221,11 +239,6 @@
221239 static inline int pte_young(pte_t pte)
222240 {
223241 return pte_val(pte) & SRMMU_REF;
224
-}
225
-
226
-static inline int pte_special(pte_t pte)
227
-{
228
- return 0;
229242 }
230243
231244 static inline pte_t pte_wrprotect(pte_t pte)
....@@ -257,8 +270,6 @@
257270 {
258271 return __pte(pte_val(pte) | SRMMU_REF);
259272 }
260
-
261
-#define pte_mkspecial(pte) (pte)
262273
263274 #define pfn_pte(pfn, prot) mk_pte(pfn_to_page(pfn), prot)
264275
....@@ -309,30 +320,6 @@
309320 return __pte((pte_val(pte) & SRMMU_CHG_MASK) |
310321 pgprot_val(newprot));
311322 }
312
-
313
-#define pgd_index(address) ((address) >> PGDIR_SHIFT)
314
-
315
-/* to find an entry in a page-table-directory */
316
-#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address))
317
-
318
-/* to find an entry in a kernel page-table-directory */
319
-#define pgd_offset_k(address) pgd_offset(&init_mm, address)
320
-
321
-/* Find an entry in the second-level page table.. */
322
-static inline pmd_t *pmd_offset(pgd_t * dir, unsigned long address)
323
-{
324
- return (pmd_t *) pgd_page_vaddr(*dir) +
325
- ((address >> PMD_SHIFT) & (PTRS_PER_PMD - 1));
326
-}
327
-
328
-/* Find an entry in the third-level page table.. */
329
-pte_t *pte_offset_kernel(pmd_t * dir, unsigned long address);
330
-
331
-/*
332
- * This shortcut works on sun4m (and sun4d) because the nocache area is static.
333
- */
334
-#define pte_offset_map(d, a) pte_offset_kernel(d,a)
335
-#define pte_unmap(pte) do{}while(0)
336323
337324 struct seq_file;
338325 void mmu_info(struct seq_file *m);
....@@ -422,7 +409,7 @@
422409
423410 return remap_pfn_range(vma, from, phys_base >> PAGE_SHIFT, size, prot);
424411 }
425
-#define io_remap_pfn_range io_remap_pfn_range
412
+#define io_remap_pfn_range io_remap_pfn_range
426413
427414 #define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
428415 #define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \
....@@ -435,8 +422,6 @@
435422 __changed; \
436423 })
437424
438
-#include <asm-generic/pgtable.h>
439
-
440425 #endif /* !(__ASSEMBLY__) */
441426
442427 #define VMALLOC_START _AC(0xfe600000,UL)
....@@ -444,10 +429,5 @@
444429
445430 /* We provide our own get_unmapped_area to cope with VA holes for userland */
446431 #define HAVE_ARCH_UNMAPPED_AREA
447
-
448
-/*
449
- * No page table caches to initialise
450
- */
451
-#define pgtable_cache_init() do { } while (0)
452432
453433 #endif /* !(_SPARC_PGTABLE_H) */