aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-x86
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy@goop.org>2008-05-26 18:31:06 -0400
committerThomas Gleixner <tglx@linutronix.de>2008-05-27 04:11:36 -0400
commita15af1c9ea2750a9ff01e51615c45950bad8221b (patch)
treeb4167c16c23365d016180b20248c724902e0c954 /include/asm-x86
parent239d1fc04ed0b58d638096b12a7f6d50269d30c9 (diff)
x86/paravirt: add pte_flags to just get pte flags
Add pte_flags() to extract the flags from a pte. This is a special case of pte_val() which is only guaranteed to return the pte's flags correctly; the page number may be corrupted or missing. The intent is to allow paravirt implementations to return pte flags without having to do any translation of the page number (most notably, Xen). Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'include/asm-x86')
-rw-r--r--include/asm-x86/page.h1
-rw-r--r--include/asm-x86/paravirt.h15
-rw-r--r--include/asm-x86/pgtable.h16
3 files changed, 24 insertions, 8 deletions
diff --git a/include/asm-x86/page.h b/include/asm-x86/page.h
index dc936dddf161..a1e2b9470f25 100644
--- a/include/asm-x86/page.h
+++ b/include/asm-x86/page.h
@@ -160,6 +160,7 @@ static inline pteval_t native_pte_val(pte_t pte)
160#endif 160#endif
161 161
162#define pte_val(x) native_pte_val(x) 162#define pte_val(x) native_pte_val(x)
163#define pte_flags(x) native_pte_val(x)
163#define __pte(x) native_make_pte(x) 164#define __pte(x) native_make_pte(x)
164 165
165#endif /* CONFIG_PARAVIRT */ 166#endif /* CONFIG_PARAVIRT */
diff --git a/include/asm-x86/paravirt.h b/include/asm-x86/paravirt.h
index 0f13b945e240..5ea37a48eecb 100644
--- a/include/asm-x86/paravirt.h
+++ b/include/asm-x86/paravirt.h
@@ -239,6 +239,7 @@ struct pv_mmu_ops {
239 unsigned long addr, pte_t *ptep); 239 unsigned long addr, pte_t *ptep);
240 240
241 pteval_t (*pte_val)(pte_t); 241 pteval_t (*pte_val)(pte_t);
242 pteval_t (*pte_flags)(pte_t);
242 pte_t (*make_pte)(pteval_t pte); 243 pte_t (*make_pte)(pteval_t pte);
243 244
244 pgdval_t (*pgd_val)(pgd_t); 245 pgdval_t (*pgd_val)(pgd_t);
@@ -996,6 +997,20 @@ static inline pteval_t pte_val(pte_t pte)
996 return ret; 997 return ret;
997} 998}
998 999
1000static inline pteval_t pte_flags(pte_t pte)
1001{
1002 pteval_t ret;
1003
1004 if (sizeof(pteval_t) > sizeof(long))
1005 ret = PVOP_CALL2(pteval_t, pv_mmu_ops.pte_flags,
1006 pte.pte, (u64)pte.pte >> 32);
1007 else
1008 ret = PVOP_CALL1(pteval_t, pv_mmu_ops.pte_flags,
1009 pte.pte);
1010
1011 return ret;
1012}
1013
999static inline pgd_t __pgd(pgdval_t val) 1014static inline pgd_t __pgd(pgdval_t val)
1000{ 1015{
1001 pgdval_t ret; 1016 pgdval_t ret;
diff --git a/include/asm-x86/pgtable.h b/include/asm-x86/pgtable.h
index 97c271b2910b..47a852cb8c92 100644
--- a/include/asm-x86/pgtable.h
+++ b/include/asm-x86/pgtable.h
@@ -164,37 +164,37 @@ extern struct list_head pgd_list;
164 */ 164 */
165static inline int pte_dirty(pte_t pte) 165static inline int pte_dirty(pte_t pte)
166{ 166{
167 return pte_val(pte) & _PAGE_DIRTY; 167 return pte_flags(pte) & _PAGE_DIRTY;
168} 168}
169 169
170static inline int pte_young(pte_t pte) 170static inline int pte_young(pte_t pte)
171{ 171{
172 return pte_val(pte) & _PAGE_ACCESSED; 172 return pte_flags(pte) & _PAGE_ACCESSED;
173} 173}
174 174
175static inline int pte_write(pte_t pte) 175static inline int pte_write(pte_t pte)
176{ 176{
177 return pte_val(pte) & _PAGE_RW; 177 return pte_flags(pte) & _PAGE_RW;
178} 178}
179 179
180static inline int pte_file(pte_t pte) 180static inline int pte_file(pte_t pte)
181{ 181{
182 return pte_val(pte) & _PAGE_FILE; 182 return pte_flags(pte) & _PAGE_FILE;
183} 183}
184 184
185static inline int pte_huge(pte_t pte) 185static inline int pte_huge(pte_t pte)
186{ 186{
187 return pte_val(pte) & _PAGE_PSE; 187 return pte_flags(pte) & _PAGE_PSE;
188} 188}
189 189
190static inline int pte_global(pte_t pte) 190static inline int pte_global(pte_t pte)
191{ 191{
192 return pte_val(pte) & _PAGE_GLOBAL; 192 return pte_flags(pte) & _PAGE_GLOBAL;
193} 193}
194 194
195static inline int pte_exec(pte_t pte) 195static inline int pte_exec(pte_t pte)
196{ 196{
197 return !(pte_val(pte) & _PAGE_NX); 197 return !(pte_flags(pte) & _PAGE_NX);
198} 198}
199 199
200static inline int pte_special(pte_t pte) 200static inline int pte_special(pte_t pte)
@@ -305,7 +305,7 @@ static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot)
305 return __pgprot(preservebits | addbits); 305 return __pgprot(preservebits | addbits);
306} 306}
307 307
308#define pte_pgprot(x) __pgprot(pte_val(x) & ~PTE_MASK) 308#define pte_pgprot(x) __pgprot(pte_flags(x) & ~PTE_MASK)
309 309
310#define canon_pgprot(p) __pgprot(pgprot_val(p) & __supported_pte_mask) 310#define canon_pgprot(p) __pgprot(pgprot_val(p) & __supported_pte_mask)
311 311