hc
2024-05-10 23fa18eaa71266feff7ba8d83022d9e1cc83c65a
kernel/arch/powerpc/include/asm/nohash/64/pgtable.h
....@@ -6,13 +6,11 @@
66 * the ppc64 non-hashed page table.
77 */
88
9
+#include <linux/sizes.h>
10
+
911 #include <asm/nohash/64/pgtable-4k.h>
1012 #include <asm/barrier.h>
1113 #include <asm/asm-const.h>
12
-
13
-#ifdef CONFIG_PPC_64K_PAGES
14
-#error "Page size not supported"
15
-#endif
1614
1715 #define FIRST_USER_ADDRESS 0UL
1816
....@@ -23,11 +21,7 @@
2321 PUD_INDEX_SIZE + PGD_INDEX_SIZE + PAGE_SHIFT)
2422 #define PGTABLE_RANGE (ASM_CONST(1) << PGTABLE_EADDR_SIZE)
2523
26
-#ifdef CONFIG_TRANSPARENT_HUGEPAGE
27
-#define PMD_CACHE_INDEX (PMD_INDEX_SIZE + 1)
28
-#else
2924 #define PMD_CACHE_INDEX PMD_INDEX_SIZE
30
-#endif
3125 #define PUD_CACHE_INDEX PUD_INDEX_SIZE
3226
3327 /*
....@@ -61,7 +55,9 @@
6155 #define PHB_IO_BASE (ISA_IO_END)
6256 #define PHB_IO_END (KERN_IO_START + FULL_IO_SIZE)
6357 #define IOREMAP_BASE (PHB_IO_END)
64
-#define IOREMAP_END (KERN_VIRT_START + KERN_VIRT_SIZE)
58
+#define IOREMAP_START (ioremap_bot)
59
+#define IOREMAP_END (KERN_VIRT_START + KERN_VIRT_SIZE - FIXADDR_SIZE)
60
+#define FIXADDR_SIZE SZ_32M
6561
6662
6763 /*
....@@ -73,7 +69,6 @@
7369
7470 #define VMALLOC_REGION_ID (REGION_ID(VMALLOC_START))
7571 #define KERNEL_REGION_ID (REGION_ID(PAGE_OFFSET))
76
-#define VMEMMAP_REGION_ID (0xfUL) /* Server only */
7772 #define USER_REGION_ID (0UL)
7873
7974 /*
....@@ -89,10 +84,46 @@
8984 * Include the PTE bits definitions
9085 */
9186 #include <asm/nohash/pte-book3e.h>
92
-#include <asm/pte-common.h>
87
+
88
+#define _PAGE_SAO 0
89
+
90
+#define PTE_RPN_MASK (~((1UL << PTE_RPN_SHIFT) - 1))
91
+
92
+/*
93
+ * _PAGE_CHG_MASK masks of bits that are to be preserved across
94
+ * pgprot changes.
95
+ */
96
+#define _PAGE_CHG_MASK (PTE_RPN_MASK | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_SPECIAL)
97
+
98
+#define H_PAGE_4K_PFN 0
9399
94100 #ifndef __ASSEMBLY__
95101 /* pte_clear moved to later in this file */
102
+
103
+static inline pte_t pte_mkwrite(pte_t pte)
104
+{
105
+ return __pte(pte_val(pte) | _PAGE_RW);
106
+}
107
+
108
+static inline pte_t pte_mkdirty(pte_t pte)
109
+{
110
+ return __pte(pte_val(pte) | _PAGE_DIRTY);
111
+}
112
+
113
+static inline pte_t pte_mkyoung(pte_t pte)
114
+{
115
+ return __pte(pte_val(pte) | _PAGE_ACCESSED);
116
+}
117
+
118
+static inline pte_t pte_wrprotect(pte_t pte)
119
+{
120
+ return __pte(pte_val(pte) & ~_PAGE_RW);
121
+}
122
+
123
+static inline pte_t pte_mkexec(pte_t pte)
124
+{
125
+ return __pte(pte_val(pte) | _PAGE_EXEC);
126
+}
96127
97128 #define PMD_BAD_BITS (PTE_TABLE_SIZE-1)
98129 #define PUD_BAD_BITS (PMD_TABLE_SIZE-1)
....@@ -133,7 +164,11 @@
133164 #define pud_bad(pud) (!is_kernel_addr(pud_val(pud)) \
134165 || (pud_val(pud) & PUD_BAD_BITS))
135166 #define pud_present(pud) (pud_val(pud) != 0)
136
-#define pud_page_vaddr(pud) (pud_val(pud) & ~PUD_MASKED_BITS)
167
+
168
+static inline pmd_t *pud_pgtable(pud_t pud)
169
+{
170
+ return (pmd_t *)(pud_val(pud) & ~PUD_MASKED_BITS);
171
+}
137172
138173 extern struct page *pud_page(pud_t pud);
139174
....@@ -147,33 +182,12 @@
147182 return __pud(pte_val(pte));
148183 }
149184 #define pud_write(pud) pte_write(pud_pte(pud))
150
-#define pgd_write(pgd) pte_write(pgd_pte(pgd))
185
+#define p4d_write(pgd) pte_write(p4d_pte(p4d))
151186
152
-static inline void pgd_set(pgd_t *pgdp, unsigned long val)
187
+static inline void p4d_set(p4d_t *p4dp, unsigned long val)
153188 {
154
- *pgdp = __pgd(val);
189
+ *p4dp = __p4d(val);
155190 }
156
-
157
-/*
158
- * Find an entry in a page-table-directory. We combine the address region
159
- * (the high order N bits) and the pgd portion of the address.
160
- */
161
-#define pgd_index(address) (((address) >> (PGDIR_SHIFT)) & (PTRS_PER_PGD - 1))
162
-
163
-#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address))
164
-
165
-#define pmd_offset(pudp,addr) \
166
- (((pmd_t *) pud_page_vaddr(*(pudp))) + (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)))
167
-
168
-#define pte_offset_kernel(dir,addr) \
169
- (((pte_t *) pmd_page_vaddr(*(dir))) + (((addr) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)))
170
-
171
-#define pte_offset_map(dir,addr) pte_offset_kernel((dir), (addr))
172
-#define pte_unmap(pte) do { } while(0)
173
-
174
-/* to find an entry in a kernel page-table-directory */
175
-/* This now only contains the vmalloc pages */
176
-#define pgd_offset_k(address) pgd_offset(&init_mm, address)
177191
178192 /* Atomic PTE updates */
179193 static inline unsigned long pte_update(struct mm_struct *mm,
....@@ -182,22 +196,9 @@
182196 unsigned long set,
183197 int huge)
184198 {
185
-#ifdef PTE_ATOMIC_UPDATES
186
- unsigned long old, tmp;
187
-
188
- __asm__ __volatile__(
189
- "1: ldarx %0,0,%3 # pte_update\n\
190
- andc %1,%0,%4 \n\
191
- or %1,%1,%6\n\
192
- stdcx. %1,0,%3 \n\
193
- bne- 1b"
194
- : "=&r" (old), "=&r" (tmp), "=m" (*ptep)
195
- : "r" (ptep), "r" (clr), "m" (*ptep), "r" (set)
196
- : "cc" );
197
-#else
198199 unsigned long old = pte_val(*ptep);
199200 *ptep = __pte((old & ~clr) | set);
200
-#endif
201
+
201202 /* huge pages use the old page table lock */
202203 if (!huge)
203204 assert_pte_locked(mm, addr);
....@@ -239,6 +240,7 @@
239240 pte_update(mm, addr, ptep, _PAGE_RW, 0, 0);
240241 }
241242
243
+#define __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT
242244 static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
243245 unsigned long addr, pte_t *ptep)
244246 {
....@@ -280,21 +282,8 @@
280282 unsigned long bits = pte_val(entry) &
281283 (_PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_RW | _PAGE_EXEC);
282284
283
-#ifdef PTE_ATOMIC_UPDATES
284
- unsigned long old, tmp;
285
-
286
- __asm__ __volatile__(
287
- "1: ldarx %0,0,%4\n\
288
- or %0,%3,%0\n\
289
- stdcx. %0,0,%4\n\
290
- bne- 1b"
291
- :"=&r" (old), "=&r" (tmp), "=m" (*ptep)
292
- :"r" (bits), "r" (ptep), "m" (*ptep)
293
- :"cc");
294
-#else
295285 unsigned long old = pte_val(*ptep);
296286 *ptep = __pte(old | bits);
297
-#endif
298287
299288 flush_tlb_page(vma, address);
300289 }
....@@ -313,9 +302,7 @@
313302 #define MAX_SWAPFILES_CHECK() do { \
314303 BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > SWP_TYPE_BITS); \
315304 } while (0)
316
-/*
317
- * on pte we don't need handle RADIX_TREE_EXCEPTIONAL_SHIFT;
318
- */
305
+
319306 #define SWP_TYPE_BITS 5
320307 #define __swp_type(x) (((x).val >> _PAGE_BIT_SWAP_TYPE) \
321308 & ((1UL << SWP_TYPE_BITS) - 1))
....@@ -327,8 +314,8 @@
327314 #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val((pte)) })
328315 #define __swp_entry_to_pte(x) __pte((x).val)
329316
330
-extern int map_kernel_page(unsigned long ea, unsigned long pa,
331
- unsigned long flags);
317
+int map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot);
318
+void unmap_kernel_page(unsigned long va);
332319 extern int __meminit vmemmap_create_mapping(unsigned long start,
333320 unsigned long page_size,
334321 unsigned long phys);