diff options
Diffstat (limited to 'include/asm-x86/pgtable.h')
-rw-r--r-- | include/asm-x86/pgtable.h | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/include/asm-x86/pgtable.h b/include/asm-x86/pgtable.h index 49cbd76b9547..04caa2f544df 100644 --- a/include/asm-x86/pgtable.h +++ b/include/asm-x86/pgtable.h | |||
@@ -18,6 +18,7 @@ | |||
18 | #define _PAGE_BIT_UNUSED2 10 | 18 | #define _PAGE_BIT_UNUSED2 10 |
19 | #define _PAGE_BIT_UNUSED3 11 | 19 | #define _PAGE_BIT_UNUSED3 11 |
20 | #define _PAGE_BIT_PAT_LARGE 12 /* On 2MB or 1GB pages */ | 20 | #define _PAGE_BIT_PAT_LARGE 12 /* On 2MB or 1GB pages */ |
21 | #define _PAGE_BIT_SPECIAL _PAGE_BIT_UNUSED1 | ||
21 | #define _PAGE_BIT_NX 63 /* No execute: only valid after cpuid check */ | 22 | #define _PAGE_BIT_NX 63 /* No execute: only valid after cpuid check */ |
22 | 23 | ||
23 | #define _PAGE_PRESENT (_AT(pteval_t, 1) << _PAGE_BIT_PRESENT) | 24 | #define _PAGE_PRESENT (_AT(pteval_t, 1) << _PAGE_BIT_PRESENT) |
@@ -34,6 +35,8 @@ | |||
34 | #define _PAGE_UNUSED3 (_AT(pteval_t, 1) << _PAGE_BIT_UNUSED3) | 35 | #define _PAGE_UNUSED3 (_AT(pteval_t, 1) << _PAGE_BIT_UNUSED3) |
35 | #define _PAGE_PAT (_AT(pteval_t, 1) << _PAGE_BIT_PAT) | 36 | #define _PAGE_PAT (_AT(pteval_t, 1) << _PAGE_BIT_PAT) |
36 | #define _PAGE_PAT_LARGE (_AT(pteval_t, 1) << _PAGE_BIT_PAT_LARGE) | 37 | #define _PAGE_PAT_LARGE (_AT(pteval_t, 1) << _PAGE_BIT_PAT_LARGE) |
38 | #define _PAGE_SPECIAL (_AT(pteval_t, 1) << _PAGE_BIT_SPECIAL) | ||
39 | #define __HAVE_ARCH_PTE_SPECIAL | ||
37 | 40 | ||
38 | #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) | 41 | #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) |
39 | #define _PAGE_NX (_AT(pteval_t, 1) << _PAGE_BIT_NX) | 42 | #define _PAGE_NX (_AT(pteval_t, 1) << _PAGE_BIT_NX) |
@@ -53,8 +56,8 @@ | |||
53 | _PAGE_DIRTY) | 56 | _PAGE_DIRTY) |
54 | 57 | ||
55 | /* Set of bits not changed in pte_modify */ | 58 | /* Set of bits not changed in pte_modify */ |
56 | #define _PAGE_CHG_MASK (PTE_MASK | _PAGE_PCD | _PAGE_PWT | \ | 59 | #define _PAGE_CHG_MASK (PTE_PFN_MASK | _PAGE_PCD | _PAGE_PWT | \ |
57 | _PAGE_ACCESSED | _PAGE_DIRTY) | 60 | _PAGE_SPECIAL | _PAGE_ACCESSED | _PAGE_DIRTY) |
58 | 61 | ||
59 | #define _PAGE_CACHE_MASK (_PAGE_PCD | _PAGE_PWT) | 62 | #define _PAGE_CACHE_MASK (_PAGE_PCD | _PAGE_PWT) |
60 | #define _PAGE_CACHE_WB (0) | 63 | #define _PAGE_CACHE_WB (0) |
@@ -180,7 +183,7 @@ static inline int pte_exec(pte_t pte) | |||
180 | 183 | ||
181 | static inline int pte_special(pte_t pte) | 184 | static inline int pte_special(pte_t pte) |
182 | { | 185 | { |
183 | return 0; | 186 | return pte_val(pte) & _PAGE_SPECIAL; |
184 | } | 187 | } |
185 | 188 | ||
186 | static inline int pmd_large(pmd_t pte) | 189 | static inline int pmd_large(pmd_t pte) |
@@ -246,7 +249,7 @@ static inline pte_t pte_clrglobal(pte_t pte) | |||
246 | 249 | ||
247 | static inline pte_t pte_mkspecial(pte_t pte) | 250 | static inline pte_t pte_mkspecial(pte_t pte) |
248 | { | 251 | { |
249 | return pte; | 252 | return __pte(pte_val(pte) | _PAGE_SPECIAL); |
250 | } | 253 | } |
251 | 254 | ||
252 | extern pteval_t __supported_pte_mask; | 255 | extern pteval_t __supported_pte_mask; |
@@ -286,7 +289,7 @@ static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot) | |||
286 | return __pgprot(preservebits | addbits); | 289 | return __pgprot(preservebits | addbits); |
287 | } | 290 | } |
288 | 291 | ||
289 | #define pte_pgprot(x) __pgprot(pte_flags(x) & ~PTE_MASK) | 292 | #define pte_pgprot(x) __pgprot(pte_flags(x) & PTE_FLAGS_MASK) |
290 | 293 | ||
291 | #define canon_pgprot(p) __pgprot(pgprot_val(p) & __supported_pte_mask) | 294 | #define canon_pgprot(p) __pgprot(pgprot_val(p) & __supported_pte_mask) |
292 | 295 | ||
@@ -302,6 +305,14 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn, | |||
302 | /* Install a pte for a particular vaddr in kernel space. */ | 305 | /* Install a pte for a particular vaddr in kernel space. */ |
303 | void set_pte_vaddr(unsigned long vaddr, pte_t pte); | 306 | void set_pte_vaddr(unsigned long vaddr, pte_t pte); |
304 | 307 | ||
308 | #ifdef CONFIG_X86_32 | ||
309 | extern void native_pagetable_setup_start(pgd_t *base); | ||
310 | extern void native_pagetable_setup_done(pgd_t *base); | ||
311 | #else | ||
312 | static inline void native_pagetable_setup_start(pgd_t *base) {} | ||
313 | static inline void native_pagetable_setup_done(pgd_t *base) {} | ||
314 | #endif | ||
315 | |||
305 | #ifdef CONFIG_PARAVIRT | 316 | #ifdef CONFIG_PARAVIRT |
306 | #include <asm/paravirt.h> | 317 | #include <asm/paravirt.h> |
307 | #else /* !CONFIG_PARAVIRT */ | 318 | #else /* !CONFIG_PARAVIRT */ |
@@ -333,6 +344,16 @@ void set_pte_vaddr(unsigned long vaddr, pte_t pte); | |||
333 | 344 | ||
334 | #define pte_update(mm, addr, ptep) do { } while (0) | 345 | #define pte_update(mm, addr, ptep) do { } while (0) |
335 | #define pte_update_defer(mm, addr, ptep) do { } while (0) | 346 | #define pte_update_defer(mm, addr, ptep) do { } while (0) |
347 | |||
348 | static inline void __init paravirt_pagetable_setup_start(pgd_t *base) | ||
349 | { | ||
350 | native_pagetable_setup_start(base); | ||
351 | } | ||
352 | |||
353 | static inline void __init paravirt_pagetable_setup_done(pgd_t *base) | ||
354 | { | ||
355 | native_pagetable_setup_done(base); | ||
356 | } | ||
336 | #endif /* CONFIG_PARAVIRT */ | 357 | #endif /* CONFIG_PARAVIRT */ |
337 | 358 | ||
338 | #endif /* __ASSEMBLY__ */ | 359 | #endif /* __ASSEMBLY__ */ |