Magellan Linux

Contents of /trunk/kernel26-xen/patches-2.6.25-r1/1063-2.6.25-xen-64-bit-ready-MMU-operations.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 606 - (show annotations) (download)
Thu May 22 23:13:13 2008 UTC (15 years, 11 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