Magellan Linux

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 Parent Directory | Revision Log Revision Log


Revision 606 - (hide annotations) (download)
Thu May 22 23:13:13 2008 UTC (16 years 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