ia64/xen-unstable

view linux-2.6.11-xen-sparse/include/asm-generic/pgtable.h @ 4166:aeccd691af4c

bitkeeper revision 1.1236.34.7 (423735acABhfn7rysHwGJkcVOLD6GA)

XCS cleanups.
Signed-off-by: Keir Fraser <keir@xensource.com>
author kaf24@firebug.cl.cam.ac.uk
date Tue Mar 15 19:21:16 2005 +0000 (2005-03-15)
parents db5a30a327e6
children f234096eb41e
line source
1 #ifndef _ASM_GENERIC_PGTABLE_H
2 #define _ASM_GENERIC_PGTABLE_H
4 #ifndef __HAVE_ARCH_PTEP_ESTABLISH
5 /*
6 * Establish a new mapping:
7 * - flush the old one
8 * - update the page tables
9 * - inform the TLB about the new one
10 *
11 * We hold the mm semaphore for reading and vma->vm_mm->page_table_lock.
12 *
13 * Note: the old pte is known to not be writable, so we don't need to
14 * worry about dirty bits etc getting lost.
15 */
16 #ifndef __HAVE_ARCH_SET_PTE_ATOMIC
17 #define ptep_establish(__vma, __address, __ptep, __entry) \
18 do { \
19 set_pte(__ptep, __entry); \
20 flush_tlb_page(__vma, __address); \
21 } while (0)
22 #else /* __HAVE_ARCH_SET_PTE_ATOMIC */
23 #define ptep_establish(__vma, __address, __ptep, __entry) \
24 do { \
25 set_pte_atomic(__ptep, __entry); \
26 flush_tlb_page(__vma, __address); \
27 } while (0)
28 #endif /* __HAVE_ARCH_SET_PTE_ATOMIC */
29 #endif
31 #ifndef __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
32 /*
33 * Largely same as above, but only sets the access flags (dirty,
34 * accessed, and writable). Furthermore, we know it always gets set
35 * to a "more permissive" setting, which allows most architectures
36 * to optimize this.
37 */
38 #define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \
39 do { \
40 set_pte(__ptep, __entry); \
41 flush_tlb_page(__vma, __address); \
42 } while (0)
43 #endif
45 #ifndef __HAVE_ARCH_PTEP_ESTABLISH_NEW
46 /*
47 * Establish a mapping where none previously existed
48 */
49 #define ptep_establish_new(__vma, __address, __ptep, __entry) \
50 do { \
51 set_pte(__ptep, __entry); \
52 } while (0)
53 #endif
55 #ifndef __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
56 static inline int ptep_test_and_clear_young(pte_t *ptep)
57 {
58 pte_t pte = *ptep;
59 if (!pte_young(pte))
60 return 0;
61 set_pte(ptep, pte_mkold(pte));
62 return 1;
63 }
64 #endif
66 #ifndef __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH
67 #define ptep_clear_flush_young(__vma, __address, __ptep) \
68 ({ \
69 int __young = ptep_test_and_clear_young(__ptep); \
70 if (__young) \
71 flush_tlb_page(__vma, __address); \
72 __young; \
73 })
74 #endif
76 #ifndef __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY
77 static inline int ptep_test_and_clear_dirty(pte_t *ptep)
78 {
79 pte_t pte = *ptep;
80 if (!pte_dirty(pte))
81 return 0;
82 set_pte(ptep, pte_mkclean(pte));
83 return 1;
84 }
85 #endif
87 #ifndef __HAVE_ARCH_PTEP_CLEAR_DIRTY_FLUSH
88 #define ptep_clear_flush_dirty(__vma, __address, __ptep) \
89 ({ \
90 int __dirty = ptep_test_and_clear_dirty(__ptep); \
91 if (__dirty) \
92 flush_tlb_page(__vma, __address); \
93 __dirty; \
94 })
95 #endif
97 #ifndef __HAVE_ARCH_PTEP_GET_AND_CLEAR
98 static inline pte_t ptep_get_and_clear(pte_t *ptep)
99 {
100 pte_t pte = *ptep;
101 pte_clear(ptep);
102 return pte;
103 }
104 #endif
106 #ifndef __HAVE_ARCH_PTEP_CLEAR_FLUSH
107 #define ptep_clear_flush(__vma, __address, __ptep) \
108 ({ \
109 pte_t __pte = ptep_get_and_clear(__ptep); \
110 flush_tlb_page(__vma, __address); \
111 __pte; \
112 })
113 #endif
115 #ifndef __HAVE_ARCH_PTEP_SET_WRPROTECT
116 static inline void ptep_set_wrprotect(pte_t *ptep)
117 {
118 pte_t old_pte = *ptep;
119 set_pte(ptep, pte_wrprotect(old_pte));
120 }
121 #endif
123 #ifndef __HAVE_ARCH_PTEP_MKDIRTY
124 static inline void ptep_mkdirty(pte_t *ptep)
125 {
126 pte_t old_pte = *ptep;
127 set_pte(ptep, pte_mkdirty(old_pte));
128 }
129 #endif
131 #ifndef __HAVE_ARCH_PTE_SAME
132 #define pte_same(A,B) (pte_val(A) == pte_val(B))
133 #endif
135 #ifndef __HAVE_ARCH_PAGE_TEST_AND_CLEAR_DIRTY
136 #define page_test_and_clear_dirty(page) (0)
137 #endif
139 #ifndef __HAVE_ARCH_PAGE_TEST_AND_CLEAR_YOUNG
140 #define page_test_and_clear_young(page) (0)
141 #endif
143 #ifndef __HAVE_ARCH_PGD_OFFSET_GATE
144 #define pgd_offset_gate(mm, addr) pgd_offset(mm, addr)
145 #endif
147 #endif /* _ASM_GENERIC_PGTABLE_H */