1111
1212#include <linux/compiler.h>
1313#include <asm/addrspace.h>
14+ #include <asm/asm.h>
1415#include <asm/page.h>
1516#include <asm/pgtable-bits.h>
1617
2324#endif
2425
2526#if CONFIG_PGTABLE_LEVELS == 2
26- #define PGDIR_SHIFT (PAGE_SHIFT + (PAGE_SHIFT - 3 ))
27+ #define PGDIR_SHIFT (PAGE_SHIFT + (PAGE_SHIFT - PTRLOG ))
2728#elif CONFIG_PGTABLE_LEVELS == 3
28- #define PMD_SHIFT (PAGE_SHIFT + (PAGE_SHIFT - 3 ))
29+ #define PMD_SHIFT (PAGE_SHIFT + (PAGE_SHIFT - PTRLOG ))
2930#define PMD_SIZE (1UL << PMD_SHIFT)
3031#define PMD_MASK (~(PMD_SIZE-1))
31- #define PGDIR_SHIFT (PMD_SHIFT + (PAGE_SHIFT - 3 ))
32+ #define PGDIR_SHIFT (PMD_SHIFT + (PAGE_SHIFT - PTRLOG ))
3233#elif CONFIG_PGTABLE_LEVELS == 4
33- #define PMD_SHIFT (PAGE_SHIFT + (PAGE_SHIFT - 3 ))
34+ #define PMD_SHIFT (PAGE_SHIFT + (PAGE_SHIFT - PTRLOG ))
3435#define PMD_SIZE (1UL << PMD_SHIFT)
3536#define PMD_MASK (~(PMD_SIZE-1))
36- #define PUD_SHIFT (PMD_SHIFT + (PAGE_SHIFT - 3 ))
37+ #define PUD_SHIFT (PMD_SHIFT + (PAGE_SHIFT - PTRLOG ))
3738#define PUD_SIZE (1UL << PUD_SHIFT)
3839#define PUD_MASK (~(PUD_SIZE-1))
39- #define PGDIR_SHIFT (PUD_SHIFT + (PAGE_SHIFT - 3 ))
40+ #define PGDIR_SHIFT (PUD_SHIFT + (PAGE_SHIFT - PTRLOG ))
4041#endif
4142
4243#define PGDIR_SIZE (1UL << PGDIR_SHIFT)
4344#define PGDIR_MASK (~(PGDIR_SIZE-1))
4445
45- #define VA_BITS (PGDIR_SHIFT + (PAGE_SHIFT - 3))
46+ #ifdef CONFIG_32BIT
47+ #define VA_BITS 32
48+ #else
49+ #define VA_BITS (PGDIR_SHIFT + (PAGE_SHIFT - PTRLOG))
50+ #endif
4651
47- #define PTRS_PER_PGD (PAGE_SIZE >> 3 )
52+ #define PTRS_PER_PGD (PAGE_SIZE >> PTRLOG )
4853#if CONFIG_PGTABLE_LEVELS > 3
49- #define PTRS_PER_PUD (PAGE_SIZE >> 3 )
54+ #define PTRS_PER_PUD (PAGE_SIZE >> PTRLOG )
5055#endif
5156#if CONFIG_PGTABLE_LEVELS > 2
52- #define PTRS_PER_PMD (PAGE_SIZE >> 3 )
57+ #define PTRS_PER_PMD (PAGE_SIZE >> PTRLOG )
5358#endif
54- #define PTRS_PER_PTE (PAGE_SIZE >> 3 )
59+ #define PTRS_PER_PTE (PAGE_SIZE >> PTRLOG )
5560
61+ #ifdef CONFIG_32BIT
62+ #define USER_PTRS_PER_PGD (TASK_SIZE / PGDIR_SIZE)
63+ #else
5664#define USER_PTRS_PER_PGD ((TASK_SIZE64 / PGDIR_SIZE)?(TASK_SIZE64 / PGDIR_SIZE):1)
65+ #endif
5766
5867#ifndef __ASSEMBLER__
5968
@@ -74,11 +83,15 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];
7483
7584#define ZERO_PAGE (vaddr ) virt_to_page(empty_zero_page)
7685
77- /*
78- * TLB refill handlers may also map the vmalloc area into xkvrange.
79- * Avoid the first couple of pages so NULL pointer dereferences will
80- * still reliably trap.
81- */
86+ #ifdef CONFIG_32BIT
87+
88+ #define VMALLOC_START (vm_map_base + PCI_IOSIZE + (2 * PAGE_SIZE))
89+ #define VMALLOC_END (FIXADDR_START - (2 * PAGE_SIZE))
90+
91+ #endif
92+
93+ #ifdef CONFIG_64BIT
94+
8295#define MODULES_VADDR (vm_map_base + PCI_IOSIZE + (2 * PAGE_SIZE))
8396#define MODULES_END (MODULES_VADDR + SZ_256M)
8497
@@ -106,6 +119,8 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];
106119#define KFENCE_AREA_START (VMEMMAP_END + 1)
107120#define KFENCE_AREA_END (KFENCE_AREA_START + KFENCE_AREA_SIZE - 1)
108121
122+ #endif
123+
109124#define ptep_get (ptep ) READ_ONCE(*(ptep))
110125#define pmdp_get (pmdp ) READ_ONCE(*(pmdp))
111126
@@ -277,7 +292,16 @@ extern void kernel_pte_init(void *addr);
277292 * Encode/decode swap entries and swap PTEs. Swap PTEs are all PTEs that
278293 * are !pte_none() && !pte_present().
279294 *
280- * Format of swap PTEs:
295+ * Format of 32bit swap PTEs:
296+ *
297+ * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
298+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
299+ * <------------ offset -------------> E <- type -> <-- zeroes -->
300+ *
301+ * E is the exclusive marker that is not stored in swap entries.
302+ * The zero'ed bits include _PAGE_PRESENT.
303+ *
304+ * Format of 64bit swap PTEs:
281305 *
282306 * 6 6 6 6 5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3
283307 * 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2
@@ -290,16 +314,27 @@ extern void kernel_pte_init(void *addr);
290314 * E is the exclusive marker that is not stored in swap entries.
291315 * The zero'ed bits include _PAGE_PRESENT and _PAGE_PROTNONE.
292316 */
317+
318+ #define __SWP_TYPE_BITS (IS_ENABLED(CONFIG_32BIT) ? 5 : 7)
319+ #define __SWP_TYPE_MASK ((1UL << __SWP_TYPE_BITS) - 1)
320+ #define __SWP_TYPE_SHIFT (IS_ENABLED(CONFIG_32BIT) ? 8 : 16)
321+ #define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT + 1)
322+
293323static inline pte_t mk_swap_pte (unsigned long type , unsigned long offset )
294- { pte_t pte ; pte_val (pte ) = ((type & 0x7f ) << 16 ) | (offset << 24 ); return pte ; }
324+ {
325+ pte_t pte ;
326+ pte_val (pte ) = ((type & __SWP_TYPE_MASK ) << __SWP_TYPE_SHIFT ) | (offset << __SWP_OFFSET_SHIFT );
327+ return pte ;
328+ }
295329
296- #define __swp_type (x ) (((x).val >> 16 ) & 0x7f )
297- #define __swp_offset (x ) ((x).val >> 24 )
330+ #define __swp_type (x ) (((x).val >> __SWP_TYPE_SHIFT ) & __SWP_TYPE_MASK )
331+ #define __swp_offset (x ) ((x).val >> __SWP_OFFSET_SHIFT )
298332#define __swp_entry (type , offset ) ((swp_entry_t) { pte_val(mk_swap_pte((type), (offset))) })
299- #define __pte_to_swp_entry ( pte ) ((swp_entry_t) { pte_val(pte) })
333+
300334#define __swp_entry_to_pte (x ) __pte((x).val)
301- #define __pmd_to_swp_entry (pmd ) ((swp_entry_t) { pmd_val(pmd) })
302335#define __swp_entry_to_pmd (x ) __pmd((x).val | _PAGE_HUGE)
336+ #define __pte_to_swp_entry (pte ) ((swp_entry_t) { pte_val(pte) })
337+ #define __pmd_to_swp_entry (pmd ) ((swp_entry_t) { pmd_val(pmd) })
303338
304339static inline bool pte_swp_exclusive (pte_t pte )
305340{
0 commit comments