Annotation of /trunk/kernel26-xen/patches-2.6.25-r1/1013-2.6.25-xen-auto-arch-i386.patch
Parent Directory | Revision Log
Revision 609 -
(hide annotations)
(download)
Fri May 23 17:35:37 2008 UTC (16 years, 4 months ago) by niro
File size: 11187 byte(s)
Fri May 23 17:35:37 2008 UTC (16 years, 4 months ago) by niro
File size: 11187 byte(s)
-using opensuse xen patchset, updated kernel configs
1 | niro | 609 | Subject: xen3 arch-i386 |
2 | From: http://xenbits.xensource.com/linux-2.6.18-xen.hg (tip 517:d71965a78c20) | ||
3 | Patch-mainline: obsolete | ||
4 | Acked-by: jbeulich@novell.com | ||
5 | |||
6 | Index: head-2008-04-15/arch/x86/kernel/asm-offsets_32.c | ||
7 | =================================================================== | ||
8 | --- head-2008-04-15.orig/arch/x86/kernel/asm-offsets_32.c 2008-04-15 09:41:09.000000000 +0200 | ||
9 | +++ head-2008-04-15/arch/x86/kernel/asm-offsets_32.c 2008-04-15 09:59:29.000000000 +0200 | ||
10 | @@ -98,9 +98,14 @@ void foo(void) | ||
11 | OFFSET(pbe_orig_address, pbe, orig_address); | ||
12 | OFFSET(pbe_next, pbe, next); | ||
13 | |||
14 | +#ifndef CONFIG_X86_NO_TSS | ||
15 | /* Offset from the sysenter stack to tss.sp0 */ | ||
16 | - DEFINE(TSS_sysenter_sp0, offsetof(struct tss_struct, x86_tss.sp0) - | ||
17 | + DEFINE(SYSENTER_stack_sp0, offsetof(struct tss_struct, x86_tss.sp0) - | ||
18 | sizeof(struct tss_struct)); | ||
19 | +#else | ||
20 | + /* sysenter stack points directly to sp0 */ | ||
21 | + DEFINE(SYSENTER_stack_sp0, 0); | ||
22 | +#endif | ||
23 | |||
24 | DEFINE(PAGE_SIZE_asm, PAGE_SIZE); | ||
25 | DEFINE(PAGE_SHIFT_asm, PAGE_SHIFT); | ||
26 | Index: head-2008-04-15/arch/x86/kernel/entry_32.S | ||
27 | =================================================================== | ||
28 | --- head-2008-04-15.orig/arch/x86/kernel/entry_32.S 2008-04-15 09:41:09.000000000 +0200 | ||
29 | +++ head-2008-04-15/arch/x86/kernel/entry_32.S 2008-04-15 09:59:29.000000000 +0200 | ||
30 | @@ -288,7 +288,7 @@ ENTRY(ia32_sysenter_target) | ||
31 | CFI_SIGNAL_FRAME | ||
32 | CFI_DEF_CFA esp, 0 | ||
33 | CFI_REGISTER esp, ebp | ||
34 | - movl TSS_sysenter_sp0(%esp),%esp | ||
35 | + movl SYSENTER_stack_sp0(%esp),%esp | ||
36 | sysenter_past_esp: | ||
37 | /* | ||
38 | * No need to follow this irqs on/off section: the syscall | ||
39 | @@ -744,7 +744,7 @@ END(device_not_available) | ||
40 | * that sets up the real kernel stack. Check here, since we can't | ||
41 | * allow the wrong stack to be used. | ||
42 | * | ||
43 | - * "TSS_sysenter_sp0+12" is because the NMI/debug handler will have | ||
44 | + * "SYSENTER_stack_sp0+12" is because the NMI/debug handler will have | ||
45 | * already pushed 3 words if it hits on the sysenter instruction: | ||
46 | * eflags, cs and eip. | ||
47 | * | ||
48 | @@ -756,7 +756,7 @@ END(device_not_available) | ||
49 | cmpw $__KERNEL_CS,4(%esp); \ | ||
50 | jne ok; \ | ||
51 | label: \ | ||
52 | - movl TSS_sysenter_sp0+offset(%esp),%esp; \ | ||
53 | + movl SYSENTER_stack_sp0+offset(%esp),%esp; \ | ||
54 | CFI_DEF_CFA esp, 0; \ | ||
55 | CFI_UNDEFINED eip; \ | ||
56 | pushfl; \ | ||
57 | Index: head-2008-04-15/arch/x86/kernel/machine_kexec_32.c | ||
58 | =================================================================== | ||
59 | --- head-2008-04-15.orig/arch/x86/kernel/machine_kexec_32.c 2008-04-15 09:41:09.000000000 +0200 | ||
60 | +++ head-2008-04-15/arch/x86/kernel/machine_kexec_32.c 2008-04-15 09:59:29.000000000 +0200 | ||
61 | @@ -21,6 +21,10 @@ | ||
62 | #include <asm/desc.h> | ||
63 | #include <asm/system.h> | ||
64 | |||
65 | +#ifdef CONFIG_XEN | ||
66 | +#include <xen/interface/kexec.h> | ||
67 | +#endif | ||
68 | + | ||
69 | #define PAGE_ALIGNED __attribute__ ((__aligned__(PAGE_SIZE))) | ||
70 | static u32 kexec_pgd[1024] PAGE_ALIGNED; | ||
71 | #ifdef CONFIG_X86_PAE | ||
72 | @@ -30,6 +34,55 @@ static u32 kexec_pmd1[1024] PAGE_ALIGNED | ||
73 | static u32 kexec_pte0[1024] PAGE_ALIGNED; | ||
74 | static u32 kexec_pte1[1024] PAGE_ALIGNED; | ||
75 | |||
76 | +#ifdef CONFIG_XEN | ||
77 | + | ||
78 | +#define __ma(x) (pfn_to_mfn(__pa((x)) >> PAGE_SHIFT) << PAGE_SHIFT) | ||
79 | + | ||
80 | +#if PAGES_NR > KEXEC_XEN_NO_PAGES | ||
81 | +#error PAGES_NR is greater than KEXEC_XEN_NO_PAGES - Xen support will break | ||
82 | +#endif | ||
83 | + | ||
84 | +#if PA_CONTROL_PAGE != 0 | ||
85 | +#error PA_CONTROL_PAGE is non zero - Xen support will break | ||
86 | +#endif | ||
87 | + | ||
88 | +void machine_kexec_setup_load_arg(xen_kexec_image_t *xki, struct kimage *image) | ||
89 | +{ | ||
90 | + void *control_page; | ||
91 | + | ||
92 | + memset(xki->page_list, 0, sizeof(xki->page_list)); | ||
93 | + | ||
94 | + control_page = page_address(image->control_code_page); | ||
95 | + memcpy(control_page, relocate_kernel, PAGE_SIZE); | ||
96 | + | ||
97 | + xki->page_list[PA_CONTROL_PAGE] = __ma(control_page); | ||
98 | + xki->page_list[PA_PGD] = __ma(kexec_pgd); | ||
99 | +#ifdef CONFIG_X86_PAE | ||
100 | + xki->page_list[PA_PMD_0] = __ma(kexec_pmd0); | ||
101 | + xki->page_list[PA_PMD_1] = __ma(kexec_pmd1); | ||
102 | +#endif | ||
103 | + xki->page_list[PA_PTE_0] = __ma(kexec_pte0); | ||
104 | + xki->page_list[PA_PTE_1] = __ma(kexec_pte1); | ||
105 | + | ||
106 | +} | ||
107 | + | ||
108 | +int __init machine_kexec_setup_resources(struct resource *hypervisor, | ||
109 | + struct resource *phys_cpus, | ||
110 | + int nr_phys_cpus) | ||
111 | +{ | ||
112 | + int k; | ||
113 | + | ||
114 | + /* The per-cpu crash note resources belong to the hypervisor resource */ | ||
115 | + for (k = 0; k < nr_phys_cpus; k++) | ||
116 | + request_resource(hypervisor, phys_cpus + k); | ||
117 | + | ||
118 | + return 0; | ||
119 | +} | ||
120 | + | ||
121 | +void machine_kexec_register_resources(struct resource *res) { ; } | ||
122 | + | ||
123 | +#endif /* CONFIG_XEN */ | ||
124 | + | ||
125 | /* | ||
126 | * A architecture hook called to validate the | ||
127 | * proposed image and prepare the control pages | ||
128 | @@ -56,6 +109,7 @@ void machine_kexec_cleanup(struct kimage | ||
129 | { | ||
130 | } | ||
131 | |||
132 | +#ifndef CONFIG_XEN | ||
133 | /* | ||
134 | * Do not allocate memory (or fail in any way) in machine_kexec(). | ||
135 | * We are past the point of no return, committed to rebooting now. | ||
136 | @@ -89,6 +143,7 @@ NORET_TYPE void machine_kexec(struct kim | ||
137 | relocate_kernel((unsigned long)image->head, (unsigned long)page_list, | ||
138 | image->start, cpu_has_pae); | ||
139 | } | ||
140 | +#endif | ||
141 | |||
142 | void arch_crash_save_vmcoreinfo(void) | ||
143 | { | ||
144 | Index: head-2008-04-15/arch/x86/kernel/traps_32.c | ||
145 | =================================================================== | ||
146 | --- head-2008-04-15.orig/arch/x86/kernel/traps_32.c 2008-04-15 09:41:09.000000000 +0200 | ||
147 | +++ head-2008-04-15/arch/x86/kernel/traps_32.c 2008-04-15 09:59:29.000000000 +0200 | ||
148 | @@ -764,18 +764,11 @@ mem_parity_error(unsigned char reason, s | ||
149 | static __kprobes void | ||
150 | io_check_error(unsigned char reason, struct pt_regs * regs) | ||
151 | { | ||
152 | - unsigned long i; | ||
153 | - | ||
154 | printk(KERN_EMERG "NMI: IOCK error (debug interrupt?)\n"); | ||
155 | show_registers(regs); | ||
156 | |||
157 | /* Re-enable the IOCK line, wait for a few seconds */ | ||
158 | - reason = (reason & 0xf) | 8; | ||
159 | - outb(reason, 0x61); | ||
160 | - i = 2000; | ||
161 | - while (--i) udelay(1000); | ||
162 | - reason &= ~8; | ||
163 | - outb(reason, 0x61); | ||
164 | + clear_io_check_error(reason); | ||
165 | } | ||
166 | |||
167 | static __kprobes void | ||
168 | Index: head-2008-04-15/arch/x86/kernel/vm86_32.c | ||
169 | =================================================================== | ||
170 | --- head-2008-04-15.orig/arch/x86/kernel/vm86_32.c 2008-04-15 09:41:09.000000000 +0200 | ||
171 | +++ head-2008-04-15/arch/x86/kernel/vm86_32.c 2008-04-15 09:59:29.000000000 +0200 | ||
172 | @@ -122,7 +122,9 @@ static int copy_vm86_regs_from_user(stru | ||
173 | |||
174 | struct pt_regs * save_v86_state(struct kernel_vm86_regs * regs) | ||
175 | { | ||
176 | +#ifndef CONFIG_X86_NO_TSS | ||
177 | struct tss_struct *tss; | ||
178 | +#endif | ||
179 | struct pt_regs *ret; | ||
180 | unsigned long tmp; | ||
181 | |||
182 | @@ -145,12 +147,16 @@ struct pt_regs * save_v86_state(struct k | ||
183 | do_exit(SIGSEGV); | ||
184 | } | ||
185 | |||
186 | +#ifndef CONFIG_X86_NO_TSS | ||
187 | tss = &per_cpu(init_tss, get_cpu()); | ||
188 | +#endif | ||
189 | current->thread.sp0 = current->thread.saved_sp0; | ||
190 | current->thread.sysenter_cs = __KERNEL_CS; | ||
191 | load_sp0(tss, ¤t->thread); | ||
192 | current->thread.saved_sp0 = 0; | ||
193 | +#ifndef CONFIG_X86_NO_TSS | ||
194 | put_cpu(); | ||
195 | +#endif | ||
196 | |||
197 | ret = KVM86->regs32; | ||
198 | |||
199 | @@ -276,7 +282,9 @@ out: | ||
200 | |||
201 | static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk) | ||
202 | { | ||
203 | +#ifndef CONFIG_X86_NO_TSS | ||
204 | struct tss_struct *tss; | ||
205 | +#endif | ||
206 | /* | ||
207 | * make sure the vm86() system call doesn't try to do anything silly | ||
208 | */ | ||
209 | @@ -321,12 +329,16 @@ static void do_sys_vm86(struct kernel_vm | ||
210 | tsk->thread.saved_fs = info->regs32->fs; | ||
211 | savesegment(gs, tsk->thread.saved_gs); | ||
212 | |||
213 | +#ifndef CONFIG_X86_NO_TSS | ||
214 | tss = &per_cpu(init_tss, get_cpu()); | ||
215 | +#endif | ||
216 | tsk->thread.sp0 = (unsigned long) &info->VM86_TSS_ESP0; | ||
217 | if (cpu_has_sep) | ||
218 | tsk->thread.sysenter_cs = 0; | ||
219 | load_sp0(tss, &tsk->thread); | ||
220 | +#ifndef CONFIG_X86_NO_TSS | ||
221 | put_cpu(); | ||
222 | +#endif | ||
223 | |||
224 | tsk->thread.screen_bitmap = info->screen_bitmap; | ||
225 | if (info->flags & VM86_SCREEN_BITMAP) | ||
226 | Index: head-2008-04-15/arch/x86/pci/Makefile_32 | ||
227 | =================================================================== | ||
228 | --- head-2008-04-15.orig/arch/x86/pci/Makefile_32 2008-04-15 09:41:09.000000000 +0200 | ||
229 | +++ head-2008-04-15/arch/x86/pci/Makefile_32 2008-04-15 09:59:29.000000000 +0200 | ||
230 | @@ -4,6 +4,10 @@ obj-$(CONFIG_PCI_BIOS) += pcbios.o | ||
231 | obj-$(CONFIG_PCI_MMCONFIG) += mmconfig_32.o direct.o mmconfig-shared.o | ||
232 | obj-$(CONFIG_PCI_DIRECT) += direct.o | ||
233 | |||
234 | +# pcifront should be after pcbios.o, mmconfig.o, and direct.o as it should only | ||
235 | +# take over if direct access to the PCI bus is unavailable | ||
236 | +obj-$(CONFIG_XEN_PCIDEV_FRONTEND) += pcifront.o | ||
237 | + | ||
238 | pci-y := fixup.o | ||
239 | pci-$(CONFIG_ACPI) += acpi.o | ||
240 | pci-y += legacy.o irq.o | ||
241 | Index: head-2008-04-15/arch/x86/power/cpu_32.c | ||
242 | =================================================================== | ||
243 | --- head-2008-04-15.orig/arch/x86/power/cpu_32.c 2008-04-15 09:41:09.000000000 +0200 | ||
244 | +++ head-2008-04-15/arch/x86/power/cpu_32.c 2008-04-15 09:59:29.000000000 +0200 | ||
245 | @@ -63,11 +63,12 @@ static void do_fpu_end(void) | ||
246 | |||
247 | static void fix_processor_context(void) | ||
248 | { | ||
249 | +#ifndef CONFIG_X86_NO_TSS | ||
250 | int cpu = smp_processor_id(); | ||
251 | struct tss_struct * t = &per_cpu(init_tss, cpu); | ||
252 | |||
253 | set_tss_desc(cpu,t); /* This just modifies memory; should not be necessary. But... This is necessary, because 386 hardware has concept of busy TSS or some similar stupidity. */ | ||
254 | - | ||
255 | +#endif | ||
256 | load_TR_desc(); /* This does ltr */ | ||
257 | load_LDT(¤t->active_mm->context); /* This does lldt */ | ||
258 | |||
259 | Index: head-2008-04-15/arch/x86/vdso/vdso32-setup.c | ||
260 | =================================================================== | ||
261 | --- head-2008-04-15.orig/arch/x86/vdso/vdso32-setup.c 2008-04-15 09:41:09.000000000 +0200 | ||
262 | +++ head-2008-04-15/arch/x86/vdso/vdso32-setup.c 2008-04-15 09:59:29.000000000 +0200 | ||
263 | @@ -26,6 +26,10 @@ | ||
264 | #include <asm/vdso.h> | ||
265 | #include <asm/proto.h> | ||
266 | |||
267 | +#ifdef CONFIG_XEN | ||
268 | +#include <xen/interface/callback.h> | ||
269 | +#endif | ||
270 | + | ||
271 | enum { | ||
272 | VDSO_DISABLED = 0, | ||
273 | VDSO_ENABLED = 1, | ||
274 | @@ -234,6 +238,7 @@ static inline void map_compat_vdso(int m | ||
275 | |||
276 | void enable_sep_cpu(void) | ||
277 | { | ||
278 | +#ifndef CONFIG_XEN | ||
279 | int cpu = get_cpu(); | ||
280 | struct tss_struct *tss = &per_cpu(init_tss, cpu); | ||
281 | |||
282 | @@ -248,6 +253,35 @@ void enable_sep_cpu(void) | ||
283 | wrmsr(MSR_IA32_SYSENTER_ESP, tss->x86_tss.sp1, 0); | ||
284 | wrmsr(MSR_IA32_SYSENTER_EIP, (unsigned long) ia32_sysenter_target, 0); | ||
285 | put_cpu(); | ||
286 | +#else | ||
287 | + extern asmlinkage void ia32pv_sysenter_target(void); | ||
288 | + static struct callback_register sysenter = { | ||
289 | + .type = CALLBACKTYPE_sysenter, | ||
290 | + .address = { __KERNEL_CS, (unsigned long)ia32pv_sysenter_target }, | ||
291 | + }; | ||
292 | + | ||
293 | + if (!boot_cpu_has(X86_FEATURE_SEP)) | ||
294 | + return; | ||
295 | + | ||
296 | + get_cpu(); | ||
297 | + | ||
298 | + if (xen_feature(XENFEAT_supervisor_mode_kernel)) | ||
299 | + sysenter.address.eip = (unsigned long)ia32_sysenter_target; | ||
300 | + | ||
301 | + switch (HYPERVISOR_callback_op(CALLBACKOP_register, &sysenter)) { | ||
302 | + case 0: | ||
303 | + break; | ||
304 | +#if CONFIG_XEN_COMPAT < 0x030200 | ||
305 | + case -ENOSYS: | ||
306 | + sysenter.type = CALLBACKTYPE_sysenter_deprecated; | ||
307 | + if (HYPERVISOR_callback_op(CALLBACKOP_register, &sysenter) == 0) | ||
308 | + break; | ||
309 | +#endif | ||
310 | + default: | ||
311 | + clear_bit(X86_FEATURE_SEP, boot_cpu_data.x86_capability); | ||
312 | + break; | ||
313 | + } | ||
314 | +#endif | ||
315 | } | ||
316 | |||
317 | static struct vm_area_struct gate_vma; | ||
318 | Index: head-2008-04-15/include/asm-x86/mach-default/mach_traps.h | ||
319 | =================================================================== | ||
320 | --- head-2008-04-15.orig/include/asm-x86/mach-default/mach_traps.h 2008-04-15 09:41:09.000000000 +0200 | ||
321 | +++ head-2008-04-15/include/asm-x86/mach-default/mach_traps.h 2008-04-15 09:59:29.000000000 +0200 | ||
322 | @@ -13,6 +13,18 @@ static inline void clear_mem_error(unsig | ||
323 | outb(reason, 0x61); | ||
324 | } | ||
325 | |||
326 | +static inline void clear_io_check_error(unsigned char reason) | ||
327 | +{ | ||
328 | + unsigned long i; | ||
329 | + | ||
330 | + reason = (reason & 0xf) | 8; | ||
331 | + outb(reason, 0x61); | ||
332 | + i = 2000; | ||
333 | + while (--i) udelay(1000); | ||
334 | + reason &= ~8; | ||
335 | + outb(reason, 0x61); | ||
336 | +} | ||
337 | + | ||
338 | static inline unsigned char get_nmi_reason(void) | ||
339 | { | ||
340 | return inb(0x61); |