diff options
Diffstat (limited to 'include/asm-x86_64/pgtable.h')
-rw-r--r-- | include/asm-x86_64/pgtable.h | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/include/asm-x86_64/pgtable.h b/include/asm-x86_64/pgtable.h index 4e167b5ea8f3..5e0f2fdab0d3 100644 --- a/include/asm-x86_64/pgtable.h +++ b/include/asm-x86_64/pgtable.h | |||
@@ -104,6 +104,19 @@ extern inline void pgd_clear (pgd_t * pgd) | |||
104 | ((unsigned long) __va(pud_val(pud) & PHYSICAL_PAGE_MASK)) | 104 | ((unsigned long) __va(pud_val(pud) & PHYSICAL_PAGE_MASK)) |
105 | 105 | ||
106 | #define ptep_get_and_clear(mm,addr,xp) __pte(xchg(&(xp)->pte, 0)) | 106 | #define ptep_get_and_clear(mm,addr,xp) __pte(xchg(&(xp)->pte, 0)) |
107 | |||
108 | static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long addr, pte_t *ptep, int full) | ||
109 | { | ||
110 | pte_t pte; | ||
111 | if (full) { | ||
112 | pte = *ptep; | ||
113 | *ptep = __pte(0); | ||
114 | } else { | ||
115 | pte = ptep_get_and_clear(mm, addr, ptep); | ||
116 | } | ||
117 | return pte; | ||
118 | } | ||
119 | |||
107 | #define pte_same(a, b) ((a).pte == (b).pte) | 120 | #define pte_same(a, b) ((a).pte == (b).pte) |
108 | 121 | ||
109 | #define PMD_SIZE (1UL << PMD_SHIFT) | 122 | #define PMD_SIZE (1UL << PMD_SHIFT) |
@@ -143,7 +156,7 @@ extern inline void pgd_clear (pgd_t * pgd) | |||
143 | #define _PAGE_ACCESSED 0x020 | 156 | #define _PAGE_ACCESSED 0x020 |
144 | #define _PAGE_DIRTY 0x040 | 157 | #define _PAGE_DIRTY 0x040 |
145 | #define _PAGE_PSE 0x080 /* 2MB page */ | 158 | #define _PAGE_PSE 0x080 /* 2MB page */ |
146 | #define _PAGE_FILE 0x040 /* set:pagecache, unset:swap */ | 159 | #define _PAGE_FILE 0x040 /* nonlinear file mapping, saved PTE; unset:swap */ |
147 | #define _PAGE_GLOBAL 0x100 /* Global TLB entry */ | 160 | #define _PAGE_GLOBAL 0x100 /* Global TLB entry */ |
148 | 161 | ||
149 | #define _PAGE_PROTNONE 0x080 /* If not present */ | 162 | #define _PAGE_PROTNONE 0x080 /* If not present */ |
@@ -247,6 +260,7 @@ static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot) | |||
247 | * The following only work if pte_present() is true. | 260 | * The following only work if pte_present() is true. |
248 | * Undefined behaviour if not.. | 261 | * Undefined behaviour if not.. |
249 | */ | 262 | */ |
263 | #define __LARGE_PTE (_PAGE_PSE|_PAGE_PRESENT) | ||
250 | static inline int pte_user(pte_t pte) { return pte_val(pte) & _PAGE_USER; } | 264 | static inline int pte_user(pte_t pte) { return pte_val(pte) & _PAGE_USER; } |
251 | extern inline int pte_read(pte_t pte) { return pte_val(pte) & _PAGE_USER; } | 265 | extern inline int pte_read(pte_t pte) { return pte_val(pte) & _PAGE_USER; } |
252 | extern inline int pte_exec(pte_t pte) { return pte_val(pte) & _PAGE_USER; } | 266 | extern inline int pte_exec(pte_t pte) { return pte_val(pte) & _PAGE_USER; } |
@@ -254,8 +268,8 @@ extern inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; } | |||
254 | extern inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; } | 268 | extern inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; } |
255 | extern inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW; } | 269 | extern inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW; } |
256 | static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE; } | 270 | static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE; } |
271 | static inline int pte_huge(pte_t pte) { return (pte_val(pte) & __LARGE_PTE) == __LARGE_PTE; } | ||
257 | 272 | ||
258 | #define __LARGE_PTE (_PAGE_PSE|_PAGE_PRESENT) | ||
259 | extern inline pte_t pte_rdprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_USER)); return pte; } | 273 | extern inline pte_t pte_rdprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_USER)); return pte; } |
260 | extern inline pte_t pte_exprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_USER)); return pte; } | 274 | extern inline pte_t pte_exprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_USER)); return pte; } |
261 | extern inline pte_t pte_mkclean(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_DIRTY)); return pte; } | 275 | extern inline pte_t pte_mkclean(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_DIRTY)); return pte; } |
@@ -433,6 +447,7 @@ extern int kern_addr_valid(unsigned long addr); | |||
433 | #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG | 447 | #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG |
434 | #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY | 448 | #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY |
435 | #define __HAVE_ARCH_PTEP_GET_AND_CLEAR | 449 | #define __HAVE_ARCH_PTEP_GET_AND_CLEAR |
450 | #define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL | ||
436 | #define __HAVE_ARCH_PTEP_SET_WRPROTECT | 451 | #define __HAVE_ARCH_PTEP_SET_WRPROTECT |
437 | #define __HAVE_ARCH_PTE_SAME | 452 | #define __HAVE_ARCH_PTE_SAME |
438 | #include <asm-generic/pgtable.h> | 453 | #include <asm-generic/pgtable.h> |