Magellan Linux

Annotation of /trunk/kernel26-xen/patches-2.6.25-r1/1019-2.6.25-xen-dom0-Add-set_fixmap-pv_mmu_ops.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 606 - (hide annotations) (download)
Thu May 22 23:13:13 2008 UTC (16 years, 1 month ago) by niro
File size: 4877 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 4975fbff3f18ca2cbb3019bf428cb9507ca66466 Mon Sep 17 00:00:00 2001
2     From: Mark McLoughlin <markmc@redhat.com>
3     Date: Mon, 28 Jan 2008 15:42:08 +0000
4     Subject: [PATCH] xen dom0: Add set_fixmap pv_mmu_ops.
5    
6     Adds the logic necessary to map by mfn rather than pfn when we set up
7     fixmaps to point to IO space.
8    
9     Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com>
10     Signed-off-by: Juan Quintela <quintela@redhat.com>
11     Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
12     Signed-off-by: Mark McLoughlin <markmc@redhat.com>
13     ---
14     arch/x86/kernel/paravirt.c | 2 ++
15     arch/x86/mm/pgtable_32.c | 9 +++++++--
16     arch/x86/xen/enlighten.c | 28 ++++++++++++++++++++++++++++
17     include/asm-x86/fixmap_32.h | 13 +++++++++++--
18     include/asm-x86/paravirt.h | 13 +++++++++++++
19     5 files changed, 61 insertions(+), 4 deletions(-)
20    
21     diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
22     index c845947..47f42bf 100644
23     --- a/arch/x86/kernel/paravirt.c
24     +++ b/arch/x86/kernel/paravirt.c
25     @@ -433,6 +433,8 @@ struct pv_mmu_ops pv_mmu_ops = {
26     .enter = paravirt_nop,
27     .leave = paravirt_nop,
28     },
29     +
30     + .set_fixmap = native_set_fixmap,
31     };
32    
33     EXPORT_SYMBOL_GPL(pv_time_ops);
34     diff --git a/arch/x86/mm/pgtable_32.c b/arch/x86/mm/pgtable_32.c
35     index fca936b..c1c7c36 100644
36     --- a/arch/x86/mm/pgtable_32.c
37     +++ b/arch/x86/mm/pgtable_32.c
38     @@ -150,7 +150,7 @@ static int fixmaps;
39     unsigned long __FIXADDR_TOP = 0xfffff000;
40     EXPORT_SYMBOL(__FIXADDR_TOP);
41    
42     -void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags)
43     +void __native_set_fixmap(enum fixed_addresses idx, pte_t pte)
44     {
45     unsigned long address = __fix_to_virt(idx);
46    
47     @@ -158,10 +158,15 @@ void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags)
48     BUG();
49     return;
50     }
51     - set_pte_vaddr(address, pfn_pte(phys >> PAGE_SHIFT, flags));
52     + set_pte_vaddr(address, pte);
53     fixmaps++;
54     }
55    
56     +void native_set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t flags)
57     +{
58     + __native_set_fixmap(idx, pfn_pte(phys >> PAGE_SHIFT, flags));
59     +}
60     +
61     /**
62     * reserve_top_address - reserves a hole in the top of kernel address space
63     * @reserve - size of hole to reserve
64     diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
65     index 907567d..22e0d41 100644
66     --- a/arch/x86/xen/enlighten.c
67     +++ b/arch/x86/xen/enlighten.c
68     @@ -965,6 +965,32 @@ static unsigned xen_patch(u8 type, u16 clobbers, void *insnbuf,
69     return ret;
70     }
71    
72     +static void xen_set_fixmap(unsigned idx, unsigned long phys, pgprot_t prot)
73     +{
74     + pte_t pte;
75     +
76     + phys >>= PAGE_SHIFT;
77     +
78     + switch (idx) {
79     +#ifdef CONFIG_X86_F00F_BUG
80     + case FIX_F00F_IDT:
81     +#endif
82     + case FIX_WP_TEST:
83     + case FIX_VDSO:
84     +#ifdef CONFIG_X86_LOCAL_APIC
85     + case FIX_APIC_BASE: /* maps dummy local APIC */
86     +#endif
87     + pte = pfn_pte(phys, prot);
88     + break;
89     +
90     + default:
91     + pte = mfn_pte(phys, prot);
92     + break;
93     + }
94     +
95     + __native_set_fixmap(idx, pte);
96     +}
97     +
98     static const struct pv_info xen_info __initdata = {
99     .paravirt_enabled = 1,
100     .shared_kernel_pmd = 0,
101     @@ -1120,6 +1146,8 @@ static const struct pv_mmu_ops xen_mmu_ops __initdata = {
102     .enter = paravirt_enter_lazy_mmu,
103     .leave = xen_leave_lazy,
104     },
105     +
106     + .set_fixmap = xen_set_fixmap,
107     };
108    
109     #ifdef CONFIG_SMP
110     diff --git a/include/asm-x86/fixmap_32.h b/include/asm-x86/fixmap_32.h
111     index a7404d5..c2e450a 100644
112     --- a/include/asm-x86/fixmap_32.h
113     +++ b/include/asm-x86/fixmap_32.h
114     @@ -110,8 +110,17 @@ enum fixed_addresses {
115     __end_of_fixed_addresses
116     };
117    
118     -extern void __set_fixmap (enum fixed_addresses idx,
119     - unsigned long phys, pgprot_t flags);
120     +void __native_set_fixmap(enum fixed_addresses idx, pte_t pte);
121     +void native_set_fixmap(enum fixed_addresses idx,
122     + unsigned long phys, pgprot_t flags);
123     +
124     +#ifndef CONFIG_PARAVIRT
125     +static inline void __set_fixmap(enum fixed_addresses idx,
126     + unsigned long phys, pgprot_t flags)
127     +{
128     + native_set_fixmap(idx, phys, flags);
129     +}
130     +#endif
131     extern void reserve_top_address(unsigned long reserve);
132    
133     #define set_fixmap(idx, phys) \
134     diff --git a/include/asm-x86/paravirt.h b/include/asm-x86/paravirt.h
135     index 7d7070a..c7c4e34 100644
136     --- a/include/asm-x86/paravirt.h
137     +++ b/include/asm-x86/paravirt.h
138     @@ -272,6 +272,13 @@ struct pv_mmu_ops {
139     #endif
140    
141     struct pv_lazy_ops lazy_mode;
142     +
143     + /* dom0 ops */
144     +
145     + /* Sometimes the physical address is a pfn, and sometimes its
146     + an mfn. We can tell which is which from the index. */
147     + void (*set_fixmap)(unsigned /* enum fixed_addresses */ idx,
148     + unsigned long phys, pgprot_t flags);
149     };
150    
151     /* This contains all the paravirt structures: we get a convenient
152     @@ -1235,6 +1242,12 @@ static inline void arch_flush_lazy_mmu_mode(void)
153     }
154     }
155    
156     +static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
157     + unsigned long phys, pgprot_t flags)
158     +{
159     + pv_mmu_ops.set_fixmap(idx, phys, flags);
160     +}
161     +
162     void _paravirt_nop(void);
163     #define paravirt_nop ((void *)_paravirt_nop)
164    
165     --
166     1.5.4.1
167