diff options
Diffstat (limited to 'include/asm-x86/pgtable-3level.h')
-rw-r--r-- | include/asm-x86/pgtable-3level.h | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/include/asm-x86/pgtable-3level.h b/include/asm-x86/pgtable-3level.h index 62a1ffbc8784..ed4c6f0e57ec 100644 --- a/include/asm-x86/pgtable-3level.h +++ b/include/asm-x86/pgtable-3level.h | |||
@@ -15,9 +15,19 @@ | |||
15 | #define pgd_ERROR(e) \ | 15 | #define pgd_ERROR(e) \ |
16 | printk("%s:%d: bad pgd %p(%016Lx).\n", __FILE__, __LINE__, &(e), pgd_val(e)) | 16 | printk("%s:%d: bad pgd %p(%016Lx).\n", __FILE__, __LINE__, &(e), pgd_val(e)) |
17 | 17 | ||
18 | #define pud_none(pud) 0 | 18 | |
19 | #define pud_bad(pud) 0 | 19 | static inline int pud_none(pud_t pud) |
20 | #define pud_present(pud) 1 | 20 | { |
21 | return pud_val(pud) == 0; | ||
22 | } | ||
23 | static inline int pud_bad(pud_t pud) | ||
24 | { | ||
25 | return (pud_val(pud) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER)) != 0; | ||
26 | } | ||
27 | static inline int pud_present(pud_t pud) | ||
28 | { | ||
29 | return pud_val(pud) & _PAGE_PRESENT; | ||
30 | } | ||
21 | 31 | ||
22 | /* Rules for using set_pte: the pte being assigned *must* be | 32 | /* Rules for using set_pte: the pte being assigned *must* be |
23 | * either not present or in a state where the hardware will | 33 | * either not present or in a state where the hardware will |
@@ -58,7 +68,7 @@ static inline void native_set_pmd(pmd_t *pmdp, pmd_t pmd) | |||
58 | } | 68 | } |
59 | static inline void native_set_pud(pud_t *pudp, pud_t pud) | 69 | static inline void native_set_pud(pud_t *pudp, pud_t pud) |
60 | { | 70 | { |
61 | *pudp = pud; | 71 | set_64bit((unsigned long long *)(pudp),native_pud_val(pud)); |
62 | } | 72 | } |
63 | 73 | ||
64 | /* | 74 | /* |
@@ -81,13 +91,20 @@ static inline void native_pmd_clear(pmd_t *pmd) | |||
81 | *(tmp + 1) = 0; | 91 | *(tmp + 1) = 0; |
82 | } | 92 | } |
83 | 93 | ||
84 | /* | 94 | static inline void pud_clear(pud_t *pudp) |
85 | * Pentium-II erratum A13: in PAE mode we explicitly have to flush | 95 | { |
86 | * the TLB via cr3 if the top-level pgd is changed... | 96 | set_pud(pudp, __pud(0)); |
87 | * We do not let the generic code free and clear pgd entries due to | 97 | |
88 | * this erratum. | 98 | /* |
89 | */ | 99 | * Pentium-II erratum A13: in PAE mode we explicitly have to flush |
90 | static inline void pud_clear (pud_t * pud) { } | 100 | * the TLB via cr3 if the top-level pgd is changed... |
101 | * | ||
102 | * XXX I don't think we need to worry about this here, since | ||
103 | * when clearing the pud, the calling code needs to flush the | ||
104 | * tlb anyway. But do it now for safety's sake. - jsgf | ||
105 | */ | ||
106 | write_cr3(read_cr3()); | ||
107 | } | ||
91 | 108 | ||
92 | #define pud_page(pud) \ | 109 | #define pud_page(pud) \ |
93 | ((struct page *) __va(pud_val(pud) & PAGE_MASK)) | 110 | ((struct page *) __va(pud_val(pud) & PAGE_MASK)) |