| .. | .. |
|---|
| 53 | 53 | |
|---|
| 54 | 54 | struct mm_struct; |
|---|
| 55 | 55 | |
|---|
| 56 | +#define mm_p4d_folded mm_p4d_folded |
|---|
| 57 | +static inline bool mm_p4d_folded(struct mm_struct *mm) |
|---|
| 58 | +{ |
|---|
| 59 | + return !pgtable_l5_enabled(); |
|---|
| 60 | +} |
|---|
| 61 | + |
|---|
| 56 | 62 | void set_pte_vaddr_p4d(p4d_t *p4d_page, unsigned long vaddr, pte_t new_pte); |
|---|
| 57 | 63 | void set_pte_vaddr_pud(pud_t *pud_page, unsigned long vaddr, pte_t new_pte); |
|---|
| 58 | 64 | |
|---|
| .. | .. |
|---|
| 162 | 168 | native_set_pgd(pgd, native_make_pgd(0)); |
|---|
| 163 | 169 | } |
|---|
| 164 | 170 | |
|---|
| 165 | | -extern void sync_global_pgds(unsigned long start, unsigned long end); |
|---|
| 166 | | - |
|---|
| 167 | 171 | /* |
|---|
| 168 | 172 | * Conversion functions: convert a page and protection to a page entry, |
|---|
| 169 | 173 | * and a page entry and page directory to the page they refer to. |
|---|
| 170 | 174 | */ |
|---|
| 171 | 175 | |
|---|
| 172 | | -/* |
|---|
| 173 | | - * Level 4 access. |
|---|
| 174 | | - */ |
|---|
| 175 | | -#define mk_kernel_pgd(address) __pgd((address) | _KERNPG_TABLE) |
|---|
| 176 | +/* PGD - Level 4 access */ |
|---|
| 176 | 177 | |
|---|
| 177 | | -/* PUD - Level3 access */ |
|---|
| 178 | +/* PUD - Level 3 access */ |
|---|
| 178 | 179 | |
|---|
| 179 | | -/* PMD - Level 2 access */ |
|---|
| 180 | +/* PMD - Level 2 access */ |
|---|
| 180 | 181 | |
|---|
| 181 | | -/* PTE - Level 1 access. */ |
|---|
| 182 | | - |
|---|
| 183 | | -/* x86-64 always has all page tables mapped. */ |
|---|
| 184 | | -#define pte_offset_map(dir, address) pte_offset_kernel((dir), (address)) |
|---|
| 185 | | -#define pte_unmap(pte) ((void)(pte))/* NOP */ |
|---|
| 182 | +/* PTE - Level 1 access */ |
|---|
| 186 | 183 | |
|---|
| 187 | 184 | /* |
|---|
| 188 | 185 | * Encode and de-code a swap entry |
|---|
| 189 | 186 | * |
|---|
| 190 | 187 | * | ... | 11| 10| 9|8|7|6|5| 4| 3|2| 1|0| <- bit number |
|---|
| 191 | 188 | * | ... |SW3|SW2|SW1|G|L|D|A|CD|WT|U| W|P| <- bit names |
|---|
| 192 | | - * | TYPE (59-63) | ~OFFSET (9-58) |0|0|X|X| X| X|X|SD|0| <- swp entry |
|---|
| 189 | + * | TYPE (59-63) | ~OFFSET (9-58) |0|0|X|X| X| X|F|SD|0| <- swp entry |
|---|
| 193 | 190 | * |
|---|
| 194 | 191 | * G (8) is aliased and used as a PROT_NONE indicator for |
|---|
| 195 | 192 | * !present ptes. We need to start storing swap entries above |
|---|
| .. | .. |
|---|
| 197 | 194 | * erratum where they can be incorrectly set by hardware on |
|---|
| 198 | 195 | * non-present PTEs. |
|---|
| 199 | 196 | * |
|---|
| 197 | + * SD Bits 1-4 are not used in non-present format and available for |
|---|
| 198 | + * special use described below: |
|---|
| 199 | + * |
|---|
| 200 | 200 | * SD (1) in swp entry is used to store soft dirty bit, which helps us |
|---|
| 201 | 201 | * remember soft dirty over page migration |
|---|
| 202 | + * |
|---|
| 203 | + * F (2) in swp entry is used to record when a pagetable is |
|---|
| 204 | + * writeprotected by userfaultfd WP support. |
|---|
| 202 | 205 | * |
|---|
| 203 | 206 | * Bit 7 in swp entry should be 0 because pmd_present checks not only P, |
|---|
| 204 | 207 | * but also L and G. |
|---|
| .. | .. |
|---|
| 232 | 235 | |
|---|
| 233 | 236 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val((pte)) }) |
|---|
| 234 | 237 | #define __pmd_to_swp_entry(pmd) ((swp_entry_t) { pmd_val((pmd)) }) |
|---|
| 235 | | -#define __swp_entry_to_pte(x) ((pte_t) { .pte = (x).val }) |
|---|
| 236 | | -#define __swp_entry_to_pmd(x) ((pmd_t) { .pmd = (x).val }) |
|---|
| 238 | +#define __swp_entry_to_pte(x) (__pte((x).val)) |
|---|
| 239 | +#define __swp_entry_to_pmd(x) (__pmd((x).val)) |
|---|
| 237 | 240 | |
|---|
| 238 | 241 | extern int kern_addr_valid(unsigned long addr); |
|---|
| 239 | 242 | extern void cleanup_highmap(void); |
|---|
| 240 | 243 | |
|---|
| 241 | 244 | #define HAVE_ARCH_UNMAPPED_AREA |
|---|
| 242 | 245 | #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN |
|---|
| 243 | | - |
|---|
| 244 | | -#define pgtable_cache_init() do { } while (0) |
|---|
| 245 | | -#define check_pgt_cache() do { } while (0) |
|---|
| 246 | 246 | |
|---|
| 247 | 247 | #define PAGE_AGP PAGE_KERNEL_NOCACHE |
|---|
| 248 | 248 | #define HAVE_PAGE_AGP 1 |
|---|
| .. | .. |
|---|
| 259 | 259 | extern void init_extra_mapping_wb(unsigned long phys, unsigned long size); |
|---|
| 260 | 260 | |
|---|
| 261 | 261 | #define gup_fast_permitted gup_fast_permitted |
|---|
| 262 | | -static inline bool gup_fast_permitted(unsigned long start, int nr_pages, |
|---|
| 263 | | - int write) |
|---|
| 262 | +static inline bool gup_fast_permitted(unsigned long start, unsigned long end) |
|---|
| 264 | 263 | { |
|---|
| 265 | | - unsigned long len, end; |
|---|
| 266 | | - |
|---|
| 267 | | - len = (unsigned long)nr_pages << PAGE_SHIFT; |
|---|
| 268 | | - end = start + len; |
|---|
| 269 | | - if (end < start) |
|---|
| 270 | | - return false; |
|---|
| 271 | 264 | if (end >> __VIRTUAL_MASK_SHIFT) |
|---|
| 272 | 265 | return false; |
|---|
| 273 | 266 | return true; |
|---|