Contents of /trunk/kernel26-xen/patches-2.6.25-r1/1063-2.6.25-xen-64-bit-ready-MMU-operations.patch
Parent Directory | Revision Log
Revision 606 -
(show annotations)
(download)
Thu May 22 23:13:13 2008 UTC (16 years, 4 months ago) by niro
File size: 7522 byte(s)
Thu May 22 23:13:13 2008 UTC (16 years, 4 months ago) by niro
File size: 7522 byte(s)
-ver bump to 2.6.25-magellan-r1: - linux-2.6.25.4 - fbcondecor-0.9.4 - squashfs-3.3 - unionfs-2.3.3 - tuxonice-3.0-rc7 - linux-phc-0.3.0 - acpi-dstd-0.9a - reiser4 - xen-3.2.0 . ipw3945-1.2.2
1 | From ed28fe309ac8e99b383d308f87e2cec2b3b6520a Mon Sep 17 00:00:00 2001 |
2 | From: Eduardo Habkost <ehabkost@redhat.com> |
3 | Date: Wed, 23 Jan 2008 12:00:39 -0200 |
4 | Subject: [PATCH] Xen 64-bit-ready MMU operations |
5 | |
6 | Lots of unification of functions. |
7 | |
8 | Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> |
9 | --- |
10 | arch/x86/xen/enlighten.c | 18 +++--- |
11 | arch/x86/xen/mmu.c | 136 +++++++++++++++++++++++----------------------- |
12 | arch/x86/xen/mmu.h | 26 +++++----- |
13 | 3 files changed, 90 insertions(+), 90 deletions(-) |
14 | |
15 | diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c |
16 | index 1828284..89097b5 100644 |
17 | --- a/arch/x86/xen/enlighten.c |
18 | +++ b/arch/x86/xen/enlighten.c |
19 | @@ -1183,23 +1183,23 @@ static const struct pv_mmu_ops xen_mmu_ops __initdata = { |
20 | .make_pte = xen_make_pte, |
21 | .make_pgd = xen_make_pgd, |
22 | |
23 | -#ifdef CONFIG_X86_32 |
24 | -# ifdef CONFIG_X86_PAE |
25 | +#ifdef CONFIG_X86_PAE |
26 | .set_pte_atomic = xen_set_pte_atomic, |
27 | .set_pte_present = xen_set_pte_at, |
28 | - .set_pud = xen_set_pud, |
29 | .pte_clear = xen_pte_clear, |
30 | .pmd_clear = xen_pmd_clear, |
31 | |
32 | - .make_pmd = xen_make_pmd, |
33 | - .pmd_val = xen_pmd_val, |
34 | -# endif /* PAE */ |
35 | -#else |
36 | - .set_pgd = xen_set_pgd, |
37 | - .make_pud = xen_make_pud, |
38 | +#endif /* PAE */ |
39 | |
40 | +#if PAGETABLE_LEVELS >= 3 |
41 | .make_pmd = xen_make_pmd, |
42 | .pmd_val = xen_pmd_val, |
43 | + .set_pud = xen_set_pud, |
44 | +#endif |
45 | +#if PAGETABLE_LEVELS >= 4 |
46 | + .make_pud = xen_make_pud, |
47 | + .pud_val = xen_pud_val, |
48 | + .set_pgd = xen_set_pgd, |
49 | #endif |
50 | |
51 | .activate_mm = xen_activate_mm, |
52 | diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c |
53 | index 89aaa58..1880f9f 100644 |
54 | --- a/arch/x86/xen/mmu.c |
55 | +++ b/arch/x86/xen/mmu.c |
56 | @@ -169,9 +169,29 @@ pte_t xen_make_pte(pteval_t pte) |
57 | return (pte_t){ .pte = pte }; |
58 | } |
59 | |
60 | -#if defined(CONFIG_X86_PAE) || defined(CONFIG_X86_64) |
61 | +/*FIXME: re-check all pgtable functions and the patches that touch them */ |
62 | + |
63 | +#if PAGETABLE_LEVELS >= 3 |
64 | + |
65 | +pmdval_t xen_pmd_val(pmd_t pmd) |
66 | +{ |
67 | + pmdval_t ret = pmd_val_ma(pmd); |
68 | + |
69 | + /*FIXME: handle attr bits properly (especially NX) */ |
70 | + if (ret & _PAGE_PRESENT) |
71 | + ret = machine_to_phys(XMADDR(ret)).paddr | 1; |
72 | + return ret; |
73 | +} |
74 | + |
75 | +pmd_t xen_make_pmd(pmdval_t pmd) |
76 | +{ |
77 | + /*FIXME: handle attr bits properly (especially NX) */ |
78 | + if (pmd & _PAGE_PRESENT) |
79 | + pmd = phys_to_machine(XPADDR(pmd)).maddr; |
80 | + |
81 | + return (pmd_t){ pmd }; |
82 | +} |
83 | |
84 | -/*FIXME: merge functions where possible */ |
85 | |
86 | |
87 | void xen_set_pud(pud_t *ptr, pud_t val) |
88 | @@ -192,23 +212,28 @@ void xen_set_pud(pud_t *ptr, pud_t val) |
89 | preempt_enable(); |
90 | } |
91 | |
92 | +#endif |
93 | |
94 | -#ifdef CONFIG_X86_64 |
95 | |
96 | -void xen_set_pte(pte_t *ptep, pte_t pte) |
97 | -{ |
98 | - ptep->pte = pte.pte; |
99 | - //smp_wmb(); |
100 | -} |
101 | +#if PAGETABLE_LEVELS >= 4 |
102 | |
103 | -void xen_set_pte_atomic(pte_t *ptep, pte_t pte) |
104 | +pudval_t xen_pud_val(pud_t pud) |
105 | { |
106 | - set_64bit((unsigned long *)ptep, pte_val_ma(pte)); |
107 | + pudval_t ret = pud_val_ma(pud); |
108 | + |
109 | + /*FIXME: handle attr bits properly (especially NX) */ |
110 | + if (ret) |
111 | + ret = machine_to_phys(XMADDR(ret)).paddr | 1; |
112 | + return ret; |
113 | } |
114 | |
115 | -void xen_pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) |
116 | +pud_t xen_make_pud(pudval_t pud) |
117 | { |
118 | - ptep->pte = 0; |
119 | + /*FIXME: handle attr bits properly (especially NX) */ |
120 | + if (pud & _PAGE_PRESENT) |
121 | + pud = phys_to_machine(XPADDR(pud)).maddr; |
122 | + |
123 | + return native_make_pud(pud); |
124 | } |
125 | |
126 | void xen_set_pgd(pgd_t *ptr, pgd_t val) |
127 | @@ -230,91 +255,66 @@ void xen_set_pgd(pgd_t *ptr, pgd_t val) |
128 | |
129 | preempt_enable(); |
130 | } |
131 | -#else |
132 | |
133 | -void xen_set_pte(pte_t *ptep, pte_t pte) |
134 | -{ |
135 | - ptep->pte_high = pte.pte_high; |
136 | - smp_wmb(); |
137 | - ptep->pte_low = pte.pte_low; |
138 | -} |
139 | +#endif |
140 | |
141 | -void xen_set_pte_atomic(pte_t *ptep, pte_t pte) |
142 | +pgdval_t xen_pgd_val(pgd_t pgd) |
143 | { |
144 | - set_64bit((u64 *)ptep, pte_val_ma(pte)); |
145 | + pgdval_t ret = pgd_val_ma(pgd); |
146 | + |
147 | + /*FIXME: handle attr bits properly (especially NX) */ |
148 | + if (ret & _PAGE_PRESENT) |
149 | + ret = machine_to_phys(XMADDR(ret)).paddr | 1; |
150 | + return ret; |
151 | } |
152 | |
153 | -void xen_pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) |
154 | +pgd_t xen_make_pgd(pgdval_t pgd) |
155 | { |
156 | - ptep->pte_low = 0; |
157 | - smp_wmb(); /* make sure low gets written first */ |
158 | - ptep->pte_high = 0; |
159 | + /*FIXME: handle attr bits properly (especially NX) */ |
160 | + if (pgd & _PAGE_PRESENT) |
161 | + pgd = phys_to_machine(XPADDR(pgd)).maddr; |
162 | + |
163 | + return native_make_pgd(pgd); |
164 | } |
165 | |
166 | -#endif |
167 | |
168 | -void xen_pmd_clear(pmd_t *pmdp) |
169 | -{ |
170 | - xen_set_pmd(pmdp, __pmd(0)); |
171 | -} |
172 | +#ifdef CONFIG_X86_PAE |
173 | |
174 | -pmdval_t xen_pmd_val(pmd_t pmd) |
175 | -{ |
176 | - unsigned long long ret = pmd.pmd; |
177 | +/* Some operations need special handling on x86_32 under PAE */ |
178 | |
179 | - if (ret) |
180 | - ret = machine_to_phys(XMADDR(ret)).paddr | 1; |
181 | - return ret; |
182 | +void xen_set_pte(pte_t *ptep, pte_t pte) |
183 | +{ |
184 | + ptep->pte_high = pte.pte_high; |
185 | + smp_wmb(); |
186 | + ptep->pte_low = pte.pte_low; |
187 | } |
188 | |
189 | -pgdval_t xen_pgd_val(pgd_t pgd) |
190 | +void xen_pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) |
191 | { |
192 | - unsigned long long ret = pgd.pgd; |
193 | - if (ret) |
194 | - ret = machine_to_phys(XMADDR(ret)).paddr | 1; |
195 | - return ret; |
196 | + ptep->pte_low = 0; |
197 | + smp_wmb(); /* make sure low gets written first */ |
198 | + ptep->pte_high = 0; |
199 | } |
200 | |
201 | -pmd_t xen_make_pmd(pmdval_t pmd) |
202 | +void xen_set_pte_atomic(pte_t *ptep, pte_t pte) |
203 | { |
204 | - if (pmd & 1) |
205 | - pmd = phys_to_machine(XPADDR(pmd)).maddr; |
206 | - |
207 | - return (pmd_t){ pmd }; |
208 | + set_64bit((u64 *)ptep, pte_val_ma(pte)); |
209 | } |
210 | |
211 | -pgd_t xen_make_pgd(pgdval_t pgd) |
212 | +void xen_pmd_clear(pmd_t *pmdp) |
213 | { |
214 | - if (pgd & _PAGE_PRESENT) |
215 | - pgd = phys_to_machine(XPADDR(pgd)).maddr; |
216 | - |
217 | - return (pgd_t){ pgd }; |
218 | + xen_set_pmd(pmdp, __pmd(0)); |
219 | } |
220 | |
221 | -#else /* !PAE */ |
222 | +#else /* non-PAE */ |
223 | |
224 | void xen_set_pte(pte_t *ptep, pte_t pte) |
225 | { |
226 | *ptep = pte; |
227 | } |
228 | |
229 | -pgdval_t xen_pgd_val(pgd_t pgd) |
230 | -{ |
231 | - unsigned long ret = pgd.pgd; |
232 | - if (ret) |
233 | - ret = machine_to_phys(XMADDR(ret)).paddr | 1; |
234 | - return ret; |
235 | -} |
236 | - |
237 | -pgd_t xen_make_pgd(pgdval_t pgd) |
238 | -{ |
239 | - if (pgd & _PAGE_PRESENT) |
240 | - pgd = phys_to_machine(XPADDR(pgd)).maddr; |
241 | - |
242 | - return (pgd_t){ pgd }; |
243 | -} |
244 | +#endif |
245 | |
246 | -#endif /* CONFIG_X86_PAE */ |
247 | |
248 | /* |
249 | (Yet another) pagetable walker. This one is intended for pinning a |
250 | diff --git a/arch/x86/xen/mmu.h b/arch/x86/xen/mmu.h |
251 | index 62a325c..b25b8e4 100644 |
252 | --- a/arch/x86/xen/mmu.h |
253 | +++ b/arch/x86/xen/mmu.h |
254 | @@ -28,7 +28,6 @@ void set_pte_mfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags); |
255 | void xen_set_pte(pte_t *ptep, pte_t pteval); |
256 | void xen_set_pte_at(struct mm_struct *mm, unsigned long addr, |
257 | pte_t *ptep, pte_t pteval); |
258 | -void xen_set_pmd(pmd_t *pmdp, pmd_t pmdval); |
259 | |
260 | void xen_activate_mm(struct mm_struct *prev, struct mm_struct *next); |
261 | void xen_dup_mmap(struct mm_struct *oldmm, struct mm_struct *mm); |
262 | @@ -40,27 +39,28 @@ void xen_pgd_pin(pgd_t *pgd); |
263 | void xen_do_pin(unsigned level, unsigned long pfn); |
264 | |
265 | pteval_t xen_pte_val(pte_t); |
266 | -pmdval_t xen_pmd_val(pmd_t); |
267 | -pudval_t xen_pud_val(pud_t); |
268 | -pgdval_t xen_pgd_val(pgd_t); |
269 | - |
270 | pte_t xen_make_pte(pteval_t); |
271 | +void xen_set_pmd(pmd_t *pmdp, pmd_t pmdval); |
272 | + |
273 | +#if PAGETABLE_LEVELS >= 3 |
274 | +pmdval_t xen_pmd_val(pmd_t); |
275 | pmd_t xen_make_pmd(pmdval_t); |
276 | +void xen_set_pud(pud_t *ptr, pud_t val); |
277 | +#endif |
278 | + |
279 | +#if PAGETABLE_LEVELS >= 4 |
280 | +pudval_t xen_pud_val(pud_t); |
281 | pud_t xen_make_pud(pudval_t); |
282 | +void xen_set_pgd(pgd_t *pgdp, pgd_t pgdval); |
283 | +#endif |
284 | + |
285 | +pgdval_t xen_pgd_val(pgd_t); |
286 | pgd_t xen_make_pgd(pgdval_t); |
287 | |
288 | #ifdef CONFIG_X86_PAE |
289 | -void xen_set_pte_at(struct mm_struct *mm, unsigned long addr, |
290 | - pte_t *ptep, pte_t pteval); |
291 | void xen_set_pte_atomic(pte_t *ptep, pte_t pte); |
292 | -void xen_set_pud(pud_t *ptr, pud_t val); |
293 | void xen_pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep); |
294 | void xen_pmd_clear(pmd_t *pmdp); |
295 | - |
296 | -#endif |
297 | - |
298 | -#ifdef CONFIG_X86_64 |
299 | -void xen_set_pgd(pgd_t *pgdp, pgd_t pgdval); |
300 | #endif |
301 | |
302 | #endif /* _XEN_MMU_H */ |
303 | -- |
304 | 1.5.4.1 |
305 |