/[pkg-src]/trunk/kernel26-xen/patches-2.6.25-r1/1074-2.6.25-xen-Make-xen_pxx_val-and-xen_make_pxx-handle-attr-bi.patch |
Contents of /trunk/kernel26-xen/patches-2.6.25-r1/1074-2.6.25-xen-Make-xen_pxx_val-and-xen_make_pxx-handle-attr-bi.patch
Parent Directory | Revision Log
Revision 606 -
(show annotations)
(download)
Thu May 22 23:13:13 2008 UTC (15 years, 11 months ago) by niro
File size: 3365 byte(s)
Thu May 22 23:13:13 2008 UTC (15 years, 11 months ago) by niro
File size: 3365 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 8ed2e2bdb8d9cfe49b9f33f5e6eb98bfa1d8c779 Mon Sep 17 00:00:00 2001 |
2 | From: Eduardo Habkost <ehabkost@redhat.com> |
3 | Date: Wed, 23 Jan 2008 12:31:46 -0200 |
4 | Subject: [PATCH] Make xen_pxx_val() and xen_make_pxx() handle attr bits safely |
5 | |
6 | Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> |
7 | --- |
8 | arch/x86/xen/mmu.c | 60 +++++++++++++++++++++++++++++++++++---------------- |
9 | 1 files changed, 41 insertions(+), 19 deletions(-) |
10 | |
11 | diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c |
12 | index 1880f9f..16020ec 100644 |
13 | --- a/arch/x86/xen/mmu.c |
14 | +++ b/arch/x86/xen/mmu.c |
15 | @@ -162,7 +162,10 @@ pteval_t xen_pte_val(pte_t pte) |
16 | pte_t xen_make_pte(pteval_t pte) |
17 | { |
18 | if (pte & _PAGE_PRESENT) { |
19 | - pte = phys_to_machine(XPADDR(pte)).maddr; |
20 | + /* preserve all other pte bits */ |
21 | + pteval_t m = phys_to_machine(XPADDR(pte & PHYSICAL_PAGE_MASK)).maddr; |
22 | + pte &= ~PHYSICAL_PAGE_MASK; |
23 | + pte |= m; |
24 | pte &= ~(_PAGE_PCD | _PAGE_PWT); |
25 | } |
26 | |
27 | @@ -177,17 +180,23 @@ pmdval_t xen_pmd_val(pmd_t pmd) |
28 | { |
29 | pmdval_t ret = pmd_val_ma(pmd); |
30 | |
31 | - /*FIXME: handle attr bits properly (especially NX) */ |
32 | - if (ret & _PAGE_PRESENT) |
33 | - ret = machine_to_phys(XMADDR(ret)).paddr | 1; |
34 | + if (ret & _PAGE_PRESENT) { |
35 | + /* preserve all other pmd bits */ |
36 | + pmdval_t m = machine_to_phys(XMADDR(ret & PHYSICAL_PAGE_MASK)).paddr; |
37 | + ret &= ~PHYSICAL_PAGE_MASK; |
38 | + ret |= m; |
39 | + } |
40 | return ret; |
41 | } |
42 | |
43 | pmd_t xen_make_pmd(pmdval_t pmd) |
44 | { |
45 | - /*FIXME: handle attr bits properly (especially NX) */ |
46 | - if (pmd & _PAGE_PRESENT) |
47 | - pmd = phys_to_machine(XPADDR(pmd)).maddr; |
48 | + if (pmd & _PAGE_PRESENT) { |
49 | + /* preserve all other pmd bits */ |
50 | + pmdval_t m = phys_to_machine(XPADDR(pmd & PHYSICAL_PAGE_MASK)).maddr; |
51 | + pmd &= ~PHYSICAL_PAGE_MASK; |
52 | + pmd |= m; |
53 | + } |
54 | |
55 | return (pmd_t){ pmd }; |
56 | } |
57 | @@ -221,17 +230,23 @@ pudval_t xen_pud_val(pud_t pud) |
58 | { |
59 | pudval_t ret = pud_val_ma(pud); |
60 | |
61 | - /*FIXME: handle attr bits properly (especially NX) */ |
62 | - if (ret) |
63 | - ret = machine_to_phys(XMADDR(ret)).paddr | 1; |
64 | + if (ret & _PAGE_PRESENT) { |
65 | + /* preserve all other pud bits */ |
66 | + pudval_t m = machine_to_phys(XMADDR(ret & PHYSICAL_PAGE_MASK)).paddr; |
67 | + ret &= ~PHYSICAL_PAGE_MASK; |
68 | + ret |= m; |
69 | + } |
70 | return ret; |
71 | } |
72 | |
73 | pud_t xen_make_pud(pudval_t pud) |
74 | { |
75 | - /*FIXME: handle attr bits properly (especially NX) */ |
76 | - if (pud & _PAGE_PRESENT) |
77 | - pud = phys_to_machine(XPADDR(pud)).maddr; |
78 | + if (pud & _PAGE_PRESENT) { |
79 | + /* preserve all other pud bits */ |
80 | + pudval_t m = phys_to_machine(XPADDR(pud & PHYSICAL_PAGE_MASK)).maddr; |
81 | + pud &= ~PHYSICAL_PAGE_MASK; |
82 | + pud |= m; |
83 | + } |
84 | |
85 | return native_make_pud(pud); |
86 | } |
87 | @@ -262,17 +277,24 @@ pgdval_t xen_pgd_val(pgd_t pgd) |
88 | { |
89 | pgdval_t ret = pgd_val_ma(pgd); |
90 | |
91 | - /*FIXME: handle attr bits properly (especially NX) */ |
92 | - if (ret & _PAGE_PRESENT) |
93 | - ret = machine_to_phys(XMADDR(ret)).paddr | 1; |
94 | + if (ret & _PAGE_PRESENT) { |
95 | + /* preserve all other pgd bits */ |
96 | + pgdval_t m = machine_to_phys(XMADDR(ret & PHYSICAL_PAGE_MASK)).paddr; |
97 | + ret &= ~PHYSICAL_PAGE_MASK; |
98 | + ret |= m; |
99 | + } |
100 | return ret; |
101 | } |
102 | |
103 | pgd_t xen_make_pgd(pgdval_t pgd) |
104 | { |
105 | - /*FIXME: handle attr bits properly (especially NX) */ |
106 | - if (pgd & _PAGE_PRESENT) |
107 | - pgd = phys_to_machine(XPADDR(pgd)).maddr; |
108 | + if (pgd & _PAGE_PRESENT) { |
109 | + /* preserve all other pgd bits */ |
110 | + pgdval_t m = phys_to_machine(XPADDR(pgd & PHYSICAL_PAGE_MASK)).maddr; |
111 | + pgd &= ~PHYSICAL_PAGE_MASK; |
112 | + pgd |= m; |
113 | + } |
114 | + |
115 | |
116 | return native_make_pgd(pgd); |
117 | } |
118 | -- |
119 | 1.5.4.1 |
120 |