/[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 |
Annotation 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 -
(hide annotations)
(download)
Thu May 22 23:13:13 2008 UTC (16 years, 4 months ago) by niro
File size: 3365 byte(s)
Thu May 22 23:13:13 2008 UTC (16 years, 4 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 | niro | 606 | 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 |