aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy@goop.org>2008-01-30 07:32:56 -0500
committerIngo Molnar <mingo@elte.hu>2008-01-30 07:32:56 -0500
commit4614139c6a74fe02c85f702ba9c0e57f8e38647e (patch)
treec5d2145a98ecdd5d275ee278c2fbc3d3c8bee8e1
parente8a4852453c5af27d2a9c606e76809afa3dedb64 (diff)
x86/pgtable: unify pagetable accessors, #6
Unify functions to test and set bits in pagetable entries. NOP: only moves existing code around, without any change to it. Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r--include/asm-x86/pgtable.h28
-rw-r--r--include/asm-x86/pgtable_32.h28
-rw-r--r--include/asm-x86/pgtable_64.h32
3 files changed, 28 insertions, 60 deletions
diff --git a/include/asm-x86/pgtable.h b/include/asm-x86/pgtable.h
index 73e2b47c055e..4c03ff2246fd 100644
--- a/include/asm-x86/pgtable.h
+++ b/include/asm-x86/pgtable.h
@@ -115,6 +115,34 @@ extern unsigned long long __PAGE_KERNEL, __PAGE_KERNEL_EXEC;
115#define __S110 PAGE_SHARED_EXEC 115#define __S110 PAGE_SHARED_EXEC
116#define __S111 PAGE_SHARED_EXEC 116#define __S111 PAGE_SHARED_EXEC
117 117
118#ifndef __ASSEMBLY__
119/*
120 * The following only work if pte_present() is true.
121 * Undefined behaviour if not..
122 */
123static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; }
124static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; }
125static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW; }
126static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE; }
127static inline int pte_huge(pte_t pte) { return pte_val(pte) & _PAGE_PSE; }
128
129static inline int pmd_large(pmd_t pte) {
130 return (pmd_val(pte) & (_PAGE_PSE|_PAGE_PRESENT)) ==
131 (_PAGE_PSE|_PAGE_PRESENT);
132}
133
134static inline pte_t pte_mkclean(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_DIRTY); }
135static inline pte_t pte_mkold(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_ACCESSED); }
136static inline pte_t pte_wrprotect(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_RW); }
137static inline pte_t pte_mkexec(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_NX); }
138static inline pte_t pte_mkdirty(pte_t pte) { return __pte(pte_val(pte) | _PAGE_DIRTY); }
139static inline pte_t pte_mkyoung(pte_t pte) { return __pte(pte_val(pte) | _PAGE_ACCESSED); }
140static inline pte_t pte_mkwrite(pte_t pte) { return __pte(pte_val(pte) | _PAGE_RW); }
141static inline pte_t pte_mkhuge(pte_t pte) { return __pte(pte_val(pte) | _PAGE_PSE); }
142static inline pte_t pte_clrhuge(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_PSE); }
143
144#endif /* __ASSEMBLY__ */
145
118#ifdef CONFIG_X86_32 146#ifdef CONFIG_X86_32
119# include "pgtable_32.h" 147# include "pgtable_32.h"
120#else 148#else
diff --git a/include/asm-x86/pgtable_32.h b/include/asm-x86/pgtable_32.h
index 1c43c302609c..0aaefdda5158 100644
--- a/include/asm-x86/pgtable_32.h
+++ b/include/asm-x86/pgtable_32.h
@@ -101,31 +101,6 @@ extern unsigned long pg0[];
101 101
102#define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT)) 102#define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT))
103 103
104/*
105 * The following only work if pte_present() is true.
106 * Undefined behaviour if not..
107 */
108static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; }
109static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; }
110static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW; }
111static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE; }
112static inline int pte_huge(pte_t pte) { return pte_val(pte) & _PAGE_PSE; }
113
114static inline int pmd_large(pmd_t pte) {
115 return (pmd_val(pte) & (_PAGE_PSE|_PAGE_PRESENT)) ==
116 (_PAGE_PSE|_PAGE_PRESENT);
117}
118
119static inline pte_t pte_mkclean(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_DIRTY); }
120static inline pte_t pte_mkold(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_ACCESSED); }
121static inline pte_t pte_wrprotect(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_RW); }
122static inline pte_t pte_mkexec(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_NX); }
123static inline pte_t pte_mkdirty(pte_t pte) { return __pte(pte_val(pte) | _PAGE_DIRTY); }
124static inline pte_t pte_mkyoung(pte_t pte) { return __pte(pte_val(pte) | _PAGE_ACCESSED); }
125static inline pte_t pte_mkwrite(pte_t pte) { return __pte(pte_val(pte) | _PAGE_RW); }
126static inline pte_t pte_mkhuge(pte_t pte) { return __pte(pte_val(pte) | _PAGE_PSE); }
127static inline pte_t pte_clrhuge(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_PSE); }
128
129#ifdef CONFIG_X86_PAE 104#ifdef CONFIG_X86_PAE
130# include <asm/pgtable-3level.h> 105# include <asm/pgtable-3level.h>
131#else 106#else
@@ -276,9 +251,6 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
276 return pte; 251 return pte;
277} 252}
278 253
279#define pmd_large(pmd) \
280((pmd_val(pmd) & (_PAGE_PSE|_PAGE_PRESENT)) == (_PAGE_PSE|_PAGE_PRESENT))
281
282/* 254/*
283 * the pgd page can be thought of an array like this: pgd_t[PTRS_PER_PGD] 255 * the pgd page can be thought of an array like this: pgd_t[PTRS_PER_PGD]
284 * 256 *
diff --git a/include/asm-x86/pgtable_64.h b/include/asm-x86/pgtable_64.h
index 3a0588088480..84f47f9d7896 100644
--- a/include/asm-x86/pgtable_64.h
+++ b/include/asm-x86/pgtable_64.h
@@ -173,34 +173,6 @@ static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot)
173 pte_val(pte) &= __supported_pte_mask; 173 pte_val(pte) &= __supported_pte_mask;
174 return pte; 174 return pte;
175} 175}
176
177/*
178 * The following only work if pte_present() is true.
179 * Undefined behaviour if not..
180 */
181#define __LARGE_PTE (_PAGE_PSE|_PAGE_PRESENT)
182
183static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; }
184static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; }
185static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW; }
186static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE; }
187static inline int pte_huge(pte_t pte) { return pte_val(pte) & _PAGE_PSE; }
188
189static inline int pmd_large(pmd_t pte) {
190 return (pmd_val(pte) & (_PAGE_PSE|_PAGE_PRESENT)) ==
191 (_PAGE_PSE|_PAGE_PRESENT);
192}
193
194static inline pte_t pte_mkclean(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_DIRTY); }
195static inline pte_t pte_mkold(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_ACCESSED); }
196static inline pte_t pte_wrprotect(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_RW); }
197static inline pte_t pte_mkexec(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_NX); }
198static inline pte_t pte_mkdirty(pte_t pte) { return __pte(pte_val(pte) | _PAGE_DIRTY); }
199static inline pte_t pte_mkyoung(pte_t pte) { return __pte(pte_val(pte) | _PAGE_ACCESSED); }
200static inline pte_t pte_mkwrite(pte_t pte) { return __pte(pte_val(pte) | _PAGE_RW); }
201static inline pte_t pte_mkhuge(pte_t pte) { return __pte(pte_val(pte) | _PAGE_PSE); }
202static inline pte_t pte_clrhuge(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_PSE); }
203
204struct vm_area_struct; 176struct vm_area_struct;
205 177
206static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) 178static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
@@ -220,10 +192,6 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
220 */ 192 */
221#define pgprot_noncached(prot) (__pgprot(pgprot_val(prot) | _PAGE_PCD | _PAGE_PWT)) 193#define pgprot_noncached(prot) (__pgprot(pgprot_val(prot) | _PAGE_PCD | _PAGE_PWT))
222 194
223static inline int pmd_large(pmd_t pte) {
224 return (pmd_val(pte) & __LARGE_PTE) == __LARGE_PTE;
225}
226
227 195
228/* 196/*
229 * Conversion functions: convert a page and protection to a page entry, 197 * Conversion functions: convert a page and protection to a page entry,