Magellan Linux

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 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: 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