]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/suse-2.6.27.25/patches.xen/xen3-patch-2.6.21
Updated xen patches taken from suse.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.xen / xen3-patch-2.6.21
1 From: www.kernel.org
2 Subject: Linux 2.6.21
3 Patch-mainline: 2.6.21
4
5 Automatically created from "patches.kernel.org/patch-2.6.21" by xen-port-patches.py
6
7 Acked-by: jbeulich@novell.com
8
9 --- sle11-2009-05-14.orig/arch/x86/Kconfig 2009-02-05 10:22:19.000000000 +0100
10 +++ sle11-2009-05-14/arch/x86/Kconfig 2009-03-04 11:25:55.000000000 +0100
11 @@ -50,13 +50,15 @@ config GENERIC_CMOS_UPDATE
12
13 config CLOCKSOURCE_WATCHDOG
14 def_bool y
15 + depends on !X86_XEN
16
17 config GENERIC_CLOCKEVENTS
18 def_bool y
19 + depends on !X86_XEN
20
21 config GENERIC_CLOCKEVENTS_BROADCAST
22 def_bool y
23 - depends on X86_64 || (X86_32 && X86_LOCAL_APIC)
24 + depends on X86_64 || (X86_32 && X86_LOCAL_APIC && !X86_XEN)
25
26 config LOCKDEP_SUPPORT
27 def_bool y
28 --- sle11-2009-05-14.orig/arch/x86/kernel/Makefile 2009-03-04 11:28:34.000000000 +0100
29 +++ sle11-2009-05-14/arch/x86/kernel/Makefile 2009-03-04 11:25:55.000000000 +0100
30 @@ -124,7 +124,7 @@ ifeq ($(CONFIG_X86_64),y)
31 pci-dma_64-$(CONFIG_XEN) += pci-dma_32.o
32 endif
33
34 -disabled-obj-$(CONFIG_XEN) := early-quirks.o i8253.o i8259_$(BITS).o reboot.o \
35 - smpboot_$(BITS).o tsc_$(BITS).o
36 +disabled-obj-$(CONFIG_XEN) := early-quirks.o hpet.o i8253.o i8259_$(BITS).o reboot.o \
37 + smpboot_$(BITS).o tsc_$(BITS).o tsc_sync.o
38 disabled-obj-$(CONFIG_XEN_UNPRIVILEGED_GUEST) += mpparse_64.o
39 %/head_$(BITS).o %/head_$(BITS).s: $(if $(CONFIG_XEN),EXTRA_AFLAGS,dummy) :=
40 --- sle11-2009-05-14.orig/arch/x86/kernel/apic_32-xen.c 2009-03-04 11:28:34.000000000 +0100
41 +++ sle11-2009-05-14/arch/x86/kernel/apic_32-xen.c 2009-03-04 11:25:55.000000000 +0100
42 @@ -25,6 +25,8 @@
43 #include <linux/kernel_stat.h>
44 #include <linux/sysdev.h>
45 #include <linux/cpu.h>
46 +#include <linux/clockchips.h>
47 +#include <linux/acpi_pmtmr.h>
48 #include <linux/module.h>
49
50 #include <asm/atomic.h>
51 @@ -56,83 +58,26 @@ static cpumask_t timer_bcast_ipi;
52 */
53
54 /*
55 - * Debug level
56 + * Debug level, exported for io_apic.c
57 */
58 int apic_verbosity;
59
60 #ifndef CONFIG_XEN
61 static int modern_apic(void)
62 {
63 - unsigned int lvr, version;
64 /* AMD systems use old APIC versions, so check the CPU */
65 if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
66 - boot_cpu_data.x86 >= 0xf)
67 + boot_cpu_data.x86 >= 0xf)
68 return 1;
69 - lvr = apic_read(APIC_LVR);
70 - version = GET_APIC_VERSION(lvr);
71 - return version >= 0x14;
72 + return lapic_get_version() >= 0x14;
73 }
74 #endif /* !CONFIG_XEN */
75
76 -/*
77 - * 'what should we do if we get a hw irq event on an illegal vector'.
78 - * each architecture has to answer this themselves.
79 - */
80 -void ack_bad_irq(unsigned int irq)
81 -{
82 - printk("unexpected IRQ trap at vector %02x\n", irq);
83 - /*
84 - * Currently unexpected vectors happen only on SMP and APIC.
85 - * We _must_ ack these because every local APIC has only N
86 - * irq slots per priority level, and a 'hanging, unacked' IRQ
87 - * holds up an irq slot - in excessive cases (when multiple
88 - * unexpected vectors occur) that might lock up the APIC
89 - * completely.
90 - * But only ack when the APIC is enabled -AK
91 - */
92 - if (cpu_has_apic)
93 - ack_APIC_irq();
94 -}
95 -
96 int get_physical_broadcast(void)
97 {
98 return 0xff;
99 }
100
101 -#ifndef CONFIG_XEN
102 -#ifndef CONFIG_SMP
103 -static void up_apic_timer_interrupt_call(void)
104 -{
105 - int cpu = smp_processor_id();
106 -
107 - /*
108 - * the NMI deadlock-detector uses this.
109 - */
110 - per_cpu(irq_stat, cpu).apic_timer_irqs++;
111 -
112 - smp_local_timer_interrupt();
113 -}
114 -#endif
115 -
116 -void smp_send_timer_broadcast_ipi(void)
117 -{
118 - cpumask_t mask;
119 -
120 - cpus_and(mask, cpu_online_map, timer_bcast_ipi);
121 - if (!cpus_empty(mask)) {
122 -#ifdef CONFIG_SMP
123 - send_IPI_mask(mask, LOCAL_TIMER_VECTOR);
124 -#else
125 - /*
126 - * We can directly call the apic timer interrupt handler
127 - * in UP case. Minus all irq related functions
128 - */
129 - up_apic_timer_interrupt_call();
130 -#endif
131 - }
132 -}
133 -#endif
134 -
135 int setup_profiling_timer(unsigned int multiplier)
136 {
137 return -EINVAL;
138 --- sle11-2009-05-14.orig/arch/x86/kernel/cpu/common-xen.c 2008-12-15 11:26:44.000000000 +0100
139 +++ sle11-2009-05-14/arch/x86/kernel/cpu/common-xen.c 2009-03-04 11:25:55.000000000 +0100
140 @@ -610,7 +610,7 @@ void __init early_cpu_init(void)
141 struct pt_regs * __devinit idle_regs(struct pt_regs *regs)
142 {
143 memset(regs, 0, sizeof(struct pt_regs));
144 - regs->xgs = __KERNEL_PDA;
145 + regs->xfs = __KERNEL_PDA;
146 return regs;
147 }
148
149 @@ -667,12 +667,12 @@ struct i386_pda boot_pda = {
150 .pcurrent = &init_task,
151 };
152
153 -static inline void set_kernel_gs(void)
154 +static inline void set_kernel_fs(void)
155 {
156 - /* Set %gs for this CPU's PDA. Memory clobber is to create a
157 + /* Set %fs for this CPU's PDA. Memory clobber is to create a
158 barrier with respect to any PDA operations, so the compiler
159 doesn't move any before here. */
160 - asm volatile ("mov %0, %%gs" : : "r" (__KERNEL_PDA) : "memory");
161 + asm volatile ("mov %0, %%fs" : : "r" (__KERNEL_PDA) : "memory");
162 }
163
164 /* Initialize the CPU's GDT and PDA. The boot CPU does this for
165 @@ -730,7 +730,7 @@ void __cpuinit cpu_set_gdt(int cpu)
166 }
167 BUG_ON(HYPERVISOR_set_gdt(frames, (cpu_gdt_descr->size + 1) / 8));
168
169 - set_kernel_gs();
170 + set_kernel_fs();
171 }
172
173 /* Common CPU init for both boot and secondary CPUs */
174 @@ -775,8 +775,8 @@ static void __cpuinit _cpu_init(int cpu,
175 __set_tss_desc(cpu, GDT_ENTRY_DOUBLEFAULT_TSS, &doublefault_tss);
176 #endif
177
178 - /* Clear %fs. */
179 - asm volatile ("mov %0, %%fs" : : "r" (0));
180 + /* Clear %gs. */
181 + asm volatile ("mov %0, %%gs" : : "r" (0));
182
183 /* Clear all 6 debug registers: */
184 set_debugreg(0, 0);
185 --- sle11-2009-05-14.orig/arch/x86/kernel/e820_32-xen.c 2008-12-15 11:26:44.000000000 +0100
186 +++ sle11-2009-05-14/arch/x86/kernel/e820_32-xen.c 2009-03-04 11:25:55.000000000 +0100
187 @@ -14,6 +14,7 @@
188 #include <asm/pgtable.h>
189 #include <asm/page.h>
190 #include <asm/e820.h>
191 +#include <asm/setup.h>
192 #include <xen/interface/memory.h>
193
194 #ifdef CONFIG_EFI
195 @@ -157,21 +158,22 @@ static struct resource standard_io_resou
196 .flags = IORESOURCE_BUSY | IORESOURCE_IO
197 } };
198
199 -static int romsignature(const unsigned char *x)
200 +#define ROMSIGNATURE 0xaa55
201 +
202 +static int __init romsignature(const unsigned char *rom)
203 {
204 unsigned short sig;
205 - int ret = 0;
206 - if (probe_kernel_address((const unsigned short *)x, sig) == 0)
207 - ret = (sig == 0xaa55);
208 - return ret;
209 +
210 + return probe_kernel_address((const unsigned short *)rom, sig) == 0 &&
211 + sig == ROMSIGNATURE;
212 }
213
214 static int __init romchecksum(unsigned char *rom, unsigned long length)
215 {
216 - unsigned char *p, sum = 0;
217 + unsigned char sum;
218
219 - for (p = rom; p < rom + length; p++)
220 - sum += *p;
221 + for (sum = 0; length; length--)
222 + sum += *rom++;
223 return sum == 0;
224 }
225
226 --- sle11-2009-05-14.orig/arch/x86/kernel/entry_32-xen.S 2009-05-14 11:08:06.000000000 +0200
227 +++ sle11-2009-05-14/arch/x86/kernel/entry_32-xen.S 2009-05-14 11:09:56.000000000 +0200
228 @@ -30,7 +30,7 @@
229 * 18(%esp) - %eax
230 * 1C(%esp) - %ds
231 * 20(%esp) - %es
232 - * 24(%esp) - %gs
233 + * 24(%esp) - %fs
234 * 28(%esp) - orig_eax
235 * 2C(%esp) - %eip
236 * 30(%esp) - %cs
237 @@ -102,9 +102,9 @@ NMI_MASK = 0x80000000
238
239 #define SAVE_ALL \
240 cld; \
241 - pushl %gs; \
242 + pushl %fs; \
243 CFI_ADJUST_CFA_OFFSET 4;\
244 - /*CFI_REL_OFFSET gs, 0;*/\
245 + /*CFI_REL_OFFSET fs, 0;*/\
246 pushl %es; \
247 CFI_ADJUST_CFA_OFFSET 4;\
248 /*CFI_REL_OFFSET es, 0;*/\
249 @@ -136,7 +136,7 @@ NMI_MASK = 0x80000000
250 movl %edx, %ds; \
251 movl %edx, %es; \
252 movl $(__KERNEL_PDA), %edx; \
253 - movl %edx, %gs
254 + movl %edx, %fs
255
256 #define RESTORE_INT_REGS \
257 popl %ebx; \
258 @@ -169,9 +169,9 @@ NMI_MASK = 0x80000000
259 2: popl %es; \
260 CFI_ADJUST_CFA_OFFSET -4;\
261 /*CFI_RESTORE es;*/\
262 -3: popl %gs; \
263 +3: popl %fs; \
264 CFI_ADJUST_CFA_OFFSET -4;\
265 - /*CFI_RESTORE gs;*/\
266 + /*CFI_RESTORE fs;*/\
267 .pushsection .fixup,"ax"; \
268 4: movl $0,(%esp); \
269 jmp 1b; \
270 @@ -230,6 +230,7 @@ ENTRY(ret_from_fork)
271 CFI_ADJUST_CFA_OFFSET -4
272 jmp syscall_exit
273 CFI_ENDPROC
274 +END(ret_from_fork)
275
276 /*
277 * Return to user mode is not as complex as all this looks,
278 @@ -261,6 +262,7 @@ ENTRY(resume_userspace)
279 # int/exception return?
280 jne work_pending
281 jmp restore_all
282 +END(ret_from_exception)
283
284 #ifdef CONFIG_PREEMPT
285 ENTRY(resume_kernel)
286 @@ -275,6 +277,7 @@ need_resched:
287 jz restore_all
288 call preempt_schedule_irq
289 jmp need_resched
290 +END(resume_kernel)
291 #endif
292 CFI_ENDPROC
293
294 @@ -352,16 +355,17 @@ sysenter_past_esp:
295 movl PT_OLDESP(%esp), %ecx
296 xorl %ebp,%ebp
297 TRACE_IRQS_ON
298 -1: mov PT_GS(%esp), %gs
299 +1: mov PT_FS(%esp), %fs
300 ENABLE_INTERRUPTS_SYSEXIT
301 CFI_ENDPROC
302 .pushsection .fixup,"ax"
303 -2: movl $0,PT_GS(%esp)
304 +2: movl $0,PT_FS(%esp)
305 jmp 1b
306 .section __ex_table,"a"
307 .align 4
308 .long 1b,2b
309 .popsection
310 +ENDPROC(sysenter_entry)
311
312 # pv sysenter call handler stub
313 ENTRY(sysenter_entry_pv)
314 @@ -533,6 +537,7 @@ hypervisor_iret:
315 jmp hypercall_page + (__HYPERVISOR_iret * 32)
316 #endif
317 CFI_ENDPROC
318 +ENDPROC(system_call)
319
320 # perform work that needs to be done immediately before resumption
321 ALIGN
322 @@ -578,6 +583,7 @@ work_notifysig_v86:
323 xorl %edx, %edx
324 call do_notify_resume
325 jmp resume_userspace_sig
326 +END(work_pending)
327
328 # perform syscall exit tracing
329 ALIGN
330 @@ -593,6 +599,7 @@ syscall_trace_entry:
331 cmpl $(nr_syscalls), %eax
332 jnae syscall_call
333 jmp syscall_exit
334 +END(syscall_trace_entry)
335
336 # perform syscall exit tracing
337 ALIGN
338 @@ -606,6 +613,7 @@ syscall_exit_work:
339 movl $1, %edx
340 call do_syscall_trace
341 jmp resume_userspace
342 +END(syscall_exit_work)
343 CFI_ENDPROC
344
345 RING0_INT_FRAME # can't unwind into user space anyway
346 @@ -616,16 +624,18 @@ syscall_fault:
347 GET_THREAD_INFO(%ebp)
348 movl $-EFAULT,PT_EAX(%esp)
349 jmp resume_userspace
350 +END(syscall_fault)
351
352 syscall_badsys:
353 movl $-ENOSYS,PT_EAX(%esp)
354 jmp resume_userspace
355 +END(syscall_badsys)
356 CFI_ENDPROC
357
358 #ifndef CONFIG_XEN
359 #define FIXUP_ESPFIX_STACK \
360 /* since we are on a wrong stack, we cant make it a C code :( */ \
361 - movl %gs:PDA_cpu, %ebx; \
362 + movl %fs:PDA_cpu, %ebx; \
363 PER_CPU(cpu_gdt_descr, %ebx); \
364 movl GDS_address(%ebx), %ebx; \
365 GET_DESC_BASE(GDT_ENTRY_ESPFIX_SS, %ebx, %eax, %ax, %al, %ah); \
366 @@ -656,9 +666,9 @@ syscall_badsys:
367 ENTRY(interrupt)
368 .text
369
370 -vector=0
371 ENTRY(irq_entries_start)
372 RING0_INT_FRAME
373 +vector=0
374 .rept NR_IRQS
375 ALIGN
376 .if vector
377 @@ -667,11 +677,16 @@ ENTRY(irq_entries_start)
378 1: pushl $~(vector)
379 CFI_ADJUST_CFA_OFFSET 4
380 jmp common_interrupt
381 -.data
382 + .previous
383 .long 1b
384 -.text
385 + .text
386 vector=vector+1
387 .endr
388 +END(irq_entries_start)
389 +
390 +.previous
391 +END(interrupt)
392 +.previous
393
394 /*
395 * the CPU automatically disables interrupts when executing an IRQ vector,
396 @@ -684,6 +699,7 @@ common_interrupt:
397 movl %esp,%eax
398 call do_IRQ
399 jmp ret_from_intr
400 +ENDPROC(common_interrupt)
401 CFI_ENDPROC
402
403 #define BUILD_INTERRUPT(name, nr) \
404 @@ -696,10 +712,16 @@ ENTRY(name) \
405 movl %esp,%eax; \
406 call smp_/**/name; \
407 jmp ret_from_intr; \
408 - CFI_ENDPROC
409 + CFI_ENDPROC; \
410 +ENDPROC(name)
411
412 /* The include is where all of the SMP etc. interrupts come from */
413 #include "entry_arch.h"
414 +
415 +/* This alternate entry is needed because we hijack the apic LVTT */
416 +#if defined(CONFIG_VMI) && defined(CONFIG_X86_LOCAL_APIC)
417 +BUILD_INTERRUPT(apic_vmi_timer_interrupt,LOCAL_TIMER_VECTOR)
418 +#endif
419 #else
420 #define UNWIND_ESPFIX_STACK
421 #endif
422 @@ -710,7 +732,7 @@ KPROBE_ENTRY(page_fault)
423 CFI_ADJUST_CFA_OFFSET 4
424 ALIGN
425 error_code:
426 - /* the function address is in %gs's slot on the stack */
427 + /* the function address is in %fs's slot on the stack */
428 pushl %es
429 CFI_ADJUST_CFA_OFFSET 4
430 /*CFI_REL_OFFSET es, 0*/
431 @@ -739,20 +761,20 @@ error_code:
432 CFI_ADJUST_CFA_OFFSET 4
433 CFI_REL_OFFSET ebx, 0
434 cld
435 - pushl %gs
436 + pushl %fs
437 CFI_ADJUST_CFA_OFFSET 4
438 - /*CFI_REL_OFFSET gs, 0*/
439 + /*CFI_REL_OFFSET fs, 0*/
440 movl $(__KERNEL_PDA), %ecx
441 - movl %ecx, %gs
442 + movl %ecx, %fs
443 UNWIND_ESPFIX_STACK
444 popl %ecx
445 CFI_ADJUST_CFA_OFFSET -4
446 /*CFI_REGISTER es, ecx*/
447 - movl PT_GS(%esp), %edi # get the function address
448 + movl PT_FS(%esp), %edi # get the function address
449 movl PT_ORIG_EAX(%esp), %edx # get the error code
450 movl $-1, PT_ORIG_EAX(%esp) # no syscall to restart
451 - mov %ecx, PT_GS(%esp)
452 - /*CFI_REL_OFFSET gs, ES*/
453 + mov %ecx, PT_FS(%esp)
454 + /*CFI_REL_OFFSET fs, ES*/
455 movl $(__USER_DS), %ecx
456 movl %ecx, %ds
457 movl %ecx, %es
458 @@ -844,7 +866,7 @@ critical_fixup_table:
459 .byte 6 # pop %eax
460 .byte 7 # pop %ds
461 .byte 8 # pop %es
462 - .byte 9,9 # pop %gs
463 + .byte 9,9 # pop %fs
464 .byte 10,10,10 # add $4,%esp
465 .byte 11 # iret
466 .byte -1,-1,-1,-1 # movb $1,1(%esi) = __DISABLE_INTERRUPTS
467 @@ -909,6 +931,7 @@ ENTRY(coprocessor_error)
468 CFI_ADJUST_CFA_OFFSET 4
469 jmp error_code
470 CFI_ENDPROC
471 +END(coprocessor_error)
472
473 ENTRY(simd_coprocessor_error)
474 RING0_INT_FRAME
475 @@ -918,6 +941,7 @@ ENTRY(simd_coprocessor_error)
476 CFI_ADJUST_CFA_OFFSET 4
477 jmp error_code
478 CFI_ENDPROC
479 +END(simd_coprocessor_error)
480
481 ENTRY(device_not_available)
482 RING0_INT_FRAME
483 @@ -940,6 +964,7 @@ device_available_emulate:
484 call math_state_restore
485 jmp ret_from_exception
486 CFI_ENDPROC
487 +END(device_not_available)
488
489 #ifndef CONFIG_XEN
490 /*
491 @@ -1101,10 +1126,12 @@ ENTRY(native_iret)
492 .align 4
493 .long 1b,iret_exc
494 .previous
495 +END(native_iret)
496
497 ENTRY(native_irq_enable_sysexit)
498 sti
499 sysexit
500 +END(native_irq_enable_sysexit)
501 #endif
502
503 KPROBE_ENTRY(int3)
504 @@ -1127,6 +1154,7 @@ ENTRY(overflow)
505 CFI_ADJUST_CFA_OFFSET 4
506 jmp error_code
507 CFI_ENDPROC
508 +END(overflow)
509
510 ENTRY(bounds)
511 RING0_INT_FRAME
512 @@ -1136,6 +1164,7 @@ ENTRY(bounds)
513 CFI_ADJUST_CFA_OFFSET 4
514 jmp error_code
515 CFI_ENDPROC
516 +END(bounds)
517
518 ENTRY(invalid_op)
519 RING0_INT_FRAME
520 @@ -1145,6 +1174,7 @@ ENTRY(invalid_op)
521 CFI_ADJUST_CFA_OFFSET 4
522 jmp error_code
523 CFI_ENDPROC
524 +END(invalid_op)
525
526 ENTRY(coprocessor_segment_overrun)
527 RING0_INT_FRAME
528 @@ -1154,6 +1184,7 @@ ENTRY(coprocessor_segment_overrun)
529 CFI_ADJUST_CFA_OFFSET 4
530 jmp error_code
531 CFI_ENDPROC
532 +END(coprocessor_segment_overrun)
533
534 ENTRY(invalid_TSS)
535 RING0_EC_FRAME
536 @@ -1161,6 +1192,7 @@ ENTRY(invalid_TSS)
537 CFI_ADJUST_CFA_OFFSET 4
538 jmp error_code
539 CFI_ENDPROC
540 +END(invalid_TSS)
541
542 ENTRY(segment_not_present)
543 RING0_EC_FRAME
544 @@ -1168,6 +1200,7 @@ ENTRY(segment_not_present)
545 CFI_ADJUST_CFA_OFFSET 4
546 jmp error_code
547 CFI_ENDPROC
548 +END(segment_not_present)
549
550 ENTRY(stack_segment)
551 RING0_EC_FRAME
552 @@ -1175,6 +1208,7 @@ ENTRY(stack_segment)
553 CFI_ADJUST_CFA_OFFSET 4
554 jmp error_code
555 CFI_ENDPROC
556 +END(stack_segment)
557
558 KPROBE_ENTRY(general_protection)
559 RING0_EC_FRAME
560 @@ -1190,6 +1224,7 @@ ENTRY(alignment_check)
561 CFI_ADJUST_CFA_OFFSET 4
562 jmp error_code
563 CFI_ENDPROC
564 +END(alignment_check)
565
566 ENTRY(divide_error)
567 RING0_INT_FRAME
568 @@ -1199,6 +1234,7 @@ ENTRY(divide_error)
569 CFI_ADJUST_CFA_OFFSET 4
570 jmp error_code
571 CFI_ENDPROC
572 +END(divide_error)
573
574 #ifdef CONFIG_X86_MCE
575 ENTRY(machine_check)
576 @@ -1209,6 +1245,7 @@ ENTRY(machine_check)
577 CFI_ADJUST_CFA_OFFSET 4
578 jmp error_code
579 CFI_ENDPROC
580 +END(machine_check)
581 #endif
582
583 #ifndef CONFIG_XEN
584 @@ -1228,6 +1265,7 @@ ENTRY(fixup_4gb_segment)
585 CFI_ADJUST_CFA_OFFSET 4
586 jmp error_code
587 CFI_ENDPROC
588 +END(spurious_interrupt_bug)
589
590 ENTRY(kernel_thread_helper)
591 pushl $0 # fake return address for unwinder
592 --- sle11-2009-05-14.orig/arch/x86/kernel/head_32-xen.S 2008-12-15 11:26:44.000000000 +0100
593 +++ sle11-2009-05-14/arch/x86/kernel/head_32-xen.S 2009-03-04 11:25:55.000000000 +0100
594 @@ -27,6 +27,7 @@
595 #define X86_CAPABILITY new_cpu_data+CPUINFO_x86_capability
596 #define X86_VENDOR_ID new_cpu_data+CPUINFO_x86_vendor_id
597
598 +.section .text.head,"ax",@progbits
599 #define VIRT_ENTRY_OFFSET 0x0
600 .org VIRT_ENTRY_OFFSET
601 ENTRY(startup_32)
602 @@ -60,11 +61,11 @@ ENTRY(startup_32)
603
604 movb $1,X86_HARD_MATH
605
606 - xorl %eax,%eax # Clear FS
607 - movl %eax,%fs
608 + xorl %eax,%eax # Clear GS
609 + movl %eax,%gs
610
611 movl $(__KERNEL_PDA),%eax
612 - mov %eax,%gs
613 + mov %eax,%fs
614
615 cld # gcc2 wants the direction flag cleared at all times
616
617 @@ -75,7 +76,7 @@ ENTRY(startup_32)
618 * Point the GDT at this CPU's PDA. This will be
619 * cpu_gdt_table and boot_pda.
620 */
621 -setup_pda:
622 +ENTRY(setup_pda)
623 /* get the PDA pointer */
624 movl $boot_pda, %eax
625
626 --- sle11-2009-05-14.orig/arch/x86/kernel/io_apic_32-xen.c 2008-12-15 11:26:44.000000000 +0100
627 +++ sle11-2009-05-14/arch/x86/kernel/io_apic_32-xen.c 2009-03-04 11:25:55.000000000 +0100
628 @@ -167,7 +167,7 @@ static inline void io_apic_write(unsigne
629 */
630 static inline void io_apic_modify(unsigned int apic, unsigned int reg, unsigned int value)
631 {
632 - volatile struct io_apic *io_apic = io_apic_base(apic);
633 + volatile struct io_apic __iomem *io_apic = io_apic_base(apic);
634 if (sis_apic_bug)
635 writel(reg, &io_apic->index);
636 writel(value, &io_apic->data);
637 @@ -392,7 +392,7 @@ static void set_ioapic_affinity_irq(unsi
638 break;
639 entry = irq_2_pin + entry->next;
640 }
641 - set_native_irq_info(irq, cpumask);
642 + irq_desc[irq].affinity = cpumask;
643 spin_unlock_irqrestore(&ioapic_lock, flags);
644 }
645
646 @@ -531,8 +531,8 @@ static void do_irq_balance(void)
647 package_index = CPU_TO_PACKAGEINDEX(i);
648 for (j = 0; j < NR_IRQS; j++) {
649 unsigned long value_now, delta;
650 - /* Is this an active IRQ? */
651 - if (!irq_desc[j].action)
652 + /* Is this an active IRQ or balancing disabled ? */
653 + if (!irq_desc[j].action || irq_balancing_disabled(j))
654 continue;
655 if ( package_index == i )
656 IRQ_DELTA(package_index,j) = 0;
657 @@ -785,7 +785,7 @@ failed:
658 return 0;
659 }
660
661 -int __init irqbalance_disable(char *str)
662 +int __devinit irqbalance_disable(char *str)
663 {
664 irqbalance_disabled = 1;
665 return 1;
666 @@ -1329,11 +1329,9 @@ static void ioapic_register_intr(int irq
667 trigger == IOAPIC_LEVEL)
668 set_irq_chip_and_handler_name(irq, &ioapic_chip,
669 handle_fasteoi_irq, "fasteoi");
670 - else {
671 - irq_desc[irq].status |= IRQ_DELAYED_DISABLE;
672 + else
673 set_irq_chip_and_handler_name(irq, &ioapic_chip,
674 handle_edge_irq, "edge");
675 - }
676 set_intr_gate(vector, interrupt[irq]);
677 }
678 #else
679 @@ -1407,7 +1405,6 @@ static void __init setup_IO_APIC_irqs(vo
680 }
681 spin_lock_irqsave(&ioapic_lock, flags);
682 __ioapic_write_entry(apic, pin, entry);
683 - set_native_irq_info(irq, TARGET_CPUS);
684 spin_unlock_irqrestore(&ioapic_lock, flags);
685 }
686 }
687 @@ -1638,7 +1635,7 @@ void /*__init*/ print_local_APIC(void *
688 v = apic_read(APIC_LVR);
689 printk(KERN_INFO "... APIC VERSION: %08x\n", v);
690 ver = GET_APIC_VERSION(v);
691 - maxlvt = get_maxlvt();
692 + maxlvt = lapic_get_maxlvt();
693
694 v = apic_read(APIC_TASKPRI);
695 printk(KERN_DEBUG "... APIC TASKPRI: %08x (%02x)\n", v, v & APIC_TPRI_MASK);
696 @@ -1976,7 +1973,7 @@ static void __init setup_ioapic_ids_from
697 #endif
698
699 #ifndef CONFIG_XEN
700 -static int no_timer_check __initdata;
701 +int no_timer_check __initdata;
702
703 static int __init notimercheck(char *s)
704 {
705 @@ -2369,7 +2366,7 @@ static inline void __init check_timer(vo
706
707 disable_8259A_irq(0);
708 set_irq_chip_and_handler_name(0, &lapic_chip, handle_fasteoi_irq,
709 - "fasteio");
710 + "fasteoi");
711 apic_write_around(APIC_LVT0, APIC_DM_FIXED | vector); /* Fixed mode */
712 enable_8259A_irq(0);
713
714 @@ -2662,7 +2659,7 @@ static void set_msi_irq_affinity(unsigne
715 msg.address_lo |= MSI_ADDR_DEST_ID(dest);
716
717 write_msi_msg(irq, &msg);
718 - set_native_irq_info(irq, mask);
719 + irq_desc[irq].affinity = mask;
720 }
721 #endif /* CONFIG_SMP */
722
723 @@ -2681,25 +2678,32 @@ static struct irq_chip msi_chip = {
724 .retrigger = ioapic_retrigger_irq,
725 };
726
727 -int arch_setup_msi_irq(unsigned int irq, struct pci_dev *dev)
728 +int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
729 {
730 struct msi_msg msg;
731 - int ret;
732 + int irq, ret;
733 + irq = create_irq();
734 + if (irq < 0)
735 + return irq;
736 +
737 + set_irq_msi(irq, desc);
738 ret = msi_compose_msg(dev, irq, &msg);
739 - if (ret < 0)
740 + if (ret < 0) {
741 + destroy_irq(irq);
742 return ret;
743 + }
744
745 write_msi_msg(irq, &msg);
746
747 set_irq_chip_and_handler_name(irq, &msi_chip, handle_edge_irq,
748 "edge");
749
750 - return 0;
751 + return irq;
752 }
753
754 void arch_teardown_msi_irq(unsigned int irq)
755 {
756 - return;
757 + destroy_irq(irq);
758 }
759
760 #endif /* CONFIG_PCI_MSI */
761 @@ -2739,7 +2743,7 @@ static void set_ht_irq_affinity(unsigned
762 dest = cpu_mask_to_apicid(mask);
763
764 target_ht_irq(irq, dest);
765 - set_native_irq_info(irq, mask);
766 + irq_desc[irq].affinity = mask;
767 }
768 #endif
769
770 @@ -2947,7 +2951,6 @@ int io_apic_set_pci_routing (int ioapic,
771
772 spin_lock_irqsave(&ioapic_lock, flags);
773 __ioapic_write_entry(ioapic, pin, entry);
774 - set_native_irq_info(irq, TARGET_CPUS);
775 spin_unlock_irqrestore(&ioapic_lock, flags);
776
777 return 0;
778 --- sle11-2009-05-14.orig/arch/x86/kernel/irq_32-xen.c 2009-03-04 11:28:34.000000000 +0100
779 +++ sle11-2009-05-14/arch/x86/kernel/irq_32-xen.c 2009-03-04 11:25:55.000000000 +0100
780 @@ -10,7 +10,6 @@
781 * io_apic.c.)
782 */
783
784 -#include <asm/uaccess.h>
785 #include <linux/module.h>
786 #include <linux/seq_file.h>
787 #include <linux/interrupt.h>
788 @@ -19,19 +18,34 @@
789 #include <linux/cpu.h>
790 #include <linux/delay.h>
791
792 +#include <asm/apic.h>
793 +#include <asm/uaccess.h>
794 +
795 DEFINE_PER_CPU(irq_cpustat_t, irq_stat) ____cacheline_internodealigned_in_smp;
796 EXPORT_PER_CPU_SYMBOL(irq_stat);
797
798 -#ifndef CONFIG_X86_LOCAL_APIC
799 /*
800 * 'what should we do if we get a hw irq event on an illegal vector'.
801 * each architecture has to answer this themselves.
802 */
803 void ack_bad_irq(unsigned int irq)
804 {
805 - printk("unexpected IRQ trap at vector %02x\n", irq);
806 -}
807 + printk(KERN_ERR "unexpected IRQ trap at vector %02x\n", irq);
808 +
809 +#if defined(CONFIG_X86_LOCAL_APIC) && !defined(CONFIG_XEN)
810 + /*
811 + * Currently unexpected vectors happen only on SMP and APIC.
812 + * We _must_ ack these because every local APIC has only N
813 + * irq slots per priority level, and a 'hanging, unacked' IRQ
814 + * holds up an irq slot - in excessive cases (when multiple
815 + * unexpected vectors occur) that might lock up the APIC
816 + * completely.
817 + * But only ack when the APIC is enabled -AK
818 + */
819 + if (cpu_has_apic)
820 + ack_APIC_irq();
821 #endif
822 +}
823
824 #ifdef CONFIG_4KSTACKS
825 /*
826 --- sle11-2009-05-14.orig/arch/x86/kernel/microcode-xen.c 2008-12-15 11:26:44.000000000 +0100
827 +++ sle11-2009-05-14/arch/x86/kernel/microcode-xen.c 2009-03-04 11:25:55.000000000 +0100
828 @@ -108,7 +108,7 @@ static ssize_t microcode_write (struct f
829 return ret;
830 }
831
832 -static struct file_operations microcode_fops = {
833 +static const struct file_operations microcode_fops = {
834 .owner = THIS_MODULE,
835 .write = microcode_write,
836 .open = microcode_open,
837 --- sle11-2009-05-14.orig/arch/x86/kernel/mpparse_32-xen.c 2008-12-15 11:26:44.000000000 +0100
838 +++ sle11-2009-05-14/arch/x86/kernel/mpparse_32-xen.c 2009-03-04 11:25:55.000000000 +0100
839 @@ -1079,7 +1079,7 @@ int mp_register_gsi(u32 gsi, int trigger
840 static int gsi_to_irq[MAX_GSI_NUM];
841
842 /* Don't set up the ACPI SCI because it's already set up */
843 - if (acpi_fadt.sci_int == gsi)
844 + if (acpi_gbl_FADT.sci_interrupt == gsi)
845 return gsi;
846
847 ioapic = mp_find_ioapic(gsi);
848 @@ -1136,7 +1136,7 @@ int mp_register_gsi(u32 gsi, int trigger
849 /*
850 * Don't assign IRQ used by ACPI SCI
851 */
852 - if (gsi == acpi_fadt.sci_int)
853 + if (gsi == acpi_gbl_FADT.sci_interrupt)
854 gsi = pci_irq++;
855 gsi_to_irq[irq] = gsi;
856 } else {
857 --- sle11-2009-05-14.orig/arch/x86/kernel/pci-dma-xen.c 2008-12-15 11:26:44.000000000 +0100
858 +++ sle11-2009-05-14/arch/x86/kernel/pci-dma-xen.c 2009-03-04 11:25:55.000000000 +0100
859 @@ -311,7 +311,7 @@ int dma_declare_coherent_memory(struct d
860 return DMA_MEMORY_IO;
861
862 free1_out:
863 - kfree(dev->dma_mem->bitmap);
864 + kfree(dev->dma_mem);
865 out:
866 if (mem_base)
867 iounmap(mem_base);
868 --- sle11-2009-05-14.orig/arch/x86/kernel/pcspeaker.c 2009-05-14 10:56:29.000000000 +0200
869 +++ sle11-2009-05-14/arch/x86/kernel/pcspeaker.c 2009-03-04 11:25:55.000000000 +0100
870 @@ -7,6 +7,11 @@ static __init int add_pcspkr(void)
871 struct platform_device *pd;
872 int ret;
873
874 +#ifdef CONFIG_XEN
875 + if (!is_initial_xendomain())
876 + return 0;
877 +#endif
878 +
879 pd = platform_device_alloc("pcspkr", -1);
880 if (!pd)
881 return -ENOMEM;
882 --- sle11-2009-05-14.orig/arch/x86/kernel/process_32-xen.c 2008-12-15 11:26:44.000000000 +0100
883 +++ sle11-2009-05-14/arch/x86/kernel/process_32-xen.c 2009-03-04 11:25:55.000000000 +0100
884 @@ -38,6 +38,7 @@
885 #include <linux/ptrace.h>
886 #include <linux/random.h>
887 #include <linux/personality.h>
888 +#include <linux/tick.h>
889
890 #include <asm/uaccess.h>
891 #include <asm/pgtable.h>
892 @@ -160,6 +161,7 @@ void cpu_idle(void)
893
894 /* endless idle loop with no priority at all */
895 while (1) {
896 + tick_nohz_stop_sched_tick();
897 while (!need_resched()) {
898 void (*idle)(void);
899
900 @@ -175,6 +177,7 @@ void cpu_idle(void)
901 __get_cpu_var(irq_stat).idle_timestamp = jiffies;
902 idle();
903 }
904 + tick_nohz_restart_sched_tick();
905 preempt_enable_no_resched();
906 schedule();
907 preempt_disable();
908 @@ -247,8 +250,8 @@ void show_regs(struct pt_regs * regs)
909 regs->eax,regs->ebx,regs->ecx,regs->edx);
910 printk("ESI: %08lx EDI: %08lx EBP: %08lx",
911 regs->esi, regs->edi, regs->ebp);
912 - printk(" DS: %04x ES: %04x GS: %04x\n",
913 - 0xffff & regs->xds,0xffff & regs->xes, 0xffff & regs->xgs);
914 + printk(" DS: %04x ES: %04x FS: %04x\n",
915 + 0xffff & regs->xds,0xffff & regs->xes, 0xffff & regs->xfs);
916
917 cr0 = read_cr0();
918 cr2 = read_cr2();
919 @@ -279,7 +282,7 @@ int kernel_thread(int (*fn)(void *), voi
920
921 regs.xds = __USER_DS;
922 regs.xes = __USER_DS;
923 - regs.xgs = __KERNEL_PDA;
924 + regs.xfs = __KERNEL_PDA;
925 regs.orig_eax = -1;
926 regs.eip = (unsigned long) kernel_thread_helper;
927 regs.xcs = __KERNEL_CS | get_kernel_rpl();
928 @@ -356,7 +359,7 @@ int copy_thread(int nr, unsigned long cl
929
930 p->thread.eip = (unsigned long) ret_from_fork;
931
932 - savesegment(fs,p->thread.fs);
933 + savesegment(gs,p->thread.gs);
934
935 tsk = current;
936 if (unlikely(test_tsk_thread_flag(tsk, TIF_IO_BITMAP))) {
937 @@ -434,8 +437,8 @@ void dump_thread(struct pt_regs * regs,
938 dump->regs.eax = regs->eax;
939 dump->regs.ds = regs->xds;
940 dump->regs.es = regs->xes;
941 - savesegment(fs,dump->regs.fs);
942 - dump->regs.gs = regs->xgs;
943 + dump->regs.fs = regs->xfs;
944 + savesegment(gs,dump->regs.gs);
945 dump->regs.orig_eax = regs->orig_eax;
946 dump->regs.eip = regs->eip;
947 dump->regs.cs = regs->xcs;
948 @@ -637,16 +640,6 @@ struct task_struct fastcall * __switch_t
949 prefetch(&next->i387.fxsave);
950
951 /*
952 - * Restore %fs if needed.
953 - *
954 - * Glibc normally makes %fs be zero.
955 - */
956 - if (unlikely(next->fs))
957 - loadsegment(fs, next->fs);
958 -
959 - write_pda(pcurrent, next_p);
960 -
961 - /*
962 * Now maybe handle debug registers
963 */
964 if (unlikely(task_thread_info(next_p)->flags & _TIF_WORK_CTXSW))
965 @@ -654,6 +647,15 @@ struct task_struct fastcall * __switch_t
966
967 disable_tsc(prev_p, next_p);
968
969 + /*
970 + * Leave lazy mode, flushing any hypercalls made here.
971 + * This must be done before restoring TLS segments so
972 + * the GDT and LDT are properly updated, and must be
973 + * done before math_state_restore, so the TS bit is up
974 + * to date.
975 + */
976 + arch_leave_lazy_cpu_mode();
977 +
978 /* If the task has used fpu the last 5 timeslices, just do a full
979 * restore of the math state immediately to avoid the trap; the
980 * chances of needing FPU soon are obviously high now
981 @@ -661,6 +663,14 @@ struct task_struct fastcall * __switch_t
982 if (next_p->fpu_counter > 5)
983 math_state_restore();
984
985 + /*
986 + * Restore %gs if needed (which is common)
987 + */
988 + if (prev->gs | next->gs)
989 + loadsegment(gs, next->gs);
990 +
991 + write_pda(pcurrent, next_p);
992 +
993 return prev_p;
994 }
995
996 --- sle11-2009-05-14.orig/arch/x86/kernel/setup_32-xen.c 2008-12-15 11:26:44.000000000 +0100
997 +++ sle11-2009-05-14/arch/x86/kernel/setup_32-xen.c 2009-03-04 11:25:55.000000000 +0100
998 @@ -33,7 +33,6 @@
999 #include <linux/initrd.h>
1000 #include <linux/bootmem.h>
1001 #include <linux/seq_file.h>
1002 -#include <linux/platform_device.h>
1003 #include <linux/console.h>
1004 #include <linux/mca.h>
1005 #include <linux/root_dev.h>
1006 @@ -148,7 +147,7 @@ unsigned long saved_videomode;
1007 #define RAMDISK_PROMPT_FLAG 0x8000
1008 #define RAMDISK_LOAD_FLAG 0x4000
1009
1010 -static char command_line[COMMAND_LINE_SIZE];
1011 +static char __initdata command_line[COMMAND_LINE_SIZE];
1012
1013 unsigned char __initdata boot_params[PARAM_SIZE];
1014
1015 @@ -647,8 +646,8 @@ void __init setup_arch(char **cmdline_p)
1016
1017 if ((i = MAX_GUEST_CMDLINE) > COMMAND_LINE_SIZE)
1018 i = COMMAND_LINE_SIZE;
1019 - memcpy(saved_command_line, xen_start_info->cmd_line, i);
1020 - saved_command_line[i - 1] = '\0';
1021 + memcpy(boot_command_line, xen_start_info->cmd_line, i);
1022 + boot_command_line[i - 1] = '\0';
1023 parse_early_param();
1024
1025 if (user_defined_memmap) {
1026 @@ -656,11 +655,19 @@ void __init setup_arch(char **cmdline_p)
1027 print_memory_map("user");
1028 }
1029
1030 - strlcpy(command_line, saved_command_line, COMMAND_LINE_SIZE);
1031 + strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
1032 *cmdline_p = command_line;
1033
1034 max_low_pfn = setup_memory();
1035
1036 +#ifdef CONFIG_VMI
1037 + /*
1038 + * Must be after max_low_pfn is determined, and before kernel
1039 + * pagetables are setup.
1040 + */
1041 + vmi_init();
1042 +#endif
1043 +
1044 /*
1045 * NOTE: before this point _nobody_ is allowed to allocate
1046 * any memory using the bootmem allocator. Although the
1047 @@ -823,7 +830,6 @@ void __init setup_arch(char **cmdline_p)
1048 conswitchp = &dummy_con;
1049 #endif
1050 }
1051 - tsc_init();
1052 }
1053
1054 static int
1055 @@ -833,31 +839,3 @@ xen_panic_event(struct notifier_block *t
1056 /* we're never actually going to get here... */
1057 return NOTIFY_DONE;
1058 }
1059 -
1060 -static __init int add_pcspkr(void)
1061 -{
1062 - struct platform_device *pd;
1063 - int ret;
1064 -
1065 - if (!is_initial_xendomain())
1066 - return 0;
1067 -
1068 - pd = platform_device_alloc("pcspkr", -1);
1069 - if (!pd)
1070 - return -ENOMEM;
1071 -
1072 - ret = platform_device_add(pd);
1073 - if (ret)
1074 - platform_device_put(pd);
1075 -
1076 - return ret;
1077 -}
1078 -device_initcall(add_pcspkr);
1079 -
1080 -/*
1081 - * Local Variables:
1082 - * mode:c
1083 - * c-file-style:"k&r"
1084 - * c-basic-offset:8
1085 - * End:
1086 - */
1087 --- sle11-2009-05-14.orig/arch/x86/kernel/smp_32-xen.c 2008-12-15 11:26:44.000000000 +0100
1088 +++ sle11-2009-05-14/arch/x86/kernel/smp_32-xen.c 2009-03-04 11:25:55.000000000 +0100
1089 @@ -335,8 +335,7 @@ static void flush_tlb_others(cpumask_t c
1090 /*
1091 * i'm not happy about this global shared spinlock in the
1092 * MM hot path, but we'll see how contended it is.
1093 - * Temporarily this turns IRQs off, so that lockups are
1094 - * detected by the NMI watchdog.
1095 + * AK: x86-64 has a faster method that could be ported.
1096 */
1097 spin_lock(&tlbstate_lock);
1098
1099 @@ -361,7 +360,7 @@ static void flush_tlb_others(cpumask_t c
1100
1101 while (!cpus_empty(flush_cpumask))
1102 /* nothing. lockup detection does not belong here */
1103 - mb();
1104 + cpu_relax();
1105
1106 flush_mm = NULL;
1107 flush_va = 0;
1108 --- sle11-2009-05-14.orig/arch/x86/kernel/time_32-xen.c 2009-03-24 10:08:30.000000000 +0100
1109 +++ sle11-2009-05-14/arch/x86/kernel/time_32-xen.c 2009-03-24 10:11:08.000000000 +0100
1110 @@ -51,6 +51,7 @@
1111 #include <linux/kernel_stat.h>
1112 #include <linux/posix-timers.h>
1113 #include <linux/cpufreq.h>
1114 +#include <linux/clocksource.h>
1115
1116 #include <asm/io.h>
1117 #include <asm/smp.h>
1118 @@ -75,25 +76,17 @@
1119 #include <xen/evtchn.h>
1120 #include <xen/interface/vcpu.h>
1121
1122 -#if defined (__i386__)
1123 -#include <asm/i8259.h>
1124 +#ifdef CONFIG_X86_32
1125 #include <asm/i8253.h>
1126 DEFINE_SPINLOCK(i8253_lock);
1127 EXPORT_SYMBOL(i8253_lock);
1128 -#endif
1129 -
1130 -#define XEN_SHIFT 22
1131 -
1132 int pit_latch_buggy; /* extern */
1133 -
1134 -#if defined(__x86_64__)
1135 -unsigned long vxtime_hz = PIT_TICK_RATE;
1136 -struct vxtime_data __vxtime __section_vxtime; /* for vsyscalls */
1137 +#else
1138 volatile unsigned long __jiffies __section_jiffies = INITIAL_JIFFIES;
1139 -struct timespec __xtime __section_xtime;
1140 -struct timezone __sys_tz __section_sys_tz;
1141 #endif
1142
1143 +#define XEN_SHIFT 22
1144 +
1145 unsigned int cpu_khz; /* Detected as we calibrate the TSC */
1146 EXPORT_SYMBOL(cpu_khz);
1147
1148 @@ -113,9 +106,6 @@ static DEFINE_PER_CPU(struct shadow_time
1149 static struct timespec shadow_tv;
1150 static u32 shadow_tv_version;
1151
1152 -static struct timeval monotonic_tv;
1153 -static spinlock_t monotonic_lock = SPIN_LOCK_UNLOCKED;
1154 -
1155 /* Keep track of last time we did processing/updating of jiffies and xtime. */
1156 static u64 processed_system_time; /* System time (ns) at last processing. */
1157 static DEFINE_PER_CPU(u64, processed_system_time);
1158 @@ -228,7 +218,7 @@ static inline u64 scale_delta(u64 delta,
1159 return product;
1160 }
1161
1162 -void init_cpu_khz(void)
1163 +static void init_cpu_khz(void)
1164 {
1165 u64 __cpu_khz = 1000000ULL << 32;
1166 struct vcpu_time_info *info = &vcpu_info(0)->time;
1167 @@ -247,16 +237,6 @@ static u64 get_nsec_offset(struct shadow
1168 return scale_delta(delta, shadow->tsc_to_nsec_mul, shadow->tsc_shift);
1169 }
1170
1171 -#ifdef CONFIG_X86_64
1172 -static unsigned long get_usec_offset(struct shadow_time_info *shadow)
1173 -{
1174 - u64 now, delta;
1175 - rdtscll(now);
1176 - delta = now - shadow->tsc_timestamp;
1177 - return scale_delta(delta, shadow->tsc_to_usec_mul, shadow->tsc_shift);
1178 -}
1179 -#endif
1180 -
1181 static void __update_wallclock(time_t sec, long nsec)
1182 {
1183 long wtm_nsec, xtime_nsec;
1184 @@ -369,139 +349,6 @@ void rtc_cmos_write(unsigned char val, u
1185 }
1186 EXPORT_SYMBOL(rtc_cmos_write);
1187
1188 -#ifdef CONFIG_X86_64
1189 -
1190 -/*
1191 - * This version of gettimeofday has microsecond resolution
1192 - * and better than microsecond precision on fast x86 machines with TSC.
1193 - */
1194 -void do_gettimeofday(struct timeval *tv)
1195 -{
1196 - unsigned long seq;
1197 - unsigned long usec, sec;
1198 - unsigned long flags;
1199 - s64 nsec;
1200 - unsigned int cpu;
1201 - struct shadow_time_info *shadow;
1202 - u32 local_time_version;
1203 -
1204 - cpu = get_cpu();
1205 - shadow = &per_cpu(shadow_time, cpu);
1206 -
1207 - do {
1208 - local_time_version = shadow->version;
1209 - seq = read_seqbegin(&xtime_lock);
1210 -
1211 - usec = get_usec_offset(shadow);
1212 -
1213 - sec = xtime.tv_sec;
1214 - usec += (xtime.tv_nsec / NSEC_PER_USEC);
1215 -
1216 - nsec = shadow->system_timestamp - processed_system_time;
1217 - __normalize_time(&sec, &nsec);
1218 - usec += (long)nsec / NSEC_PER_USEC;
1219 -
1220 - if (unlikely(!time_values_up_to_date(cpu))) {
1221 - /*
1222 - * We may have blocked for a long time,
1223 - * rendering our calculations invalid
1224 - * (e.g. the time delta may have
1225 - * overflowed). Detect that and recalculate
1226 - * with fresh values.
1227 - */
1228 - get_time_values_from_xen(cpu);
1229 - continue;
1230 - }
1231 - } while (read_seqretry(&xtime_lock, seq) ||
1232 - (local_time_version != shadow->version));
1233 -
1234 - put_cpu();
1235 -
1236 - while (usec >= USEC_PER_SEC) {
1237 - usec -= USEC_PER_SEC;
1238 - sec++;
1239 - }
1240 -
1241 - spin_lock_irqsave(&monotonic_lock, flags);
1242 - if ((sec > monotonic_tv.tv_sec) ||
1243 - ((sec == monotonic_tv.tv_sec) && (usec > monotonic_tv.tv_usec)))
1244 - {
1245 - monotonic_tv.tv_sec = sec;
1246 - monotonic_tv.tv_usec = usec;
1247 - } else {
1248 - sec = monotonic_tv.tv_sec;
1249 - usec = monotonic_tv.tv_usec;
1250 - }
1251 - spin_unlock_irqrestore(&monotonic_lock, flags);
1252 -
1253 - tv->tv_sec = sec;
1254 - tv->tv_usec = usec;
1255 -}
1256 -
1257 -EXPORT_SYMBOL(do_gettimeofday);
1258 -
1259 -int do_settimeofday(struct timespec *tv)
1260 -{
1261 - time_t sec;
1262 - s64 nsec;
1263 - unsigned int cpu;
1264 - struct shadow_time_info *shadow;
1265 - struct xen_platform_op op;
1266 -
1267 - if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
1268 - return -EINVAL;
1269 -
1270 - cpu = get_cpu();
1271 - shadow = &per_cpu(shadow_time, cpu);
1272 -
1273 - write_seqlock_irq(&xtime_lock);
1274 -
1275 - /*
1276 - * Ensure we don't get blocked for a long time so that our time delta
1277 - * overflows. If that were to happen then our shadow time values would
1278 - * be stale, so we can retry with fresh ones.
1279 - */
1280 - for (;;) {
1281 - nsec = tv->tv_nsec - get_nsec_offset(shadow);
1282 - if (time_values_up_to_date(cpu))
1283 - break;
1284 - get_time_values_from_xen(cpu);
1285 - }
1286 - sec = tv->tv_sec;
1287 - __normalize_time(&sec, &nsec);
1288 -
1289 - if (is_initial_xendomain() && !independent_wallclock) {
1290 - op.cmd = XENPF_settime;
1291 - op.u.settime.secs = sec;
1292 - op.u.settime.nsecs = nsec;
1293 - op.u.settime.system_time = shadow->system_timestamp;
1294 - WARN_ON(HYPERVISOR_platform_op(&op));
1295 - update_wallclock();
1296 - } else if (independent_wallclock) {
1297 - nsec -= shadow->system_timestamp;
1298 - __normalize_time(&sec, &nsec);
1299 - __update_wallclock(sec, nsec);
1300 - }
1301 - ntp_clear();
1302 -
1303 - /* Reset monotonic gettimeofday() timeval. */
1304 - spin_lock(&monotonic_lock);
1305 - monotonic_tv.tv_sec = 0;
1306 - monotonic_tv.tv_usec = 0;
1307 - spin_unlock(&monotonic_lock);
1308 -
1309 - write_sequnlock_irq(&xtime_lock);
1310 -
1311 - put_cpu();
1312 -
1313 - clock_was_set();
1314 - return 0;
1315 -}
1316 -
1317 -EXPORT_SYMBOL(do_settimeofday);
1318 -
1319 -#endif
1320 -
1321 static void sync_xen_wallclock(unsigned long dummy);
1322 static DEFINE_TIMER(sync_xen_wallclock_timer, sync_xen_wallclock, 0, 0);
1323 static void sync_xen_wallclock(unsigned long dummy)
1324 @@ -550,15 +397,7 @@ static int set_rtc_mmss(unsigned long no
1325 return retval;
1326 }
1327
1328 -#ifdef CONFIG_X86_64
1329 -/* monotonic_clock(): returns # of nanoseconds passed since time_init()
1330 - * Note: This function is required to return accurate
1331 - * time even in the absence of multiple timer ticks.
1332 - */
1333 -unsigned long long monotonic_clock(void)
1334 -#else
1335 unsigned long long sched_clock(void)
1336 -#endif
1337 {
1338 unsigned int cpu = get_cpu();
1339 struct shadow_time_info *shadow = &per_cpu(shadow_time, cpu);
1340 @@ -578,21 +417,18 @@ unsigned long long sched_clock(void)
1341
1342 return time;
1343 }
1344 -#ifdef CONFIG_X86_64
1345 -EXPORT_SYMBOL(monotonic_clock);
1346 -
1347 -unsigned long long sched_clock(void)
1348 -{
1349 - return monotonic_clock();
1350 -}
1351 -#endif
1352
1353 unsigned long profile_pc(struct pt_regs *regs)
1354 {
1355 unsigned long pc = instruction_pointer(regs);
1356
1357 #if defined(CONFIG_SMP) || defined(__x86_64__)
1358 - if (!user_mode_vm(regs) && in_lock_functions(pc)) {
1359 +# ifdef __i386__
1360 + if (!v8086_mode(regs) && SEGMENT_IS_KERNEL_CODE(regs->xcs)
1361 +# else
1362 + if (!user_mode(regs)
1363 +# endif
1364 + && in_lock_functions(pc)) {
1365 # ifdef CONFIG_FRAME_POINTER
1366 # ifdef __i386__
1367 return ((unsigned long *)regs->ebp)[1];
1368 @@ -601,14 +437,11 @@ unsigned long profile_pc(struct pt_regs
1369 # endif
1370 # else
1371 # ifdef __i386__
1372 - unsigned long *sp;
1373 - if ((regs->xcs & 2) == 0)
1374 - sp = (unsigned long *)&regs->esp;
1375 - else
1376 - sp = (unsigned long *)regs->esp;
1377 + unsigned long *sp = (unsigned long *)&regs->esp;
1378 # else
1379 unsigned long *sp = (unsigned long *)regs->rsp;
1380 # endif
1381 +
1382 /* Return address is either directly at stack pointer
1383 or above a saved eflags. Eflags has bits 22-31 zero,
1384 kernel addresses don't. */
1385 @@ -761,19 +594,6 @@ irqreturn_t timer_interrupt(int irq, voi
1386 return IRQ_HANDLED;
1387 }
1388
1389 -#ifndef CONFIG_X86_64
1390 -
1391 -void tsc_init(void)
1392 -{
1393 - init_cpu_khz();
1394 - printk(KERN_INFO "Xen reported: %u.%03u MHz processor.\n",
1395 - cpu_khz / 1000, cpu_khz % 1000);
1396 -
1397 - use_tsc_delay();
1398 -}
1399 -
1400 -#include <linux/clocksource.h>
1401 -
1402 void mark_tsc_unstable(void)
1403 {
1404 #ifndef CONFIG_XEN /* XXX Should tell the hypervisor about this fact. */
1405 @@ -829,21 +649,9 @@ static struct clocksource clocksource_xe
1406 .mask = CLOCKSOURCE_MASK(64),
1407 .mult = 1 << XEN_SHIFT, /* time directly in nanoseconds */
1408 .shift = XEN_SHIFT,
1409 - .is_continuous = 1,
1410 + .flags = CLOCK_SOURCE_IS_CONTINUOUS,
1411 };
1412
1413 -static int __init init_xen_clocksource(void)
1414 -{
1415 - clocksource_xen.mult = clocksource_khz2mult(cpu_khz,
1416 - clocksource_xen.shift);
1417 -
1418 - return clocksource_register(&clocksource_xen);
1419 -}
1420 -
1421 -module_init(init_xen_clocksource);
1422 -
1423 -#endif
1424 -
1425 static void init_missing_ticks_accounting(unsigned int cpu)
1426 {
1427 struct vcpu_register_runstate_memory_area area;
1428 @@ -864,7 +672,7 @@ static void init_missing_ticks_accountin
1429 }
1430
1431 /* not static: needed by APM */
1432 -unsigned long get_cmos_time(void)
1433 +unsigned long read_persistent_clock(void)
1434 {
1435 unsigned long retval;
1436 unsigned long flags;
1437 @@ -877,11 +685,11 @@ unsigned long get_cmos_time(void)
1438
1439 return retval;
1440 }
1441 -EXPORT_SYMBOL(get_cmos_time);
1442
1443 static void sync_cmos_clock(unsigned long dummy);
1444
1445 static DEFINE_TIMER(sync_cmos_timer, sync_cmos_clock, 0, 0);
1446 +int no_sync_cmos_clock;
1447
1448 static void sync_cmos_clock(unsigned long dummy)
1449 {
1450 @@ -925,7 +733,8 @@ static void sync_cmos_clock(unsigned lon
1451
1452 void notify_arch_cmos_timer(void)
1453 {
1454 - mod_timer(&sync_cmos_timer, jiffies + 1);
1455 + if (!no_sync_cmos_clock)
1456 + mod_timer(&sync_cmos_timer, jiffies + 1);
1457 mod_timer(&sync_xen_wallclock_timer, jiffies + 1);
1458 }
1459
1460 @@ -958,29 +767,11 @@ static int time_init_device(void)
1461
1462 device_initcall(time_init_device);
1463
1464 -#ifdef CONFIG_HPET_TIMER
1465 extern void (*late_time_init)(void);
1466 -/* Duplicate of time_init() below, with hpet_enable part added */
1467 -static void __init hpet_time_init(void)
1468 -{
1469 - struct timespec ts;
1470 - ts.tv_sec = get_cmos_time();
1471 - ts.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
1472 -
1473 - do_settimeofday(&ts);
1474 -
1475 - if ((hpet_enable() >= 0) && hpet_use_timer) {
1476 - printk("Using HPET for base-timer\n");
1477 - }
1478 -
1479 - do_time_init();
1480 -}
1481 -#endif
1482
1483 /* Dynamically-mapped IRQ. */
1484 DEFINE_PER_CPU(int, timer_irq);
1485
1486 -extern void (*late_time_init)(void);
1487 static void setup_cpu0_timer_irq(void)
1488 {
1489 per_cpu(timer_irq, 0) =
1490 @@ -988,7 +779,7 @@ static void setup_cpu0_timer_irq(void)
1491 VIRQ_TIMER,
1492 0,
1493 timer_interrupt,
1494 - SA_INTERRUPT,
1495 + IRQF_DISABLED|IRQF_NOBALANCING,
1496 "timer0",
1497 NULL);
1498 BUG_ON(per_cpu(timer_irq, 0) < 0);
1499 @@ -1000,16 +791,9 @@ static struct vcpu_set_periodic_timer xe
1500
1501 void __init time_init(void)
1502 {
1503 -#ifdef CONFIG_HPET_TIMER
1504 - if (is_hpet_capable()) {
1505 - /*
1506 - * HPET initialization needs to do memory-mapped io. So, let
1507 - * us do a late initialization after mem_init().
1508 - */
1509 - late_time_init = hpet_time_init;
1510 - return;
1511 - }
1512 -#endif
1513 + init_cpu_khz();
1514 + printk(KERN_INFO "Xen reported: %u.%03u MHz processor.\n",
1515 + cpu_khz / 1000, cpu_khz % 1000);
1516
1517 switch (HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, 0,
1518 &xen_set_periodic_tick)) {
1519 @@ -1028,18 +812,12 @@ void __init time_init(void)
1520 per_cpu(processed_system_time, 0) = processed_system_time;
1521 init_missing_ticks_accounting(0);
1522
1523 - update_wallclock();
1524 + clocksource_register(&clocksource_xen);
1525
1526 -#ifdef CONFIG_X86_64
1527 - init_cpu_khz();
1528 - printk(KERN_INFO "Xen reported: %u.%03u MHz processor.\n",
1529 - cpu_khz / 1000, cpu_khz % 1000);
1530 + update_wallclock();
1531
1532 - vxtime.mode = VXTIME_TSC;
1533 - vxtime.quot = (1000000L << 32) / vxtime_hz;
1534 - vxtime.tsc_quot = (1000L << 32) / cpu_khz;
1535 - sync_core();
1536 - rdtscll(vxtime.last_tsc);
1537 +#ifndef CONFIG_X86_64
1538 + use_tsc_delay();
1539 #endif
1540
1541 /* Cannot request_irq() until kmem is initialised. */
1542 @@ -1196,7 +974,7 @@ int __cpuinit local_setup_timer(unsigned
1543 irq = bind_virq_to_irqhandler(VIRQ_TIMER,
1544 cpu,
1545 timer_interrupt,
1546 - SA_INTERRUPT,
1547 + IRQF_DISABLED|IRQF_NOBALANCING,
1548 timer_name[cpu],
1549 NULL);
1550 if (irq < 0)
1551 @@ -1285,7 +1063,7 @@ static ctl_table xen_table[] = {
1552 };
1553 static int __init xen_sysctl_init(void)
1554 {
1555 - (void)register_sysctl_table(xen_table, 0);
1556 + (void)register_sysctl_table(xen_table);
1557 return 0;
1558 }
1559 __initcall(xen_sysctl_init);
1560 --- sle11-2009-05-14.orig/arch/x86/kernel/traps_32-xen.c 2008-12-15 11:26:44.000000000 +0100
1561 +++ sle11-2009-05-14/arch/x86/kernel/traps_32-xen.c 2009-03-04 11:25:55.000000000 +0100
1562 @@ -100,6 +100,7 @@ asmlinkage void fixup_4gb_segment(void);
1563 asmlinkage void machine_check(void);
1564
1565 int kstack_depth_to_print = 24;
1566 +static unsigned int code_bytes = 64;
1567 ATOMIC_NOTIFIER_HEAD(i386die_chain);
1568
1569 int register_die_notifier(struct notifier_block *nb)
1570 @@ -297,10 +298,11 @@ void show_registers(struct pt_regs *regs
1571 int i;
1572 int in_kernel = 1;
1573 unsigned long esp;
1574 - unsigned short ss;
1575 + unsigned short ss, gs;
1576
1577 esp = (unsigned long) (&regs->esp);
1578 savesegment(ss, ss);
1579 + savesegment(gs, gs);
1580 if (user_mode_vm(regs)) {
1581 in_kernel = 0;
1582 esp = regs->esp;
1583 @@ -319,8 +321,8 @@ void show_registers(struct pt_regs *regs
1584 regs->eax, regs->ebx, regs->ecx, regs->edx);
1585 printk(KERN_EMERG "esi: %08lx edi: %08lx ebp: %08lx esp: %08lx\n",
1586 regs->esi, regs->edi, regs->ebp, esp);
1587 - printk(KERN_EMERG "ds: %04x es: %04x ss: %04x\n",
1588 - regs->xds & 0xffff, regs->xes & 0xffff, ss);
1589 + printk(KERN_EMERG "ds: %04x es: %04x fs: %04x gs: %04x ss: %04x\n",
1590 + regs->xds & 0xffff, regs->xes & 0xffff, regs->xfs & 0xffff, gs, ss);
1591 printk(KERN_EMERG "Process %.*s (pid: %d, ti=%p task=%p task.ti=%p)",
1592 TASK_COMM_LEN, current->comm, current->pid,
1593 current_thread_info(), current, current->thread_info);
1594 @@ -330,7 +332,8 @@ void show_registers(struct pt_regs *regs
1595 */
1596 if (in_kernel) {
1597 u8 *eip;
1598 - int code_bytes = 64;
1599 + unsigned int code_prologue = code_bytes * 43 / 64;
1600 + unsigned int code_len = code_bytes;
1601 unsigned char c;
1602
1603 printk("\n" KERN_EMERG "Stack: ");
1604 @@ -338,14 +341,14 @@ void show_registers(struct pt_regs *regs
1605
1606 printk(KERN_EMERG "Code: ");
1607
1608 - eip = (u8 *)regs->eip - 43;
1609 + eip = (u8 *)regs->eip - code_prologue;
1610 if (eip < (u8 *)PAGE_OFFSET ||
1611 probe_kernel_address(eip, c)) {
1612 /* try starting at EIP */
1613 eip = (u8 *)regs->eip;
1614 - code_bytes = 32;
1615 + code_len = code_len - code_prologue + 1;
1616 }
1617 - for (i = 0; i < code_bytes; i++, eip++) {
1618 + for (i = 0; i < code_len; i++, eip++) {
1619 if (eip < (u8 *)PAGE_OFFSET ||
1620 probe_kernel_address(eip, c)) {
1621 printk(" Bad EIP value.");
1622 @@ -1134,3 +1137,13 @@ static int __init kstack_setup(char *s)
1623 return 1;
1624 }
1625 __setup("kstack=", kstack_setup);
1626 +
1627 +static int __init code_bytes_setup(char *s)
1628 +{
1629 + code_bytes = simple_strtoul(s, NULL, 0);
1630 + if (code_bytes > 8192)
1631 + code_bytes = 8192;
1632 +
1633 + return 1;
1634 +}
1635 +__setup("code_bytes=", code_bytes_setup);
1636 --- sle11-2009-05-14.orig/arch/x86/mm/fault_32-xen.c 2008-12-15 11:26:44.000000000 +0100
1637 +++ sle11-2009-05-14/arch/x86/mm/fault_32-xen.c 2009-03-04 11:25:55.000000000 +0100
1638 @@ -46,43 +46,17 @@ int unregister_page_fault_notifier(struc
1639 }
1640 EXPORT_SYMBOL_GPL(unregister_page_fault_notifier);
1641
1642 -static inline int notify_page_fault(enum die_val val, const char *str,
1643 - struct pt_regs *regs, long err, int trap, int sig)
1644 +static inline int notify_page_fault(struct pt_regs *regs, long err)
1645 {
1646 struct die_args args = {
1647 .regs = regs,
1648 - .str = str,
1649 + .str = "page fault",
1650 .err = err,
1651 - .trapnr = trap,
1652 - .signr = sig
1653 + .trapnr = 14,
1654 + .signr = SIGSEGV
1655 };
1656 - return atomic_notifier_call_chain(&notify_page_fault_chain, val, &args);
1657 -}
1658 -
1659 -/*
1660 - * Unlock any spinlocks which will prevent us from getting the
1661 - * message out
1662 - */
1663 -void bust_spinlocks(int yes)
1664 -{
1665 - int loglevel_save = console_loglevel;
1666 -
1667 - if (yes) {
1668 - oops_in_progress = 1;
1669 - return;
1670 - }
1671 -#ifdef CONFIG_VT
1672 - unblank_screen();
1673 -#endif
1674 - oops_in_progress = 0;
1675 - /*
1676 - * OK, the message is on the console. Now we call printk()
1677 - * without oops_in_progress set so that printk will give klogd
1678 - * a poke. Hold onto your hats...
1679 - */
1680 - console_loglevel = 15; /* NMI oopser may have shut the console up */
1681 - printk(" ");
1682 - console_loglevel = loglevel_save;
1683 + return atomic_notifier_call_chain(&notify_page_fault_chain,
1684 + DIE_PAGE_FAULT, &args);
1685 }
1686
1687 /*
1688 @@ -476,8 +450,7 @@ fastcall void __kprobes do_page_fault(st
1689 /* Can take a spurious fault if mapping changes R/O -> R/W. */
1690 if (spurious_fault(regs, address, error_code))
1691 return;
1692 - if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
1693 - SIGSEGV) == NOTIFY_STOP)
1694 + if (notify_page_fault(regs, error_code) == NOTIFY_STOP)
1695 return;
1696 /*
1697 * Don't take the mm semaphore here. If we fixup a prefetch
1698 @@ -486,8 +459,7 @@ fastcall void __kprobes do_page_fault(st
1699 goto bad_area_nosemaphore;
1700 }
1701
1702 - if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
1703 - SIGSEGV) == NOTIFY_STOP)
1704 + if (notify_page_fault(regs, error_code) == NOTIFY_STOP)
1705 return;
1706
1707 /* It's safe to allow irq's after cr2 has been saved and the vmalloc
1708 --- sle11-2009-05-14.orig/arch/x86/mm/highmem_32-xen.c 2008-12-15 11:26:44.000000000 +0100
1709 +++ sle11-2009-05-14/arch/x86/mm/highmem_32-xen.c 2009-03-04 11:25:55.000000000 +0100
1710 @@ -33,14 +33,16 @@ static void *__kmap_atomic(struct page *
1711
1712 /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
1713 pagefault_disable();
1714 +
1715 + idx = type + KM_TYPE_NR*smp_processor_id();
1716 + BUG_ON(!pte_none(*(kmap_pte-idx)));
1717 +
1718 if (!PageHighMem(page))
1719 return page_address(page);
1720
1721 - idx = type + KM_TYPE_NR*smp_processor_id();
1722 vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
1723 - if (!pte_none(*(kmap_pte-idx)))
1724 - BUG();
1725 set_pte_at(&init_mm, vaddr, kmap_pte-idx, mk_pte(page, prot));
1726 + /*arch_flush_lazy_mmu_mode();*/
1727
1728 return (void*) vaddr;
1729 }
1730 @@ -94,6 +96,7 @@ void *kmap_atomic_pfn(unsigned long pfn,
1731 idx = type + KM_TYPE_NR*smp_processor_id();
1732 vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
1733 set_pte(kmap_pte-idx, pfn_pte(pfn, kmap_prot));
1734 + /*arch_flush_lazy_mmu_mode();*/
1735
1736 return (void*) vaddr;
1737 }
1738 --- sle11-2009-05-14.orig/arch/x86/mm/init_32-xen.c 2008-12-15 11:26:44.000000000 +0100
1739 +++ sle11-2009-05-14/arch/x86/mm/init_32-xen.c 2009-03-04 11:25:55.000000000 +0100
1740 @@ -66,6 +66,7 @@ static pmd_t * __init one_md_table_init(
1741
1742 #ifdef CONFIG_X86_PAE
1743 pmd_table = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
1744 + paravirt_alloc_pd(__pa(pmd_table) >> PAGE_SHIFT);
1745 make_lowmem_page_readonly(pmd_table, XENFEAT_writable_page_tables);
1746 set_pgd(pgd, __pgd(__pa(pmd_table) | _PAGE_PRESENT));
1747 pud = pud_offset(pgd, 0);
1748 @@ -87,6 +88,7 @@ static pte_t * __init one_page_table_ini
1749 {
1750 if (pmd_none(*pmd)) {
1751 pte_t *page_table = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
1752 + paravirt_alloc_pt(__pa(page_table) >> PAGE_SHIFT);
1753 make_lowmem_page_readonly(page_table,
1754 XENFEAT_writable_page_tables);
1755 set_pmd(pmd, __pmd(__pa(page_table) | _PAGE_TABLE));
1756 --- sle11-2009-05-14.orig/arch/x86/mm/pgtable_32-xen.c 2008-12-15 11:26:44.000000000 +0100
1757 +++ sle11-2009-05-14/arch/x86/mm/pgtable_32-xen.c 2009-03-04 11:25:55.000000000 +0100
1758 @@ -149,6 +149,8 @@ void __set_fixmap (enum fixed_addresses
1759 void __init reserve_top_address(unsigned long reserve)
1760 {
1761 BUG_ON(fixmaps > 0);
1762 + printk(KERN_INFO "Reserving virtual address space above 0x%08x\n",
1763 + (int)-reserve);
1764 __FIXADDR_TOP = -reserve - PAGE_SIZE;
1765 __VMALLOC_RESERVE += reserve;
1766 }
1767 @@ -258,6 +260,12 @@ void pgd_ctor(void *pgd, struct kmem_cac
1768 swapper_pg_dir + USER_PTRS_PER_PGD,
1769 KERNEL_PGD_PTRS);
1770 memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
1771 +
1772 + /* must happen under lock */
1773 + paravirt_alloc_pd_clone(__pa(pgd) >> PAGE_SHIFT,
1774 + __pa(swapper_pg_dir) >> PAGE_SHIFT,
1775 + USER_PTRS_PER_PGD, PTRS_PER_PGD - USER_PTRS_PER_PGD);
1776 +
1777 pgd_list_add(pgd);
1778 spin_unlock_irqrestore(&pgd_lock, flags);
1779 }
1780 @@ -268,6 +276,7 @@ void pgd_dtor(void *pgd, struct kmem_cac
1781 {
1782 unsigned long flags; /* can be called from interrupt context */
1783
1784 + paravirt_release_pd(__pa(pgd) >> PAGE_SHIFT);
1785 spin_lock_irqsave(&pgd_lock, flags);
1786 pgd_list_del(pgd);
1787 spin_unlock_irqrestore(&pgd_lock, flags);
1788 @@ -292,6 +301,7 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
1789 pmd_t *pmd = kmem_cache_alloc(pmd_cache, GFP_KERNEL);
1790 if (!pmd)
1791 goto out_oom;
1792 + paravirt_alloc_pd(__pa(pmd) >> PAGE_SHIFT);
1793 set_pgd(&pgd[i], __pgd(1 + __pa(pmd)));
1794 }
1795 return pgd;
1796 @@ -314,6 +324,7 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
1797 pmd[i] = kmem_cache_alloc(pmd_cache, GFP_KERNEL);
1798 if (!pmd[i])
1799 goto out_oom;
1800 + paravirt_alloc_pd(__pa(pmd) >> PAGE_SHIFT);
1801 }
1802
1803 spin_lock_irqsave(&pgd_lock, flags);
1804 @@ -354,12 +365,17 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
1805
1806 out_oom:
1807 if (HAVE_SHARED_KERNEL_PMD) {
1808 - for (i--; i >= 0; i--)
1809 - kmem_cache_free(pmd_cache,
1810 - (void *)__va(pgd_val(pgd[i])-1));
1811 + for (i--; i >= 0; i--) {
1812 + pgd_t pgdent = pgd[i];
1813 + void* pmd = (void *)__va(pgd_val(pgdent)-1);
1814 + paravirt_release_pd(__pa(pmd) >> PAGE_SHIFT);
1815 + kmem_cache_free(pmd_cache, pmd);
1816 + }
1817 } else {
1818 - for (i--; i >= 0; i--)
1819 + for (i--; i >= 0; i--) {
1820 + paravirt_release_pd(__pa(pmd[i]) >> PAGE_SHIFT);
1821 kmem_cache_free(pmd_cache, pmd[i]);
1822 + }
1823 kfree(pmd);
1824 }
1825 kmem_cache_free(pgd_cache, pgd);
1826 @@ -383,7 +399,9 @@ void pgd_free(pgd_t *pgd)
1827 /* in the PAE case user pgd entries are overwritten before usage */
1828 if (PTRS_PER_PMD > 1) {
1829 for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
1830 - pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
1831 + pgd_t pgdent = pgd[i];
1832 + void* pmd = (void *)__va(pgd_val(pgdent)-1);
1833 + paravirt_release_pd(__pa(pmd) >> PAGE_SHIFT);
1834 kmem_cache_free(pmd_cache, pmd);
1835 }
1836
1837 --- sle11-2009-05-14.orig/arch/x86/ia32/ia32entry-xen.S 2009-03-04 11:28:34.000000000 +0100
1838 +++ sle11-2009-05-14/arch/x86/ia32/ia32entry-xen.S 2009-03-04 11:25:55.000000000 +0100
1839 @@ -465,7 +465,7 @@ ia32_sys_call_table:
1840 .quad sys32_vm86_warning /* vm86old */
1841 .quad compat_sys_wait4
1842 .quad sys_swapoff /* 115 */
1843 - .quad sys32_sysinfo
1844 + .quad compat_sys_sysinfo
1845 .quad sys32_ipc
1846 .quad sys_fsync
1847 .quad stub32_sigreturn
1848 @@ -510,7 +510,7 @@ ia32_sys_call_table:
1849 .quad sys_sched_yield
1850 .quad sys_sched_get_priority_max
1851 .quad sys_sched_get_priority_min /* 160 */
1852 - .quad sys_sched_rr_get_interval
1853 + .quad sys32_sched_rr_get_interval
1854 .quad compat_sys_nanosleep
1855 .quad sys_mremap
1856 .quad sys_setresuid16
1857 @@ -668,4 +668,5 @@ ia32_sys_call_table:
1858 .quad compat_sys_vmsplice
1859 .quad compat_sys_move_pages
1860 .quad sys_getcpu
1861 + .quad sys_epoll_pwait
1862 ia32_syscall_end:
1863 --- sle11-2009-05-14.orig/arch/x86/kernel/acpi/sleep_64-xen.c 2009-05-14 10:56:29.000000000 +0200
1864 +++ sle11-2009-05-14/arch/x86/kernel/acpi/sleep_64-xen.c 2009-03-04 11:25:55.000000000 +0100
1865 @@ -59,7 +59,7 @@ unsigned long acpi_wakeup_address = 0;
1866 unsigned long acpi_video_flags;
1867 extern char wakeup_start, wakeup_end;
1868
1869 -extern unsigned long FASTCALL(acpi_copy_wakeup_routine(unsigned long));
1870 +extern unsigned long acpi_copy_wakeup_routine(unsigned long);
1871
1872 static pgd_t low_ptr;
1873
1874 @@ -67,8 +67,10 @@ static void init_low_mapping(void)
1875 {
1876 pgd_t *slot0 = pgd_offset(current->mm, 0UL);
1877 low_ptr = *slot0;
1878 + /* FIXME: We're playing with the current task's page tables here, which
1879 + * is potentially dangerous on SMP systems.
1880 + */
1881 set_pgd(slot0, *pgd_offset(current->mm, PAGE_OFFSET));
1882 - WARN_ON(num_online_cpus() != 1);
1883 local_flush_tlb();
1884 }
1885 #endif
1886 --- sle11-2009-05-14.orig/arch/x86/kernel/e820_64-xen.c 2009-03-04 11:28:34.000000000 +0100
1887 +++ sle11-2009-05-14/arch/x86/kernel/e820_64-xen.c 2009-03-04 11:25:55.000000000 +0100
1888 @@ -88,6 +88,13 @@ static inline int bad_addr(unsigned long
1889 return 1;
1890 }
1891
1892 +#ifdef CONFIG_NUMA
1893 + /* NUMA memory to node map */
1894 + if (last >= nodemap_addr && addr < nodemap_addr + nodemap_size) {
1895 + *addrp = nodemap_addr + nodemap_size;
1896 + return 1;
1897 + }
1898 +#endif
1899 /* XXX ramdisk image here? */
1900 #else
1901 if (last < (table_end<<PAGE_SHIFT)) {
1902 @@ -213,6 +220,37 @@ unsigned long __init e820_end_of_ram(voi
1903 }
1904
1905 /*
1906 + * Find the hole size in the range.
1907 + */
1908 +unsigned long __init e820_hole_size(unsigned long start, unsigned long end)
1909 +{
1910 + unsigned long ram = 0;
1911 + int i;
1912 +
1913 + for (i = 0; i < e820.nr_map; i++) {
1914 + struct e820entry *ei = &e820.map[i];
1915 + unsigned long last, addr;
1916 +
1917 + if (ei->type != E820_RAM ||
1918 + ei->addr+ei->size <= start ||
1919 + ei->addr >= end)
1920 + continue;
1921 +
1922 + addr = round_up(ei->addr, PAGE_SIZE);
1923 + if (addr < start)
1924 + addr = start;
1925 +
1926 + last = round_down(ei->addr + ei->size, PAGE_SIZE);
1927 + if (last >= end)
1928 + last = end;
1929 +
1930 + if (last > addr)
1931 + ram += last - addr;
1932 + }
1933 + return ((end - start) - ram);
1934 +}
1935 +
1936 +/*
1937 * Mark e820 reserved areas as busy for the resource manager.
1938 */
1939 void __init e820_reserve_resources(struct e820entry *e820, int nr_map)
1940 @@ -738,7 +776,7 @@ static int __init parse_memmap_opt(char
1941 }
1942 early_param("memmap", parse_memmap_opt);
1943
1944 -void finish_e820_parsing(void)
1945 +void __init finish_e820_parsing(void)
1946 {
1947 if (userdef) {
1948 printk(KERN_INFO "user-defined physical RAM map:\n");
1949 --- sle11-2009-05-14.orig/arch/x86/kernel/entry_64-xen.S 2008-12-15 11:26:44.000000000 +0100
1950 +++ sle11-2009-05-14/arch/x86/kernel/entry_64-xen.S 2009-03-04 11:25:55.000000000 +0100
1951 @@ -629,6 +629,9 @@ END(invalidate_interrupt\num)
1952 ENTRY(call_function_interrupt)
1953 apicinterrupt CALL_FUNCTION_VECTOR,smp_call_function_interrupt
1954 END(call_function_interrupt)
1955 +ENTRY(irq_move_cleanup_interrupt)
1956 + apicinterrupt IRQ_MOVE_CLEANUP_VECTOR,smp_irq_move_cleanup_interrupt
1957 +END(irq_move_cleanup_interrupt)
1958 #endif
1959
1960 ENTRY(apic_timer_interrupt)
1961 --- sle11-2009-05-14.orig/arch/x86/kernel/genapic_64-xen.c 2008-12-15 11:26:44.000000000 +0100
1962 +++ sle11-2009-05-14/arch/x86/kernel/genapic_64-xen.c 2009-03-04 11:25:55.000000000 +0100
1963 @@ -65,8 +65,8 @@ void __init clustered_apic_check(void)
1964 * Some x86_64 machines use physical APIC mode regardless of how many
1965 * procs/clusters are present (x86_64 ES7000 is an example).
1966 */
1967 - if (acpi_fadt.revision > FADT2_REVISION_ID)
1968 - if (acpi_fadt.force_apic_physical_destination_mode) {
1969 + if (acpi_gbl_FADT.header.revision > FADT2_REVISION_ID)
1970 + if (acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL) {
1971 genapic = &apic_cluster;
1972 goto print;
1973 }
1974 --- sle11-2009-05-14.orig/arch/x86/kernel/head64-xen.c 2008-12-15 11:26:44.000000000 +0100
1975 +++ sle11-2009-05-14/arch/x86/kernel/head64-xen.c 2009-03-04 11:25:55.000000000 +0100
1976 @@ -45,8 +45,6 @@ static void __init clear_bss(void)
1977 #define OLD_CL_BASE_ADDR 0x90000
1978 #define OLD_CL_OFFSET 0x90022
1979
1980 -extern char saved_command_line[];
1981 -
1982 static void __init copy_bootdata(char *real_mode_data)
1983 {
1984 #ifndef CONFIG_XEN
1985 @@ -62,14 +60,14 @@ static void __init copy_bootdata(char *r
1986 new_data = OLD_CL_BASE_ADDR + * (u16 *) OLD_CL_OFFSET;
1987 }
1988 command_line = (char *) ((u64)(new_data));
1989 - memcpy(saved_command_line, command_line, COMMAND_LINE_SIZE);
1990 + memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
1991 #else
1992 int max_cmdline;
1993
1994 if ((max_cmdline = MAX_GUEST_CMDLINE) > COMMAND_LINE_SIZE)
1995 max_cmdline = COMMAND_LINE_SIZE;
1996 - memcpy(saved_command_line, xen_start_info->cmd_line, max_cmdline);
1997 - saved_command_line[max_cmdline-1] = '\0';
1998 + memcpy(boot_command_line, xen_start_info->cmd_line, max_cmdline);
1999 + boot_command_line[max_cmdline-1] = '\0';
2000 #endif
2001 }
2002
2003 --- sle11-2009-05-14.orig/arch/x86/kernel/io_apic_64-xen.c 2008-12-15 11:26:44.000000000 +0100
2004 +++ sle11-2009-05-14/arch/x86/kernel/io_apic_64-xen.c 2009-03-04 11:25:55.000000000 +0100
2005 @@ -36,6 +36,7 @@
2006 #include <acpi/acpi_bus.h>
2007 #endif
2008
2009 +#include <asm/idle.h>
2010 #include <asm/io.h>
2011 #include <asm/smp.h>
2012 #include <asm/desc.h>
2013 @@ -47,7 +48,20 @@
2014 #include <asm/msidef.h>
2015 #include <asm/hypertransport.h>
2016
2017 -static int assign_irq_vector(int irq, cpumask_t mask, cpumask_t *result);
2018 +struct irq_cfg {
2019 +#ifndef CONFIG_XEN
2020 + cpumask_t domain;
2021 + cpumask_t old_domain;
2022 +#endif
2023 + unsigned move_cleanup_count;
2024 + u8 vector;
2025 + u8 move_in_progress : 1;
2026 +};
2027 +
2028 +/* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */
2029 +struct irq_cfg irq_cfg[NR_IRQS] __read_mostly;
2030 +
2031 +static int assign_irq_vector(int irq, cpumask_t mask);
2032
2033 #define __apicdebuginit __init
2034
2035 @@ -89,7 +103,7 @@ int nr_ioapic_registers[MAX_IO_APICS];
2036 * Rough estimation of how many shared IRQs there are, can
2037 * be changed anytime.
2038 */
2039 -#define MAX_PLUS_SHARED_IRQS NR_IRQ_VECTORS
2040 +#define MAX_PLUS_SHARED_IRQS NR_IRQS
2041 #define PIN_MAP_SIZE (MAX_PLUS_SHARED_IRQS + NR_IRQS)
2042
2043 /*
2044 @@ -262,21 +276,19 @@ static void __target_IO_APIC_irq(unsigne
2045
2046 static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
2047 {
2048 + struct irq_cfg *cfg = irq_cfg + irq;
2049 unsigned long flags;
2050 unsigned int dest;
2051 cpumask_t tmp;
2052 - int vector;
2053
2054 cpus_and(tmp, mask, cpu_online_map);
2055 if (cpus_empty(tmp))
2056 - tmp = TARGET_CPUS;
2057 -
2058 - cpus_and(mask, tmp, CPU_MASK_ALL);
2059 + return;
2060
2061 - vector = assign_irq_vector(irq, mask, &tmp);
2062 - if (vector < 0)
2063 + if (assign_irq_vector(irq, mask))
2064 return;
2065
2066 + cpus_and(tmp, cfg->domain, mask);
2067 dest = cpu_mask_to_apicid(tmp);
2068
2069 /*
2070 @@ -285,8 +297,8 @@ static void set_ioapic_affinity_irq(unsi
2071 dest = SET_APIC_LOGICAL_ID(dest);
2072
2073 spin_lock_irqsave(&ioapic_lock, flags);
2074 - __target_IO_APIC_irq(irq, dest, vector);
2075 - set_native_irq_info(irq, mask);
2076 + __target_IO_APIC_irq(irq, dest, cfg->vector);
2077 + irq_desc[irq].affinity = mask;
2078 spin_unlock_irqrestore(&ioapic_lock, flags);
2079 }
2080 #endif
2081 @@ -332,11 +344,11 @@ static void add_pin_to_irq(unsigned int
2082 reg = io_apic_read(entry->apic, 0x10 + R + pin*2); \
2083 reg ACTION; \
2084 io_apic_modify(entry->apic, reg); \
2085 + FINAL; \
2086 if (!entry->next) \
2087 break; \
2088 entry = irq_2_pin + entry->next; \
2089 } \
2090 - FINAL; \
2091 }
2092
2093 #define DO_ACTION(name,R,ACTION, FINAL) \
2094 @@ -669,77 +681,62 @@ static int pin_2_irq(int idx, int apic,
2095 return irq;
2096 }
2097
2098 -static inline int IO_APIC_irq_trigger(int irq)
2099 -{
2100 - int apic, idx, pin;
2101 -
2102 - for (apic = 0; apic < nr_ioapics; apic++) {
2103 - for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
2104 - idx = find_irq_entry(apic,pin,mp_INT);
2105 - if ((idx != -1) && (irq == pin_2_irq(idx,apic,pin)))
2106 - return irq_trigger(idx);
2107 - }
2108 - }
2109 - /*
2110 - * nonexistent IRQs are edge default
2111 - */
2112 - return 0;
2113 -}
2114 -
2115 -/* irq_vectors is indexed by the sum of all RTEs in all I/O APICs. */
2116 -static u8 irq_vector[NR_IRQ_VECTORS] __read_mostly;
2117 -
2118 -static int __assign_irq_vector(int irq, cpumask_t mask, cpumask_t *result)
2119 +static int __assign_irq_vector(int irq, cpumask_t mask)
2120 {
2121 - int vector;
2122 struct physdev_irq irq_op;
2123 + struct irq_cfg *cfg;
2124
2125 - BUG_ON((unsigned)irq >= NR_IRQ_VECTORS);
2126 + BUG_ON((unsigned)irq >= NR_IRQS);
2127
2128 if (irq < PIRQ_BASE || irq - PIRQ_BASE >= NR_PIRQS)
2129 return -EINVAL;
2130
2131 - cpus_and(*result, mask, cpu_online_map);
2132 + cfg = &irq_cfg[irq];
2133 +
2134 + if ((cfg->move_in_progress) || cfg->move_cleanup_count)
2135 + return -EBUSY;
2136
2137 - if (irq_vector[irq] > 0)
2138 - return irq_vector[irq];
2139 + if (cfg->vector)
2140 + return 0;
2141
2142 irq_op.irq = irq;
2143 if (HYPERVISOR_physdev_op(PHYSDEVOP_alloc_irq_vector, &irq_op))
2144 return -ENOSPC;
2145
2146 - vector = irq_op.vector;
2147 - irq_vector[irq] = vector;
2148 + cfg->vector = irq_op.vector;
2149
2150 - return vector;
2151 + return 0;
2152 }
2153
2154 -static int assign_irq_vector(int irq, cpumask_t mask, cpumask_t *result)
2155 +static int assign_irq_vector(int irq, cpumask_t mask)
2156 {
2157 - int vector;
2158 + int err;
2159 unsigned long flags;
2160
2161 spin_lock_irqsave(&vector_lock, flags);
2162 - vector = __assign_irq_vector(irq, mask, result);
2163 + err = __assign_irq_vector(irq, mask);
2164 spin_unlock_irqrestore(&vector_lock, flags);
2165 - return vector;
2166 + return err;
2167 }
2168
2169 #ifndef CONFIG_XEN
2170 static void __clear_irq_vector(int irq)
2171 {
2172 + struct irq_cfg *cfg;
2173 cpumask_t mask;
2174 int cpu, vector;
2175
2176 - BUG_ON(!irq_vector[irq]);
2177 + BUG_ON((unsigned)irq >= NR_IRQS);
2178 + cfg = &irq_cfg[irq];
2179 + BUG_ON(!cfg->vector);
2180
2181 - vector = irq_vector[irq];
2182 - cpus_and(mask, irq_domain[irq], cpu_online_map);
2183 + vector = cfg->vector;
2184 + cpus_and(mask, cfg->domain, cpu_online_map);
2185 for_each_cpu_mask(cpu, mask)
2186 per_cpu(vector_irq, cpu)[vector] = -1;
2187
2188 - irq_vector[irq] = 0;
2189 - irq_domain[irq] = CPU_MASK_NONE;
2190 + cfg->vector = 0;
2191 + cfg->domain = CPU_MASK_NONE;
2192 }
2193
2194 void __setup_vector_irq(int cpu)
2195 @@ -749,10 +746,10 @@ void __setup_vector_irq(int cpu)
2196 int irq, vector;
2197
2198 /* Mark the inuse vectors */
2199 - for (irq = 0; irq < NR_IRQ_VECTORS; ++irq) {
2200 - if (!cpu_isset(cpu, irq_domain[irq]))
2201 + for (irq = 0; irq < NR_IRQS; ++irq) {
2202 + if (!cpu_isset(cpu, irq_cfg[irq].domain))
2203 continue;
2204 - vector = irq_vector[irq];
2205 + vector = irq_cfg[irq].vector;
2206 per_cpu(vector_irq, cpu)[vector] = irq;
2207 }
2208 /* Mark the free vectors */
2209 @@ -760,41 +757,49 @@ void __setup_vector_irq(int cpu)
2210 irq = per_cpu(vector_irq, cpu)[vector];
2211 if (irq < 0)
2212 continue;
2213 - if (!cpu_isset(cpu, irq_domain[irq]))
2214 + if (!cpu_isset(cpu, irq_cfg[irq].domain))
2215 per_cpu(vector_irq, cpu)[vector] = -1;
2216 }
2217 }
2218
2219 -extern void (*interrupt[NR_IRQS])(void);
2220 -
2221 static struct irq_chip ioapic_chip;
2222
2223 -#define IOAPIC_AUTO -1
2224 -#define IOAPIC_EDGE 0
2225 -#define IOAPIC_LEVEL 1
2226 -
2227 -static void ioapic_register_intr(int irq, int vector, unsigned long trigger)
2228 +static void ioapic_register_intr(int irq, unsigned long trigger)
2229 {
2230 - if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
2231 - trigger == IOAPIC_LEVEL)
2232 + if (trigger)
2233 set_irq_chip_and_handler_name(irq, &ioapic_chip,
2234 handle_fasteoi_irq, "fasteoi");
2235 - else {
2236 - irq_desc[irq].status |= IRQ_DELAYED_DISABLE;
2237 + else
2238 set_irq_chip_and_handler_name(irq, &ioapic_chip,
2239 handle_edge_irq, "edge");
2240 - }
2241 }
2242 #else
2243 -#define ioapic_register_intr(irq, vector, trigger) evtchn_register_pirq(irq)
2244 +#define ioapic_register_intr(irq, trigger) evtchn_register_pirq(irq)
2245 #endif /* !CONFIG_XEN */
2246
2247 -static void __init setup_IO_APIC_irq(int apic, int pin, int idx, int irq)
2248 +static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq,
2249 + int trigger, int polarity)
2250 {
2251 + struct irq_cfg *cfg = irq_cfg + irq;
2252 struct IO_APIC_route_entry entry;
2253 - int vector;
2254 - unsigned long flags;
2255 + cpumask_t mask;
2256 +
2257 + if (!IO_APIC_IRQ(irq))
2258 + return;
2259
2260 + mask = TARGET_CPUS;
2261 + if (assign_irq_vector(irq, mask))
2262 + return;
2263 +
2264 +#ifndef CONFIG_XEN
2265 + cpus_and(mask, cfg->domain, mask);
2266 +#endif
2267 +
2268 + apic_printk(APIC_VERBOSE,KERN_DEBUG
2269 + "IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> "
2270 + "IRQ %d Mode:%i Active:%i)\n",
2271 + apic, mp_ioapics[apic].mpc_apicid, pin, cfg->vector,
2272 + irq, trigger, polarity);
2273
2274 /*
2275 * add it to the IO-APIC irq-routing table:
2276 @@ -803,41 +808,23 @@ static void __init setup_IO_APIC_irq(int
2277
2278 entry.delivery_mode = INT_DELIVERY_MODE;
2279 entry.dest_mode = INT_DEST_MODE;
2280 + entry.dest = cpu_mask_to_apicid(mask);
2281 entry.mask = 0; /* enable IRQ */
2282 - entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
2283 -
2284 - entry.trigger = irq_trigger(idx);
2285 - entry.polarity = irq_polarity(idx);
2286 + entry.trigger = trigger;
2287 + entry.polarity = polarity;
2288 + entry.vector = cfg->vector;
2289
2290 - if (irq_trigger(idx)) {
2291 - entry.trigger = 1;
2292 + /* Mask level triggered irqs.
2293 + * Use IRQ_DELAYED_DISABLE for edge triggered irqs.
2294 + */
2295 + if (trigger)
2296 entry.mask = 1;
2297 - entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
2298 - }
2299 -
2300 - if (/* !apic && */ !IO_APIC_IRQ(irq))
2301 - return;
2302
2303 - if (IO_APIC_IRQ(irq)) {
2304 - cpumask_t mask;
2305 - vector = assign_irq_vector(irq, TARGET_CPUS, &mask);
2306 - if (vector < 0)
2307 - return;
2308 -
2309 - entry.dest.logical.logical_dest = cpu_mask_to_apicid(mask);
2310 - entry.vector = vector;
2311 -
2312 - ioapic_register_intr(irq, vector, IOAPIC_AUTO);
2313 - if (!apic && (irq < 16))
2314 - disable_8259A_irq(irq);
2315 - }
2316 + ioapic_register_intr(irq, trigger);
2317 + if (irq < 16)
2318 + disable_8259A_irq(irq);
2319
2320 ioapic_write_entry(apic, pin, entry);
2321 -
2322 - spin_lock_irqsave(&ioapic_lock, flags);
2323 - set_native_irq_info(irq, TARGET_CPUS);
2324 - spin_unlock_irqrestore(&ioapic_lock, flags);
2325 -
2326 }
2327
2328 static void __init setup_IO_APIC_irqs(void)
2329 @@ -862,8 +849,8 @@ static void __init setup_IO_APIC_irqs(vo
2330 irq = pin_2_irq(idx, apic, pin);
2331 add_pin_to_irq(irq, apic, pin);
2332
2333 - setup_IO_APIC_irq(apic, pin, idx, irq);
2334 -
2335 + setup_IO_APIC_irq(apic, pin, irq,
2336 + irq_trigger(idx), irq_polarity(idx));
2337 }
2338 }
2339
2340 @@ -894,7 +881,7 @@ static void __init setup_ExtINT_IRQ0_pin
2341 */
2342 entry.dest_mode = INT_DEST_MODE;
2343 entry.mask = 0; /* unmask IRQ now */
2344 - entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
2345 + entry.dest = cpu_mask_to_apicid(TARGET_CPUS);
2346 entry.delivery_mode = INT_DELIVERY_MODE;
2347 entry.polarity = 0;
2348 entry.trigger = 0;
2349 @@ -994,18 +981,17 @@ void __apicdebuginit print_IO_APIC(void)
2350
2351 printk(KERN_DEBUG ".... IRQ redirection table:\n");
2352
2353 - printk(KERN_DEBUG " NR Log Phy Mask Trig IRR Pol"
2354 - " Stat Dest Deli Vect: \n");
2355 + printk(KERN_DEBUG " NR Dst Mask Trig IRR Pol"
2356 + " Stat Dmod Deli Vect: \n");
2357
2358 for (i = 0; i <= reg_01.bits.entries; i++) {
2359 struct IO_APIC_route_entry entry;
2360
2361 entry = ioapic_read_entry(apic, i);
2362
2363 - printk(KERN_DEBUG " %02x %03X %02X ",
2364 + printk(KERN_DEBUG " %02x %03X ",
2365 i,
2366 - entry.dest.logical.logical_dest,
2367 - entry.dest.physical.physical_dest
2368 + entry.dest
2369 );
2370
2371 printk("%1d %1d %1d %1d %1d %1d %1d %02X\n",
2372 @@ -1269,8 +1255,7 @@ void disable_IO_APIC(void)
2373 entry.dest_mode = 0; /* Physical */
2374 entry.delivery_mode = dest_ExtINT; /* ExtInt */
2375 entry.vector = 0;
2376 - entry.dest.physical.physical_dest =
2377 - GET_APIC_ID(apic_read(APIC_ID));
2378 + entry.dest = GET_APIC_ID(apic_read(APIC_ID));
2379
2380 /*
2381 * Add it to the IO-APIC irq-routing table:
2382 @@ -1355,16 +1340,15 @@ static unsigned int startup_ioapic_irq(u
2383
2384 static int ioapic_retrigger_irq(unsigned int irq)
2385 {
2386 + struct irq_cfg *cfg = &irq_cfg[irq];
2387 cpumask_t mask;
2388 - unsigned vector;
2389 unsigned long flags;
2390
2391 spin_lock_irqsave(&vector_lock, flags);
2392 - vector = irq_vector[irq];
2393 cpus_clear(mask);
2394 - cpu_set(first_cpu(irq_domain[irq]), mask);
2395 + cpu_set(first_cpu(cfg->domain), mask);
2396
2397 - send_IPI_mask(mask, vector);
2398 + send_IPI_mask(mask, cfg->vector);
2399 spin_unlock_irqrestore(&vector_lock, flags);
2400
2401 return 1;
2402 @@ -1379,8 +1363,68 @@ static int ioapic_retrigger_irq(unsigned
2403 * races.
2404 */
2405
2406 +#ifdef CONFIG_SMP
2407 +asmlinkage void smp_irq_move_cleanup_interrupt(void)
2408 +{
2409 + unsigned vector, me;
2410 + ack_APIC_irq();
2411 + exit_idle();
2412 + irq_enter();
2413 +
2414 + me = smp_processor_id();
2415 + for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; vector++) {
2416 + unsigned int irq;
2417 + struct irq_desc *desc;
2418 + struct irq_cfg *cfg;
2419 + irq = __get_cpu_var(vector_irq)[vector];
2420 + if (irq >= NR_IRQS)
2421 + continue;
2422 +
2423 + desc = irq_desc + irq;
2424 + cfg = irq_cfg + irq;
2425 + spin_lock(&desc->lock);
2426 + if (!cfg->move_cleanup_count)
2427 + goto unlock;
2428 +
2429 + if ((vector == cfg->vector) && cpu_isset(me, cfg->domain))
2430 + goto unlock;
2431 +
2432 + __get_cpu_var(vector_irq)[vector] = -1;
2433 + cfg->move_cleanup_count--;
2434 +unlock:
2435 + spin_unlock(&desc->lock);
2436 + }
2437 +
2438 + irq_exit();
2439 +}
2440 +
2441 +static void irq_complete_move(unsigned int irq)
2442 +{
2443 + struct irq_cfg *cfg = irq_cfg + irq;
2444 + unsigned vector, me;
2445 +
2446 + if (likely(!cfg->move_in_progress))
2447 + return;
2448 +
2449 + vector = ~get_irq_regs()->orig_rax;
2450 + me = smp_processor_id();
2451 + if ((vector == cfg->vector) &&
2452 + cpu_isset(smp_processor_id(), cfg->domain)) {
2453 + cpumask_t cleanup_mask;
2454 +
2455 + cpus_and(cleanup_mask, cfg->old_domain, cpu_online_map);
2456 + cfg->move_cleanup_count = cpus_weight(cleanup_mask);
2457 + send_IPI_mask(cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);
2458 + cfg->move_in_progress = 0;
2459 + }
2460 +}
2461 +#else
2462 +static inline void irq_complete_move(unsigned int irq) {}
2463 +#endif
2464 +
2465 static void ack_apic_edge(unsigned int irq)
2466 {
2467 + irq_complete_move(irq);
2468 move_native_irq(irq);
2469 ack_APIC_irq();
2470 }
2471 @@ -1389,6 +1433,7 @@ static void ack_apic_level(unsigned int
2472 {
2473 int do_unmask_irq = 0;
2474
2475 + irq_complete_move(irq);
2476 #if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE)
2477 /* If we are moving the irq we need to mask it */
2478 if (unlikely(irq_desc[irq].status & IRQ_MOVE_PENDING)) {
2479 @@ -1440,7 +1485,7 @@ static inline void init_IO_APIC_traps(vo
2480 */
2481 for (irq = 0; irq < NR_IRQS ; irq++) {
2482 int tmp = irq;
2483 - if (IO_APIC_IRQ(tmp) && !irq_vector[tmp]) {
2484 + if (IO_APIC_IRQ(tmp) && !irq_cfg[tmp].vector) {
2485 /*
2486 * Hmm.. We don't have an entry for this,
2487 * so default to an old-fashioned 8259
2488 @@ -1538,7 +1583,7 @@ static inline void unlock_ExtINT_logic(v
2489
2490 entry1.dest_mode = 0; /* physical delivery */
2491 entry1.mask = 0; /* unmask IRQ now */
2492 - entry1.dest.physical.physical_dest = hard_smp_processor_id();
2493 + entry1.dest = hard_smp_processor_id();
2494 entry1.delivery_mode = dest_ExtINT;
2495 entry1.polarity = entry0.polarity;
2496 entry1.trigger = 0;
2497 @@ -1582,15 +1627,14 @@ static inline void unlock_ExtINT_logic(v
2498 */
2499 static inline void check_timer(void)
2500 {
2501 + struct irq_cfg *cfg = irq_cfg + 0;
2502 int apic1, pin1, apic2, pin2;
2503 - int vector;
2504 - cpumask_t mask;
2505
2506 /*
2507 * get/set the timer IRQ vector:
2508 */
2509 disable_8259A_irq(0);
2510 - vector = assign_irq_vector(0, TARGET_CPUS, &mask);
2511 + assign_irq_vector(0, TARGET_CPUS);
2512
2513 /*
2514 * Subtle, code in do_timer_interrupt() expects an AEOI
2515 @@ -1610,7 +1654,7 @@ static inline void check_timer(void)
2516 apic2 = ioapic_i8259.apic;
2517
2518 apic_printk(APIC_VERBOSE,KERN_INFO "..TIMER: vector=0x%02X apic1=%d pin1=%d apic2=%d pin2=%d\n",
2519 - vector, apic1, pin1, apic2, pin2);
2520 + cfg->vector, apic1, pin1, apic2, pin2);
2521
2522 if (pin1 != -1) {
2523 /*
2524 @@ -1641,7 +1685,7 @@ static inline void check_timer(void)
2525 /*
2526 * legacy devices should be connected to IO APIC #0
2527 */
2528 - setup_ExtINT_IRQ0_pin(apic2, pin2, vector);
2529 + setup_ExtINT_IRQ0_pin(apic2, pin2, cfg->vector);
2530 if (timer_irq_works()) {
2531 apic_printk(APIC_VERBOSE," works.\n");
2532 nmi_watchdog_default();
2533 @@ -1666,14 +1710,14 @@ static inline void check_timer(void)
2534
2535 disable_8259A_irq(0);
2536 irq_desc[0].chip = &lapic_irq_type;
2537 - apic_write(APIC_LVT0, APIC_DM_FIXED | vector); /* Fixed mode */
2538 + apic_write(APIC_LVT0, APIC_DM_FIXED | cfg->vector); /* Fixed mode */
2539 enable_8259A_irq(0);
2540
2541 if (timer_irq_works()) {
2542 apic_printk(APIC_VERBOSE," works.\n");
2543 return;
2544 }
2545 - apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | vector);
2546 + apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | cfg->vector);
2547 apic_printk(APIC_VERBOSE," failed.\n");
2548
2549 apic_printk(APIC_VERBOSE, KERN_INFO "...trying to set up timer as ExtINT IRQ...");
2550 @@ -1828,19 +1872,16 @@ int create_irq(void)
2551 /* Allocate an unused irq */
2552 int irq;
2553 int new;
2554 - int vector = 0;
2555 unsigned long flags;
2556 - cpumask_t mask;
2557
2558 irq = -ENOSPC;
2559 spin_lock_irqsave(&vector_lock, flags);
2560 for (new = (NR_IRQS - 1); new >= 0; new--) {
2561 if (platform_legacy_irq(new))
2562 continue;
2563 - if (irq_vector[new] != 0)
2564 + if (irq_cfg[new].vector != 0)
2565 continue;
2566 - vector = __assign_irq_vector(new, TARGET_CPUS, &mask);
2567 - if (likely(vector > 0))
2568 + if (__assign_irq_vector(new, TARGET_CPUS) == 0)
2569 irq = new;
2570 break;
2571 }
2572 @@ -1871,12 +1912,15 @@ void destroy_irq(unsigned int irq)
2573 #if defined(CONFIG_PCI_MSI) && !defined(CONFIG_XEN)
2574 static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_msg *msg)
2575 {
2576 - int vector;
2577 + struct irq_cfg *cfg = irq_cfg + irq;
2578 + int err;
2579 unsigned dest;
2580 cpumask_t tmp;
2581
2582 - vector = assign_irq_vector(irq, TARGET_CPUS, &tmp);
2583 - if (vector >= 0) {
2584 + tmp = TARGET_CPUS;
2585 + err = assign_irq_vector(irq, tmp);
2586 + if (!err) {
2587 + cpus_and(tmp, cfg->domain, tmp);
2588 dest = cpu_mask_to_apicid(tmp);
2589
2590 msg->address_hi = MSI_ADDR_BASE_HI;
2591 @@ -1896,40 +1940,38 @@ static int msi_compose_msg(struct pci_de
2592 ((INT_DELIVERY_MODE != dest_LowestPrio) ?
2593 MSI_DATA_DELIVERY_FIXED:
2594 MSI_DATA_DELIVERY_LOWPRI) |
2595 - MSI_DATA_VECTOR(vector);
2596 + MSI_DATA_VECTOR(cfg->vector);
2597 }
2598 - return vector;
2599 + return err;
2600 }
2601
2602 #ifdef CONFIG_SMP
2603 static void set_msi_irq_affinity(unsigned int irq, cpumask_t mask)
2604 {
2605 + struct irq_cfg *cfg = irq_cfg + irq;
2606 struct msi_msg msg;
2607 unsigned int dest;
2608 cpumask_t tmp;
2609 - int vector;
2610
2611 cpus_and(tmp, mask, cpu_online_map);
2612 if (cpus_empty(tmp))
2613 - tmp = TARGET_CPUS;
2614 -
2615 - cpus_and(mask, tmp, CPU_MASK_ALL);
2616 + return;
2617
2618 - vector = assign_irq_vector(irq, mask, &tmp);
2619 - if (vector < 0)
2620 + if (assign_irq_vector(irq, mask))
2621 return;
2622
2623 + cpus_and(tmp, cfg->domain, mask);
2624 dest = cpu_mask_to_apicid(tmp);
2625
2626 read_msi_msg(irq, &msg);
2627
2628 msg.data &= ~MSI_DATA_VECTOR_MASK;
2629 - msg.data |= MSI_DATA_VECTOR(vector);
2630 + msg.data |= MSI_DATA_VECTOR(cfg->vector);
2631 msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK;
2632 msg.address_lo |= MSI_ADDR_DEST_ID(dest);
2633
2634 write_msi_msg(irq, &msg);
2635 - set_native_irq_info(irq, mask);
2636 + irq_desc[irq].affinity = mask;
2637 }
2638 #endif /* CONFIG_SMP */
2639
2640 @@ -1948,24 +1990,31 @@ static struct irq_chip msi_chip = {
2641 .retrigger = ioapic_retrigger_irq,
2642 };
2643
2644 -int arch_setup_msi_irq(unsigned int irq, struct pci_dev *dev)
2645 +int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
2646 {
2647 struct msi_msg msg;
2648 - int ret;
2649 + int irq, ret;
2650 + irq = create_irq();
2651 + if (irq < 0)
2652 + return irq;
2653 +
2654 + set_irq_msi(irq, desc);
2655 ret = msi_compose_msg(dev, irq, &msg);
2656 - if (ret < 0)
2657 + if (ret < 0) {
2658 + destroy_irq(irq);
2659 return ret;
2660 + }
2661
2662 write_msi_msg(irq, &msg);
2663
2664 set_irq_chip_and_handler_name(irq, &msi_chip, handle_edge_irq, "edge");
2665
2666 - return 0;
2667 + return irq;
2668 }
2669
2670 void arch_teardown_msi_irq(unsigned int irq)
2671 {
2672 - return;
2673 + destroy_irq(irq);
2674 }
2675
2676 #endif /* CONFIG_PCI_MSI */
2677 @@ -1993,24 +2042,22 @@ static void target_ht_irq(unsigned int i
2678
2679 static void set_ht_irq_affinity(unsigned int irq, cpumask_t mask)
2680 {
2681 + struct irq_cfg *cfg = irq_cfg + irq;
2682 unsigned int dest;
2683 cpumask_t tmp;
2684 - int vector;
2685
2686 cpus_and(tmp, mask, cpu_online_map);
2687 if (cpus_empty(tmp))
2688 - tmp = TARGET_CPUS;
2689 -
2690 - cpus_and(mask, tmp, CPU_MASK_ALL);
2691 + return;
2692
2693 - vector = assign_irq_vector(irq, mask, &tmp);
2694 - if (vector < 0)
2695 + if (assign_irq_vector(irq, mask))
2696 return;
2697
2698 + cpus_and(tmp, cfg->domain, mask);
2699 dest = cpu_mask_to_apicid(tmp);
2700
2701 - target_ht_irq(irq, dest, vector);
2702 - set_native_irq_info(irq, mask);
2703 + target_ht_irq(irq, dest, cfg->vector);
2704 + irq_desc[irq].affinity = mask;
2705 }
2706 #endif
2707
2708 @@ -2027,14 +2074,17 @@ static struct irq_chip ht_irq_chip = {
2709
2710 int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev)
2711 {
2712 - int vector;
2713 + struct irq_cfg *cfg = irq_cfg + irq;
2714 + int err;
2715 cpumask_t tmp;
2716
2717 - vector = assign_irq_vector(irq, TARGET_CPUS, &tmp);
2718 - if (vector >= 0) {
2719 + tmp = TARGET_CPUS;
2720 + err = assign_irq_vector(irq, tmp);
2721 + if (!err) {
2722 struct ht_irq_msg msg;
2723 unsigned dest;
2724
2725 + cpus_and(tmp, cfg->domain, tmp);
2726 dest = cpu_mask_to_apicid(tmp);
2727
2728 msg.address_hi = HT_IRQ_HIGH_DEST_ID(dest);
2729 @@ -2042,7 +2092,7 @@ int arch_setup_ht_irq(unsigned int irq,
2730 msg.address_lo =
2731 HT_IRQ_LOW_BASE |
2732 HT_IRQ_LOW_DEST_ID(dest) |
2733 - HT_IRQ_LOW_VECTOR(vector) |
2734 + HT_IRQ_LOW_VECTOR(cfg->vector) |
2735 ((INT_DEST_MODE == 0) ?
2736 HT_IRQ_LOW_DM_PHYSICAL :
2737 HT_IRQ_LOW_DM_LOGICAL) |
2738 @@ -2057,7 +2107,7 @@ int arch_setup_ht_irq(unsigned int irq,
2739 set_irq_chip_and_handler_name(irq, &ht_irq_chip,
2740 handle_edge_irq, "edge");
2741 }
2742 - return vector;
2743 + return err;
2744 }
2745 #endif /* CONFIG_HT_IRQ */
2746
2747 @@ -2082,13 +2132,8 @@ int __init io_apic_get_redir_entries (in
2748 }
2749
2750
2751 -int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int active_high_low)
2752 +int io_apic_set_pci_routing (int ioapic, int pin, int irq, int triggering, int polarity)
2753 {
2754 - struct IO_APIC_route_entry entry;
2755 - unsigned long flags;
2756 - int vector;
2757 - cpumask_t mask;
2758 -
2759 if (!IO_APIC_IRQ(irq)) {
2760 apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n",
2761 ioapic);
2762 @@ -2101,42 +2146,7 @@ int io_apic_set_pci_routing (int ioapic,
2763 if (irq >= 16)
2764 add_pin_to_irq(irq, ioapic, pin);
2765
2766 -
2767 - vector = assign_irq_vector(irq, TARGET_CPUS, &mask);
2768 - if (vector < 0)
2769 - return vector;
2770 -
2771 - /*
2772 - * Generate a PCI IRQ routing entry and program the IOAPIC accordingly.
2773 - * Note that we mask (disable) IRQs now -- these get enabled when the
2774 - * corresponding device driver registers for this IRQ.
2775 - */
2776 -
2777 - memset(&entry,0,sizeof(entry));
2778 -
2779 - entry.delivery_mode = INT_DELIVERY_MODE;
2780 - entry.dest_mode = INT_DEST_MODE;
2781 - entry.dest.logical.logical_dest = cpu_mask_to_apicid(mask);
2782 - entry.trigger = edge_level;
2783 - entry.polarity = active_high_low;
2784 - entry.mask = 1; /* Disabled (masked) */
2785 - entry.vector = vector & 0xff;
2786 -
2787 - apic_printk(APIC_VERBOSE,KERN_DEBUG "IOAPIC[%d]: Set PCI routing entry (%d-%d -> 0x%x -> "
2788 - "IRQ %d Mode:%i Active:%i)\n", ioapic,
2789 - mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq,
2790 - edge_level, active_high_low);
2791 -
2792 - ioapic_register_intr(irq, entry.vector, edge_level);
2793 -
2794 - if (!ioapic && (irq < 16))
2795 - disable_8259A_irq(irq);
2796 -
2797 - ioapic_write_entry(ioapic, pin, entry);
2798 -
2799 - spin_lock_irqsave(&ioapic_lock, flags);
2800 - set_native_irq_info(irq, TARGET_CPUS);
2801 - spin_unlock_irqrestore(&ioapic_lock, flags);
2802 + setup_IO_APIC_irq(ioapic, pin, irq, triggering, polarity);
2803
2804 return 0;
2805 }
2806 @@ -2169,8 +2179,10 @@ void __init setup_ioapic_dest(void)
2807 * when you have too many devices, because at that time only boot
2808 * cpu is online.
2809 */
2810 - if(!irq_vector[irq])
2811 - setup_IO_APIC_irq(ioapic, pin, irq_entry, irq);
2812 + if (!irq_cfg[irq].vector)
2813 + setup_IO_APIC_irq(ioapic, pin, irq,
2814 + irq_trigger(irq_entry),
2815 + irq_polarity(irq_entry));
2816 else
2817 set_ioapic_affinity_irq(irq, TARGET_CPUS);
2818 }
2819 --- sle11-2009-05-14.orig/arch/x86/kernel/irq_64-xen.c 2008-12-15 11:26:44.000000000 +0100
2820 +++ sle11-2009-05-14/arch/x86/kernel/irq_64-xen.c 2009-03-04 11:25:55.000000000 +0100
2821 @@ -18,6 +18,7 @@
2822 #include <asm/uaccess.h>
2823 #include <asm/io_apic.h>
2824 #include <asm/idle.h>
2825 +#include <asm/smp.h>
2826
2827 atomic_t irq_err_count;
2828
2829 @@ -120,9 +121,15 @@ asmlinkage unsigned int do_IRQ(struct pt
2830
2831 if (likely(irq < NR_IRQS))
2832 generic_handle_irq(irq);
2833 - else if (printk_ratelimit())
2834 - printk(KERN_EMERG "%s: %d.%d No irq handler for irq\n",
2835 - __func__, smp_processor_id(), irq);
2836 + else {
2837 +#ifndef CONFIG_XEN
2838 + if (!disable_apic)
2839 + ack_APIC_irq();
2840 +#endif
2841 + if (printk_ratelimit())
2842 + printk(KERN_EMERG "%s: %d.%d No irq handler for irq\n",
2843 + __func__, smp_processor_id(), irq);
2844 + }
2845
2846 /*irq_exit();*/
2847
2848 --- sle11-2009-05-14.orig/arch/x86/kernel/mpparse_64-xen.c 2008-12-15 11:26:44.000000000 +0100
2849 +++ sle11-2009-05-14/arch/x86/kernel/mpparse_64-xen.c 2009-03-04 11:25:55.000000000 +0100
2850 @@ -60,9 +60,9 @@ unsigned long mp_lapic_addr = 0;
2851 /* Processor that is doing the boot up */
2852 unsigned int boot_cpu_id = -1U;
2853 /* Internal processor count */
2854 -unsigned int num_processors __initdata = 0;
2855 +unsigned int num_processors __cpuinitdata = 0;
2856
2857 -unsigned disabled_cpus __initdata;
2858 +unsigned disabled_cpus __cpuinitdata;
2859
2860 /* Bitmask of physically existing CPUs */
2861 physid_mask_t phys_cpu_present_map = PHYSID_MASK_NONE;
2862 @@ -808,7 +808,7 @@ int mp_register_gsi(u32 gsi, int trigger
2863 return gsi;
2864
2865 /* Don't set up the ACPI SCI because it's already set up */
2866 - if (acpi_fadt.sci_int == gsi)
2867 + if (acpi_gbl_FADT.sci_interrupt == gsi)
2868 return gsi;
2869
2870 ioapic = mp_find_ioapic(gsi);
2871 --- sle11-2009-05-14.orig/arch/x86/kernel/process_64-xen.c 2008-12-15 11:26:44.000000000 +0100
2872 +++ sle11-2009-05-14/arch/x86/kernel/process_64-xen.c 2009-03-04 11:25:55.000000000 +0100
2873 @@ -338,14 +338,17 @@ void load_gs_index(unsigned gs)
2874 void flush_thread(void)
2875 {
2876 struct task_struct *tsk = current;
2877 - struct thread_info *t = current_thread_info();
2878
2879 - if (t->flags & _TIF_ABI_PENDING) {
2880 - t->flags ^= (_TIF_ABI_PENDING | _TIF_IA32);
2881 - if (t->flags & _TIF_IA32)
2882 + if (test_tsk_thread_flag(tsk, TIF_ABI_PENDING)) {
2883 + clear_tsk_thread_flag(tsk, TIF_ABI_PENDING);
2884 + if (test_tsk_thread_flag(tsk, TIF_IA32)) {
2885 + clear_tsk_thread_flag(tsk, TIF_IA32);
2886 + } else {
2887 + set_tsk_thread_flag(tsk, TIF_IA32);
2888 current_thread_info()->status |= TS_COMPAT;
2889 + }
2890 }
2891 - t->flags &= ~_TIF_DEBUG;
2892 + clear_tsk_thread_flag(tsk, TIF_DEBUG);
2893
2894 tsk->thread.debugreg0 = 0;
2895 tsk->thread.debugreg1 = 0;
2896 --- sle11-2009-05-14.orig/arch/x86/kernel/setup_64-xen.c 2008-12-15 11:26:44.000000000 +0100
2897 +++ sle11-2009-05-14/arch/x86/kernel/setup_64-xen.c 2009-03-04 11:25:55.000000000 +0100
2898 @@ -141,7 +141,7 @@ EXPORT_SYMBOL_GPL(edid_info);
2899
2900 extern int root_mountflags;
2901
2902 -char command_line[COMMAND_LINE_SIZE];
2903 +char __initdata command_line[COMMAND_LINE_SIZE];
2904
2905 struct resource standard_io_resources[] = {
2906 { .name = "dma1", .start = 0x00, .end = 0x1f,
2907 @@ -179,134 +179,6 @@ struct resource code_resource = {
2908 .flags = IORESOURCE_RAM,
2909 };
2910
2911 -#define IORESOURCE_ROM (IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM)
2912 -
2913 -static struct resource system_rom_resource = {
2914 - .name = "System ROM",
2915 - .start = 0xf0000,
2916 - .end = 0xfffff,
2917 - .flags = IORESOURCE_ROM,
2918 -};
2919 -
2920 -static struct resource extension_rom_resource = {
2921 - .name = "Extension ROM",
2922 - .start = 0xe0000,
2923 - .end = 0xeffff,
2924 - .flags = IORESOURCE_ROM,
2925 -};
2926 -
2927 -static struct resource adapter_rom_resources[] = {
2928 - { .name = "Adapter ROM", .start = 0xc8000, .end = 0,
2929 - .flags = IORESOURCE_ROM },
2930 - { .name = "Adapter ROM", .start = 0, .end = 0,
2931 - .flags = IORESOURCE_ROM },
2932 - { .name = "Adapter ROM", .start = 0, .end = 0,
2933 - .flags = IORESOURCE_ROM },
2934 - { .name = "Adapter ROM", .start = 0, .end = 0,
2935 - .flags = IORESOURCE_ROM },
2936 - { .name = "Adapter ROM", .start = 0, .end = 0,
2937 - .flags = IORESOURCE_ROM },
2938 - { .name = "Adapter ROM", .start = 0, .end = 0,
2939 - .flags = IORESOURCE_ROM }
2940 -};
2941 -
2942 -static struct resource video_rom_resource = {
2943 - .name = "Video ROM",
2944 - .start = 0xc0000,
2945 - .end = 0xc7fff,
2946 - .flags = IORESOURCE_ROM,
2947 -};
2948 -
2949 -static struct resource video_ram_resource = {
2950 - .name = "Video RAM area",
2951 - .start = 0xa0000,
2952 - .end = 0xbffff,
2953 - .flags = IORESOURCE_RAM,
2954 -};
2955 -
2956 -#define romsignature(x) (*(unsigned short *)(x) == 0xaa55)
2957 -
2958 -static int __init romchecksum(unsigned char *rom, unsigned long length)
2959 -{
2960 - unsigned char *p, sum = 0;
2961 -
2962 - for (p = rom; p < rom + length; p++)
2963 - sum += *p;
2964 - return sum == 0;
2965 -}
2966 -
2967 -static void __init probe_roms(void)
2968 -{
2969 - unsigned long start, length, upper;
2970 - unsigned char *rom;
2971 - int i;
2972 -
2973 -#ifdef CONFIG_XEN
2974 - /* Nothing to do if not running in dom0. */
2975 - if (!is_initial_xendomain())
2976 - return;
2977 -#endif
2978 -
2979 - /* video rom */
2980 - upper = adapter_rom_resources[0].start;
2981 - for (start = video_rom_resource.start; start < upper; start += 2048) {
2982 - rom = isa_bus_to_virt(start);
2983 - if (!romsignature(rom))
2984 - continue;
2985 -
2986 - video_rom_resource.start = start;
2987 -
2988 - /* 0 < length <= 0x7f * 512, historically */
2989 - length = rom[2] * 512;
2990 -
2991 - /* if checksum okay, trust length byte */
2992 - if (length && romchecksum(rom, length))
2993 - video_rom_resource.end = start + length - 1;
2994 -
2995 - request_resource(&iomem_resource, &video_rom_resource);
2996 - break;
2997 - }
2998 -
2999 - start = (video_rom_resource.end + 1 + 2047) & ~2047UL;
3000 - if (start < upper)
3001 - start = upper;
3002 -
3003 - /* system rom */
3004 - request_resource(&iomem_resource, &system_rom_resource);
3005 - upper = system_rom_resource.start;
3006 -
3007 - /* check for extension rom (ignore length byte!) */
3008 - rom = isa_bus_to_virt(extension_rom_resource.start);
3009 - if (romsignature(rom)) {
3010 - length = extension_rom_resource.end - extension_rom_resource.start + 1;
3011 - if (romchecksum(rom, length)) {
3012 - request_resource(&iomem_resource, &extension_rom_resource);
3013 - upper = extension_rom_resource.start;
3014 - }
3015 - }
3016 -
3017 - /* check for adapter roms on 2k boundaries */
3018 - for (i = 0; i < ARRAY_SIZE(adapter_rom_resources) && start < upper;
3019 - start += 2048) {
3020 - rom = isa_bus_to_virt(start);
3021 - if (!romsignature(rom))
3022 - continue;
3023 -
3024 - /* 0 < length <= 0x7f * 512, historically */
3025 - length = rom[2] * 512;
3026 -
3027 - /* but accept any length that fits if checksum okay */
3028 - if (!length || start + length > upper || !romchecksum(rom, length))
3029 - continue;
3030 -
3031 - adapter_rom_resources[i].start = start;
3032 - adapter_rom_resources[i].end = start + length - 1;
3033 - request_resource(&iomem_resource, &adapter_rom_resources[i]);
3034 -
3035 - start = adapter_rom_resources[i++].end & ~2047UL;
3036 - }
3037 -}
3038 -
3039 #ifdef CONFIG_PROC_VMCORE
3040 /* elfcorehdr= specifies the location of elf core header
3041 * stored by the crashed kernel. This option will be passed
3042 @@ -403,7 +275,7 @@ void __init setup_arch(char **cmdline_p)
3043 #ifdef CONFIG_XEN
3044 extern struct e820map machine_e820;
3045
3046 - printk(KERN_INFO "Command line: %s\n", saved_command_line);
3047 + printk(KERN_INFO "Command line: %s\n", boot_command_line);
3048
3049 /* Register a call for panic conditions. */
3050 atomic_notifier_chain_register(&panic_notifier_list, &xen_panic_block);
3051 @@ -430,7 +302,7 @@ void __init setup_arch(char **cmdline_p)
3052
3053 ARCH_SETUP
3054 #else
3055 - printk(KERN_INFO "Command line: %s\n", saved_command_line);
3056 + printk(KERN_INFO "Command line: %s\n", boot_command_line);
3057
3058 ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
3059 screen_info = SCREEN_INFO;
3060 @@ -461,7 +333,7 @@ void __init setup_arch(char **cmdline_p)
3061
3062 early_identify_cpu(&boot_cpu_data);
3063
3064 - strlcpy(command_line, saved_command_line, COMMAND_LINE_SIZE);
3065 + strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
3066 *cmdline_p = command_line;
3067
3068 parse_early_param();
3069 @@ -531,6 +403,11 @@ void __init setup_arch(char **cmdline_p)
3070 /* reserve ebda region */
3071 if (ebda_addr)
3072 reserve_bootmem_generic(ebda_addr, ebda_size);
3073 +#ifdef CONFIG_NUMA
3074 + /* reserve nodemap region */
3075 + if (nodemap_addr)
3076 + reserve_bootmem_generic(nodemap_addr, nodemap_size);
3077 +#endif
3078
3079 #ifdef CONFIG_SMP
3080 /*
3081 @@ -731,10 +608,8 @@ void __init setup_arch(char **cmdline_p)
3082 #endif
3083
3084 /*
3085 - * Request address space for all standard RAM and ROM resources
3086 - * and also for regions reported as reserved by the e820.
3087 + * We trust e820 completely. No explicit ROM probing in memory.
3088 */
3089 - probe_roms();
3090 #ifdef CONFIG_XEN
3091 if (is_initial_xendomain())
3092 e820_reserve_resources(machine_e820.map, machine_e820.nr_map);
3093 @@ -743,8 +618,6 @@ void __init setup_arch(char **cmdline_p)
3094 e820_mark_nosave_regions();
3095 #endif
3096
3097 - request_resource(&iomem_resource, &video_ram_resource);
3098 -
3099 {
3100 unsigned i;
3101 /* request I/O space for devices used on all i[345]86 PCs */
3102 @@ -1321,7 +1194,8 @@ static int show_cpuinfo(struct seq_file
3103 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
3104 NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL,
3105 NULL, NULL, NULL, NULL, "nx", NULL, "mmxext", NULL,
3106 - NULL, "fxsr_opt", NULL, "rdtscp", NULL, "lm", "3dnowext", "3dnow",
3107 + NULL, "fxsr_opt", "pdpe1gb", "rdtscp", NULL, "lm",
3108 + "3dnowext", "3dnow",
3109
3110 /* Transmeta-defined */
3111 "recovery", "longrun", NULL, "lrti", NULL, NULL, NULL, NULL,
3112 @@ -1339,7 +1213,7 @@ static int show_cpuinfo(struct seq_file
3113 /* Intel-defined (#2) */
3114 "pni", NULL, NULL, "monitor", "ds_cpl", "vmx", "smx", "est",
3115 "tm2", "ssse3", "cid", NULL, NULL, "cx16", "xtpr", NULL,
3116 - NULL, NULL, "dca", NULL, NULL, NULL, NULL, NULL,
3117 + NULL, NULL, "dca", NULL, NULL, NULL, NULL, "popcnt",
3118 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
3119
3120 /* VIA/Cyrix/Centaur-defined */
3121 @@ -1349,8 +1223,10 @@ static int show_cpuinfo(struct seq_file
3122 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
3123
3124 /* AMD-defined (#2) */
3125 - "lahf_lm", "cmp_legacy", "svm", NULL, "cr8_legacy", NULL, NULL, NULL,
3126 - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
3127 + "lahf_lm", "cmp_legacy", "svm", "extapic", "cr8_legacy",
3128 + "altmovcr8", "abm", "sse4a",
3129 + "misalignsse", "3dnowprefetch",
3130 + "osvw", "ibs", NULL, NULL, NULL, NULL,
3131 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
3132 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
3133 };
3134 @@ -1361,6 +1237,9 @@ static int show_cpuinfo(struct seq_file
3135 "ttp", /* thermal trip */
3136 "tm",
3137 "stc",
3138 + "100mhzsteps",
3139 + "hwpstate",
3140 + NULL, /* tsc invariant mapped to constant_tsc */
3141 NULL,
3142 /* nothing */ /* constant_tsc - moved to flags */
3143 };
3144 @@ -1477,26 +1356,3 @@ struct seq_operations cpuinfo_op = {
3145 .stop = c_stop,
3146 .show = show_cpuinfo,
3147 };
3148 -
3149 -#if defined(CONFIG_INPUT_PCSPKR) || defined(CONFIG_INPUT_PCSPKR_MODULE)
3150 -#include <linux/platform_device.h>
3151 -static __init int add_pcspkr(void)
3152 -{
3153 - struct platform_device *pd;
3154 - int ret;
3155 -
3156 - if (!is_initial_xendomain())
3157 - return 0;
3158 -
3159 - pd = platform_device_alloc("pcspkr", -1);
3160 - if (!pd)
3161 - return -ENOMEM;
3162 -
3163 - ret = platform_device_add(pd);
3164 - if (ret)
3165 - platform_device_put(pd);
3166 -
3167 - return ret;
3168 -}
3169 -device_initcall(add_pcspkr);
3170 -#endif
3171 --- sle11-2009-05-14.orig/arch/x86/kernel/vsyscall_64-xen.c 2008-12-15 11:26:44.000000000 +0100
3172 +++ sle11-2009-05-14/arch/x86/kernel/vsyscall_64-xen.c 2009-03-04 11:25:55.000000000 +0100
3173 @@ -26,6 +26,7 @@
3174 #include <linux/seqlock.h>
3175 #include <linux/jiffies.h>
3176 #include <linux/sysctl.h>
3177 +#include <linux/clocksource.h>
3178 #include <linux/getcpu.h>
3179 #include <linux/cpu.h>
3180 #include <linux/smp.h>
3181 @@ -34,6 +35,7 @@
3182 #include <asm/vsyscall.h>
3183 #include <asm/pgtable.h>
3184 #include <asm/page.h>
3185 +#include <asm/unistd.h>
3186 #include <asm/fixmap.h>
3187 #include <asm/errno.h>
3188 #include <asm/io.h>
3189 @@ -44,56 +46,41 @@
3190 #define __vsyscall(nr) __attribute__ ((unused,__section__(".vsyscall_" #nr)))
3191 #define __syscall_clobber "r11","rcx","memory"
3192
3193 -int __sysctl_vsyscall __section_sysctl_vsyscall = 1;
3194 -seqlock_t __xtime_lock __section_xtime_lock = SEQLOCK_UNLOCKED;
3195 +struct vsyscall_gtod_data_t {
3196 + seqlock_t lock;
3197 + int sysctl_enabled;
3198 + struct timeval wall_time_tv;
3199 + struct timezone sys_tz;
3200 + cycle_t offset_base;
3201 + struct clocksource clock;
3202 +};
3203 int __vgetcpu_mode __section_vgetcpu_mode;
3204
3205 -#include <asm/unistd.h>
3206 -
3207 -static __always_inline void timeval_normalize(struct timeval * tv)
3208 +struct vsyscall_gtod_data_t __vsyscall_gtod_data __section_vsyscall_gtod_data =
3209 {
3210 - time_t __sec;
3211 -
3212 - __sec = tv->tv_usec / 1000000;
3213 - if (__sec) {
3214 - tv->tv_usec %= 1000000;
3215 - tv->tv_sec += __sec;
3216 - }
3217 -}
3218 + .lock = SEQLOCK_UNLOCKED,
3219 + .sysctl_enabled = 1,
3220 +};
3221
3222 -static __always_inline void do_vgettimeofday(struct timeval * tv)
3223 +void update_vsyscall(struct timespec *wall_time, struct clocksource *clock)
3224 {
3225 - long sequence, t;
3226 - unsigned long sec, usec;
3227 + unsigned long flags;
3228
3229 - do {
3230 - sequence = read_seqbegin(&__xtime_lock);
3231 -
3232 - sec = __xtime.tv_sec;
3233 - usec = __xtime.tv_nsec / 1000;
3234 -
3235 - if (__vxtime.mode != VXTIME_HPET) {
3236 - t = get_cycles_sync();
3237 - if (t < __vxtime.last_tsc)
3238 - t = __vxtime.last_tsc;
3239 - usec += ((t - __vxtime.last_tsc) *
3240 - __vxtime.tsc_quot) >> 32;
3241 - /* See comment in x86_64 do_gettimeofday. */
3242 - } else {
3243 - usec += ((readl((void __iomem *)
3244 - fix_to_virt(VSYSCALL_HPET) + 0xf0) -
3245 - __vxtime.last) * __vxtime.quot) >> 32;
3246 - }
3247 - } while (read_seqretry(&__xtime_lock, sequence));
3248 -
3249 - tv->tv_sec = sec + usec / 1000000;
3250 - tv->tv_usec = usec % 1000000;
3251 + write_seqlock_irqsave(&vsyscall_gtod_data.lock, flags);
3252 + /* copy vsyscall data */
3253 + vsyscall_gtod_data.clock = *clock;
3254 + vsyscall_gtod_data.wall_time_tv.tv_sec = wall_time->tv_sec;
3255 + vsyscall_gtod_data.wall_time_tv.tv_usec = wall_time->tv_nsec/1000;
3256 + vsyscall_gtod_data.sys_tz = sys_tz;
3257 + write_sequnlock_irqrestore(&vsyscall_gtod_data.lock, flags);
3258 }
3259
3260 -/* RED-PEN may want to readd seq locking, but then the variable should be write-once. */
3261 +/* RED-PEN may want to readd seq locking, but then the variable should be
3262 + * write-once.
3263 + */
3264 static __always_inline void do_get_tz(struct timezone * tz)
3265 {
3266 - *tz = __sys_tz;
3267 + *tz = __vsyscall_gtod_data.sys_tz;
3268 }
3269
3270 static __always_inline int gettimeofday(struct timeval *tv, struct timezone *tz)
3271 @@ -101,7 +88,8 @@ static __always_inline int gettimeofday(
3272 int ret;
3273 asm volatile("vsysc2: syscall"
3274 : "=a" (ret)
3275 - : "0" (__NR_gettimeofday),"D" (tv),"S" (tz) : __syscall_clobber );
3276 + : "0" (__NR_gettimeofday),"D" (tv),"S" (tz)
3277 + : __syscall_clobber );
3278 return ret;
3279 }
3280
3281 @@ -114,10 +102,44 @@ static __always_inline long time_syscall
3282 return secs;
3283 }
3284
3285 +static __always_inline void do_vgettimeofday(struct timeval * tv)
3286 +{
3287 + cycle_t now, base, mask, cycle_delta;
3288 + unsigned long seq, mult, shift, nsec_delta;
3289 + cycle_t (*vread)(void);
3290 + do {
3291 + seq = read_seqbegin(&__vsyscall_gtod_data.lock);
3292 +
3293 + vread = __vsyscall_gtod_data.clock.vread;
3294 + if (unlikely(!__vsyscall_gtod_data.sysctl_enabled || !vread)) {
3295 + gettimeofday(tv,NULL);
3296 + return;
3297 + }
3298 + now = vread();
3299 + base = __vsyscall_gtod_data.clock.cycle_last;
3300 + mask = __vsyscall_gtod_data.clock.mask;
3301 + mult = __vsyscall_gtod_data.clock.mult;
3302 + shift = __vsyscall_gtod_data.clock.shift;
3303 +
3304 + *tv = __vsyscall_gtod_data.wall_time_tv;
3305 +
3306 + } while (read_seqretry(&__vsyscall_gtod_data.lock, seq));
3307 +
3308 + /* calculate interval: */
3309 + cycle_delta = (now - base) & mask;
3310 + /* convert to nsecs: */
3311 + nsec_delta = (cycle_delta * mult) >> shift;
3312 +
3313 + /* convert to usecs and add to timespec: */
3314 + tv->tv_usec += nsec_delta / NSEC_PER_USEC;
3315 + while (tv->tv_usec > USEC_PER_SEC) {
3316 + tv->tv_sec += 1;
3317 + tv->tv_usec -= USEC_PER_SEC;
3318 + }
3319 +}
3320 +
3321 int __vsyscall(0) vgettimeofday(struct timeval * tv, struct timezone * tz)
3322 {
3323 - if (!__sysctl_vsyscall)
3324 - return gettimeofday(tv,tz);
3325 if (tv)
3326 do_vgettimeofday(tv);
3327 if (tz)
3328 @@ -129,11 +151,11 @@ int __vsyscall(0) vgettimeofday(struct t
3329 * unlikely */
3330 time_t __vsyscall(1) vtime(time_t *t)
3331 {
3332 - if (!__sysctl_vsyscall)
3333 + if (unlikely(!__vsyscall_gtod_data.sysctl_enabled))
3334 return time_syscall(t);
3335 else if (t)
3336 - *t = __xtime.tv_sec;
3337 - return __xtime.tv_sec;
3338 + *t = __vsyscall_gtod_data.wall_time_tv.tv_sec;
3339 + return __vsyscall_gtod_data.wall_time_tv.tv_sec;
3340 }
3341
3342 /* Fast way to get current CPU and node.
3343 @@ -210,7 +232,7 @@ static int vsyscall_sysctl_change(ctl_ta
3344 ret = -ENOMEM;
3345 goto out;
3346 }
3347 - if (!sysctl_vsyscall) {
3348 + if (!vsyscall_gtod_data.sysctl_enabled) {
3349 writew(SYSCALL, map1);
3350 writew(SYSCALL, map2);
3351 } else {
3352 @@ -232,16 +254,17 @@ static int vsyscall_sysctl_nostrat(ctl_t
3353
3354 static ctl_table kernel_table2[] = {
3355 { .ctl_name = 99, .procname = "vsyscall64",
3356 - .data = &sysctl_vsyscall, .maxlen = sizeof(int), .mode = 0644,
3357 + .data = &vsyscall_gtod_data.sysctl_enabled, .maxlen = sizeof(int),
3358 + .mode = 0644,
3359 .strategy = vsyscall_sysctl_nostrat,
3360 .proc_handler = vsyscall_sysctl_change },
3361 - { 0, }
3362 + {}
3363 };
3364
3365 static ctl_table kernel_root_table2[] = {
3366 { .ctl_name = CTL_KERN, .procname = "kernel", .mode = 0555,
3367 .child = kernel_table2 },
3368 - { 0 },
3369 + {}
3370 };
3371
3372 #endif
3373 @@ -304,14 +327,14 @@ static int __init vsyscall_init(void)
3374 BUG_ON((unsigned long) &vgetcpu != VSYSCALL_ADDR(__NR_vgetcpu));
3375 map_vsyscall();
3376 #ifdef CONFIG_XEN
3377 - sysctl_vsyscall = 0; /* disable vgettimeofay() */
3378 + vsyscall_gtod_data.sysctl_enabled = 0; /* disable vgettimeofay() */
3379 if (boot_cpu_has(X86_FEATURE_RDTSCP))
3380 vgetcpu_mode = VGETCPU_RDTSCP;
3381 else
3382 vgetcpu_mode = VGETCPU_LSL;
3383 #endif
3384 #ifdef CONFIG_SYSCTL
3385 - register_sysctl_table(kernel_root_table2, 0);
3386 + register_sysctl_table(kernel_root_table2);
3387 #endif
3388 on_each_cpu(cpu_vsyscall_init, NULL, 0, 1);
3389 hotcpu_notifier(cpu_vsyscall_notifier, 0);
3390 --- sle11-2009-05-14.orig/arch/x86/mm/fault_64-xen.c 2008-12-15 11:26:44.000000000 +0100
3391 +++ sle11-2009-05-14/arch/x86/mm/fault_64-xen.c 2009-03-04 11:25:55.000000000 +0100
3392 @@ -56,38 +56,17 @@ int unregister_page_fault_notifier(struc
3393 }
3394 EXPORT_SYMBOL_GPL(unregister_page_fault_notifier);
3395
3396 -static inline int notify_page_fault(enum die_val val, const char *str,
3397 - struct pt_regs *regs, long err, int trap, int sig)
3398 +static inline int notify_page_fault(struct pt_regs *regs, long err)
3399 {
3400 struct die_args args = {
3401 .regs = regs,
3402 - .str = str,
3403 + .str = "page fault",
3404 .err = err,
3405 - .trapnr = trap,
3406 - .signr = sig
3407 + .trapnr = 14,
3408 + .signr = SIGSEGV
3409 };
3410 - return atomic_notifier_call_chain(&notify_page_fault_chain, val, &args);
3411 -}
3412 -
3413 -void bust_spinlocks(int yes)
3414 -{
3415 - int loglevel_save = console_loglevel;
3416 - if (yes) {
3417 - oops_in_progress = 1;
3418 - } else {
3419 -#ifdef CONFIG_VT
3420 - unblank_screen();
3421 -#endif
3422 - oops_in_progress = 0;
3423 - /*
3424 - * OK, the message is on the console. Now we call printk()
3425 - * without oops_in_progress set so that printk will give klogd
3426 - * a poke. Hold onto your hats...
3427 - */
3428 - console_loglevel = 15; /* NMI oopser may have shut the console up */
3429 - printk(" ");
3430 - console_loglevel = loglevel_save;
3431 - }
3432 + return atomic_notifier_call_chain(&notify_page_fault_chain,
3433 + DIE_PAGE_FAULT, &args);
3434 }
3435
3436 /* Sometimes the CPU reports invalid exceptions on prefetch.
3437 @@ -437,8 +416,7 @@ asmlinkage void __kprobes do_page_fault(
3438 /* Can take a spurious fault if mapping changes R/O -> R/W. */
3439 if (spurious_fault(regs, address, error_code))
3440 return;
3441 - if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
3442 - SIGSEGV) == NOTIFY_STOP)
3443 + if (notify_page_fault(regs, error_code) == NOTIFY_STOP)
3444 return;
3445 /*
3446 * Don't take the mm semaphore here. If we fixup a prefetch
3447 @@ -447,8 +425,7 @@ asmlinkage void __kprobes do_page_fault(
3448 goto bad_area_nosemaphore;
3449 }
3450
3451 - if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
3452 - SIGSEGV) == NOTIFY_STOP)
3453 + if (notify_page_fault(regs, error_code) == NOTIFY_STOP)
3454 return;
3455
3456 if (likely(regs->eflags & X86_EFLAGS_IF))
3457 --- sle11-2009-05-14.orig/arch/x86/mm/init_64-xen.c 2008-12-15 11:26:44.000000000 +0100
3458 +++ sle11-2009-05-14/arch/x86/mm/init_64-xen.c 2009-03-04 11:25:55.000000000 +0100
3459 @@ -1108,20 +1108,30 @@ int kern_addr_valid(unsigned long addr)
3460 extern int exception_trace, page_fault_trace;
3461
3462 static ctl_table debug_table2[] = {
3463 - { 99, "exception-trace", &exception_trace, sizeof(int), 0644, NULL,
3464 - proc_dointvec },
3465 - { 0, }
3466 + {
3467 + .ctl_name = 99,
3468 + .procname = "exception-trace",
3469 + .data = &exception_trace,
3470 + .maxlen = sizeof(int),
3471 + .mode = 0644,
3472 + .proc_handler = proc_dointvec
3473 + },
3474 + {}
3475 };
3476
3477 static ctl_table debug_root_table2[] = {
3478 - { .ctl_name = CTL_DEBUG, .procname = "debug", .mode = 0555,
3479 - .child = debug_table2 },
3480 - { 0 },
3481 + {
3482 + .ctl_name = CTL_DEBUG,
3483 + .procname = "debug",
3484 + .mode = 0555,
3485 + .child = debug_table2
3486 + },
3487 + {}
3488 };
3489
3490 static __init int x8664_sysctl_init(void)
3491 {
3492 - register_sysctl_table(debug_root_table2, 1);
3493 + register_sysctl_table(debug_root_table2);
3494 return 0;
3495 }
3496 __initcall(x8664_sysctl_init);
3497 --- sle11-2009-05-14.orig/arch/x86/mm/pageattr_64-xen.c 2008-12-15 11:26:44.000000000 +0100
3498 +++ sle11-2009-05-14/arch/x86/mm/pageattr_64-xen.c 2009-03-04 11:25:55.000000000 +0100
3499 @@ -350,8 +350,8 @@ static void flush_kernel_map(void *arg)
3500 void *adr = page_address(pg);
3501 if (cpu_has_clflush)
3502 cache_flush_page(adr);
3503 - __flush_tlb_one(adr);
3504 }
3505 + __flush_tlb_all();
3506 }
3507
3508 static inline void flush_map(struct list_head *l)
3509 @@ -376,6 +376,7 @@ static void revert_page(unsigned long ad
3510 pud_t *pud;
3511 pmd_t *pmd;
3512 pte_t large_pte;
3513 + unsigned long pfn;
3514
3515 pgd = pgd_offset_k(address);
3516 BUG_ON(pgd_none(*pgd));
3517 @@ -383,7 +384,8 @@ static void revert_page(unsigned long ad
3518 BUG_ON(pud_none(*pud));
3519 pmd = pmd_offset(pud, address);
3520 BUG_ON(__pmd_val(*pmd) & _PAGE_PSE);
3521 - large_pte = mk_pte_phys(__pa(address) & LARGE_PAGE_MASK, ref_prot);
3522 + pfn = (__pa(address) & LARGE_PAGE_MASK) >> PAGE_SHIFT;
3523 + large_pte = pfn_pte(pfn, ref_prot);
3524 large_pte = pte_mkhuge(large_pte);
3525 set_pte((pte_t *)pmd, large_pte);
3526 }
3527 --- sle11-2009-05-14.orig/drivers/acpi/processor_extcntl.c 2009-02-16 15:58:14.000000000 +0100
3528 +++ sle11-2009-05-14/drivers/acpi/processor_extcntl.c 2009-03-04 11:25:55.000000000 +0100
3529 @@ -32,9 +32,8 @@
3530
3531 #define ACPI_PROCESSOR_COMPONENT 0x01000000
3532 #define ACPI_PROCESSOR_CLASS "processor"
3533 -#define ACPI_PROCESSOR_DRIVER_NAME "ACPI Processor Driver"
3534 #define _COMPONENT ACPI_PROCESSOR_COMPONENT
3535 -ACPI_MODULE_NAME("acpi_processor")
3536 +ACPI_MODULE_NAME("processor_extcntl")
3537
3538 static int processor_extcntl_parse_csd(struct acpi_processor *pr);
3539 static int processor_extcntl_get_performance(struct acpi_processor *pr);
3540 @@ -56,24 +55,17 @@ static int processor_notify_smm(void)
3541 return 0;
3542
3543 /* Can't write pstate_cnt to smi_cmd if either value is zero */
3544 - if ((!acpi_fadt.smi_cmd) || (!acpi_fadt.pstate_cnt)) {
3545 + if (!acpi_gbl_FADT.smi_command || !acpi_gbl_FADT.pstate_control) {
3546 ACPI_DEBUG_PRINT((ACPI_DB_INFO,"No SMI port or pstate_cnt\n"));
3547 return 0;
3548 }
3549
3550 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
3551 "Writing pstate_cnt [0x%x] to smi_cmd [0x%x]\n",
3552 - acpi_fadt.pstate_cnt, acpi_fadt.smi_cmd));
3553 + acpi_gbl_FADT.pstate_control, acpi_gbl_FADT.smi_command));
3554
3555 - /* FADT v1 doesn't support pstate_cnt, many BIOS vendors use
3556 - * it anyway, so we need to support it... */
3557 - if (acpi_fadt_is_v1) {
3558 - ACPI_DEBUG_PRINT((ACPI_DB_INFO,
3559 - "Using v1.0 FADT reserved value for pstate_cnt\n"));
3560 - }
3561 -
3562 - status = acpi_os_write_port(acpi_fadt.smi_cmd,
3563 - (u32) acpi_fadt.pstate_cnt, 8);
3564 + status = acpi_os_write_port(acpi_gbl_FADT.smi_command,
3565 + acpi_gbl_FADT.pstate_control, 8);
3566 if (ACPI_FAILURE(status))
3567 return status;
3568
3569 --- sle11-2009-05-14.orig/drivers/char/tpm/tpm_xen.c 2009-03-04 11:28:34.000000000 +0100
3570 +++ sle11-2009-05-14/drivers/char/tpm/tpm_xen.c 2009-03-04 11:25:55.000000000 +0100
3571 @@ -481,7 +481,6 @@ static struct xenbus_device_id tpmfront_
3572
3573 static struct xenbus_driver tpmfront = {
3574 .name = "vtpm",
3575 - .owner = THIS_MODULE,
3576 .ids = tpmfront_ids,
3577 .probe = tpmfront_probe,
3578 .remove = tpmfront_remove,
3579 @@ -491,9 +490,9 @@ static struct xenbus_driver tpmfront = {
3580 .suspend_cancel = tpmfront_suspend_cancel,
3581 };
3582
3583 -static void __init init_tpm_xenbus(void)
3584 +static int __init init_tpm_xenbus(void)
3585 {
3586 - xenbus_register_frontend(&tpmfront);
3587 + return xenbus_register_frontend(&tpmfront);
3588 }
3589
3590 static int tpmif_allocate_tx_buffers(struct tpm_private *tp)
3591 --- sle11-2009-05-14.orig/drivers/pci/msi-xen.c 2008-12-15 11:26:44.000000000 +0100
3592 +++ sle11-2009-05-14/drivers/pci/msi-xen.c 2009-03-04 11:25:55.000000000 +0100
3593 @@ -44,6 +44,36 @@ struct msi_pirq_entry {
3594 int entry_nr;
3595 };
3596
3597 +static void msi_set_enable(struct pci_dev *dev, int enable)
3598 +{
3599 + int pos;
3600 + u16 control;
3601 +
3602 + pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
3603 + if (pos) {
3604 + pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &control);
3605 + control &= ~PCI_MSI_FLAGS_ENABLE;
3606 + if (enable)
3607 + control |= PCI_MSI_FLAGS_ENABLE;
3608 + pci_write_config_word(dev, pos + PCI_MSI_FLAGS, control);
3609 + }
3610 +}
3611 +
3612 +static void msix_set_enable(struct pci_dev *dev, int enable)
3613 +{
3614 + int pos;
3615 + u16 control;
3616 +
3617 + pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
3618 + if (pos) {
3619 + pci_read_config_word(dev, pos + PCI_MSIX_FLAGS, &control);
3620 + control &= ~PCI_MSIX_FLAGS_ENABLE;
3621 + if (enable)
3622 + control |= PCI_MSIX_FLAGS_ENABLE;
3623 + pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control);
3624 + }
3625 +}
3626 +
3627 static struct msi_dev_list *get_msi_dev_pirq_list(struct pci_dev *dev)
3628 {
3629 struct msi_dev_list *msi_dev_list, *ret = NULL;
3630 @@ -235,126 +265,26 @@ static int msi_map_vector(struct pci_dev
3631
3632 static int msi_init(void)
3633 {
3634 - static int status = 0;
3635 -
3636 - if (pci_msi_quirk) {
3637 - pci_msi_enable = 0;
3638 - printk(KERN_WARNING "PCI: MSI quirk detected. MSI disabled.\n");
3639 - status = -EINVAL;
3640 - }
3641 -
3642 - return status;
3643 -}
3644 -
3645 -void pci_scan_msi_device(struct pci_dev *dev) { }
3646 -
3647 -void disable_msi_mode(struct pci_dev *dev, int pos, int type)
3648 -{
3649 - u16 control;
3650 -
3651 - pci_read_config_word(dev, msi_control_reg(pos), &control);
3652 - if (type == PCI_CAP_ID_MSI) {
3653 - /* Set enabled bits to single MSI & enable MSI_enable bit */
3654 - msi_disable(control);
3655 - pci_write_config_word(dev, msi_control_reg(pos), control);
3656 - dev->msi_enabled = 0;
3657 - } else {
3658 - msix_disable(control);
3659 - pci_write_config_word(dev, msi_control_reg(pos), control);
3660 - dev->msix_enabled = 0;
3661 - }
3662 -
3663 - pci_intx(dev, 1); /* enable intx */
3664 -}
3665 -
3666 -static void enable_msi_mode(struct pci_dev *dev, int pos, int type)
3667 -{
3668 - u16 control;
3669 -
3670 - pci_read_config_word(dev, msi_control_reg(pos), &control);
3671 - if (type == PCI_CAP_ID_MSI) {
3672 - /* Set enabled bits to single MSI & enable MSI_enable bit */
3673 - msi_enable(control, 1);
3674 - pci_write_config_word(dev, msi_control_reg(pos), control);
3675 - dev->msi_enabled = 1;
3676 - } else {
3677 - msix_enable(control);
3678 - pci_write_config_word(dev, msi_control_reg(pos), control);
3679 - dev->msix_enabled = 1;
3680 - }
3681 -
3682 - pci_intx(dev, 0); /* disable intx */
3683 + return 0;
3684 }
3685
3686 #ifdef CONFIG_PM
3687 -int pci_save_msi_state(struct pci_dev *dev)
3688 +static void __pci_restore_msi_state(struct pci_dev *dev)
3689 {
3690 - int pos;
3691 -
3692 - pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
3693 - if (pos <= 0 || dev->no_msi)
3694 - return 0;
3695 + int pirq;
3696
3697 if (!dev->msi_enabled)
3698 - return 0;
3699 -
3700 - /* Restore dev->irq to its default pin-assertion vector */
3701 - msi_unmap_pirq(dev, dev->irq);
3702 - /* Disable MSI mode */
3703 - disable_msi_mode(dev, pos, PCI_CAP_ID_MSI);
3704 - /* Set the flags for use of restore */
3705 - dev->msi_enabled = 1;
3706 - return 0;
3707 -}
3708 -
3709 -void pci_restore_msi_state(struct pci_dev *dev)
3710 -{
3711 - int pos, pirq;
3712 -
3713 - pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
3714 - if (pos <= 0)
3715 return;
3716
3717 - if (!dev->msi_enabled)
3718 - return;
3719 + pci_intx(dev, 0); /* disable intx */
3720 + msi_set_enable(dev, 0);
3721
3722 pirq = msi_map_pirq_to_vector(dev, dev->irq, 0, 0);
3723 if (pirq < 0)
3724 return;
3725 - enable_msi_mode(dev, pos, PCI_CAP_ID_MSI);
3726 }
3727
3728 -int pci_save_msix_state(struct pci_dev *dev)
3729 -{
3730 - int pos;
3731 - unsigned long flags;
3732 - struct msi_dev_list *msi_dev_entry;
3733 - struct msi_pirq_entry *pirq_entry, *tmp;
3734 -
3735 - pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
3736 - if (pos <= 0 || dev->no_msi)
3737 - return 0;
3738 -
3739 - /* save the capability */
3740 - if (!dev->msix_enabled)
3741 - return 0;
3742 -
3743 - msi_dev_entry = get_msi_dev_pirq_list(dev);
3744 -
3745 - spin_lock_irqsave(&msi_dev_entry->pirq_list_lock, flags);
3746 - list_for_each_entry_safe(pirq_entry, tmp,
3747 - &msi_dev_entry->pirq_list_head, list)
3748 - msi_unmap_pirq(dev, pirq_entry->pirq);
3749 - spin_unlock_irqrestore(&msi_dev_entry->pirq_list_lock, flags);
3750 -
3751 - disable_msi_mode(dev, pos, PCI_CAP_ID_MSIX);
3752 - /* Set the flags for use of restore */
3753 - dev->msix_enabled = 1;
3754 -
3755 - return 0;
3756 -}
3757 -
3758 -void pci_restore_msix_state(struct pci_dev *dev)
3759 +static void __pci_restore_msix_state(struct pci_dev *dev)
3760 {
3761 int pos;
3762 unsigned long flags;
3763 @@ -369,6 +299,9 @@ void pci_restore_msix_state(struct pci_d
3764 if (!dev->msix_enabled)
3765 return;
3766
3767 + pci_intx(dev, 0); /* disable intx */
3768 + msix_set_enable(dev, 0);
3769 +
3770 msi_dev_entry = get_msi_dev_pirq_list(dev);
3771 table_base = find_table_base(dev, pos);
3772 if (!table_base)
3773 @@ -386,10 +319,14 @@ void pci_restore_msix_state(struct pci_d
3774 pirq_entry->pirq, rc);
3775 }
3776 spin_unlock_irqrestore(&msi_dev_entry->pirq_list_lock, flags);
3777 +}
3778
3779 - enable_msi_mode(dev, pos, PCI_CAP_ID_MSIX);
3780 +void pci_restore_msi_state(struct pci_dev *dev)
3781 +{
3782 + __pci_restore_msi_state(dev);
3783 + __pci_restore_msix_state(dev);
3784 }
3785 -#endif
3786 +#endif /* CONFIG_PM */
3787
3788 /**
3789 * msi_capability_init - configure device's MSI capability structure
3790 @@ -405,6 +342,8 @@ static int msi_capability_init(struct pc
3791 int pos, pirq;
3792 u16 control;
3793
3794 + msi_set_enable(dev, 0); /* Ensure msi is disabled as I set it up */
3795 +
3796 pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
3797 pci_read_config_word(dev, msi_control_reg(pos), &control);
3798
3799 @@ -413,7 +352,8 @@ static int msi_capability_init(struct pc
3800 return -EBUSY;
3801
3802 /* Set MSI enabled bits */
3803 - enable_msi_mode(dev, pos, PCI_CAP_ID_MSI);
3804 + pci_intx(dev, 0); /* disable intx */
3805 + msi_set_enable(dev, 1);
3806 dev->msi_enabled = 1;
3807
3808 dev->irq = pirq;
3809 @@ -441,6 +381,8 @@ static int msix_capability_init(struct p
3810 if (!msi_dev_entry)
3811 return -ENOMEM;
3812
3813 + msix_set_enable(dev, 0);/* Ensure msix is disabled as I set it up */
3814 +
3815 pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
3816 table_base = find_table_base(dev, pos);
3817 if (!table_base)
3818 @@ -484,7 +426,8 @@ static int msix_capability_init(struct p
3819 return avail;
3820 }
3821
3822 - enable_msi_mode(dev, pos, PCI_CAP_ID_MSIX);
3823 + pci_intx(dev, 0); /* disable intx */
3824 + msix_set_enable(dev, 1);
3825 dev->msix_enabled = 1;
3826
3827 return 0;
3828 @@ -567,17 +510,14 @@ int pci_enable_msi(struct pci_dev* dev)
3829 /* Check whether driver already requested for MSI-X irqs */
3830 if (dev->msix_enabled) {
3831 printk(KERN_INFO "PCI: %s: Can't enable MSI. "
3832 - "Device already has MSI-X irq assigned\n",
3833 - pci_name(dev));
3834 - dev->irq = temp;
3835 + "Device already has MSI-X enabled\n",
3836 + pci_name(dev));
3837 return -EINVAL;
3838 }
3839
3840 status = msi_capability_init(dev);
3841 if ( !status )
3842 dev->irq_old = temp;
3843 - else
3844 - dev->irq = temp;
3845
3846 return status;
3847 }
3848 @@ -585,7 +525,6 @@ int pci_enable_msi(struct pci_dev* dev)
3849 extern void pci_frontend_disable_msi(struct pci_dev* dev);
3850 void pci_disable_msi(struct pci_dev* dev)
3851 {
3852 - int pos;
3853 int pirq;
3854
3855 if (!pci_msi_enable)
3856 @@ -602,8 +541,7 @@ void pci_disable_msi(struct pci_dev* dev
3857 }
3858 #endif
3859
3860 - pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
3861 - if (!pos)
3862 + if (!dev->msi_enabled)
3863 return;
3864
3865 pirq = dev->irq;
3866 @@ -612,7 +550,9 @@ void pci_disable_msi(struct pci_dev* dev
3867 msi_unmap_pirq(dev, pirq);
3868
3869 /* Disable MSI mode */
3870 - disable_msi_mode(dev, pos, PCI_CAP_ID_MSI);
3871 + msi_set_enable(dev, 0);
3872 + pci_intx(dev, 1); /* enable intx */
3873 + dev->msi_enabled = 0;
3874 }
3875
3876 /**
3877 @@ -705,7 +645,6 @@ int pci_enable_msix(struct pci_dev* dev,
3878 printk(KERN_INFO "PCI: %s: Can't enable MSI-X. "
3879 "Device already has an MSI irq assigned\n",
3880 pci_name(dev));
3881 - dev->irq = temp;
3882 return -EINVAL;
3883 }
3884
3885 @@ -713,8 +652,6 @@ int pci_enable_msix(struct pci_dev* dev,
3886
3887 if ( !status )
3888 dev->irq_old = temp;
3889 - else
3890 - dev->irq = temp;
3891
3892 return status;
3893 }
3894 @@ -722,10 +659,6 @@ int pci_enable_msix(struct pci_dev* dev,
3895 extern void pci_frontend_disable_msix(struct pci_dev* dev);
3896 void pci_disable_msix(struct pci_dev* dev)
3897 {
3898 - int pos;
3899 - u16 control;
3900 -
3901 -
3902 if (!pci_msi_enable)
3903 return;
3904 if (!dev)
3905 @@ -751,18 +684,15 @@ void pci_disable_msix(struct pci_dev* de
3906 }
3907 #endif
3908
3909 - pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
3910 - if (!pos)
3911 - return;
3912 -
3913 - pci_read_config_word(dev, msi_control_reg(pos), &control);
3914 - if (!(control & PCI_MSIX_FLAGS_ENABLE))
3915 + if (!dev->msix_enabled)
3916 return;
3917
3918 msi_remove_pci_irq_vectors(dev);
3919
3920 /* Disable MSI mode */
3921 - disable_msi_mode(dev, pos, PCI_CAP_ID_MSIX);
3922 + msix_set_enable(dev, 0);
3923 + pci_intx(dev, 1); /* enable intx */
3924 + dev->msix_enabled = 0;
3925 }
3926
3927 /**
3928 --- sle11-2009-05-14.orig/drivers/xen/balloon/sysfs.c 2008-11-25 13:31:07.000000000 +0100
3929 +++ sle11-2009-05-14/drivers/xen/balloon/sysfs.c 2009-03-04 11:25:55.000000000 +0100
3930 @@ -34,6 +34,7 @@
3931 #include <linux/stat.h>
3932 #include <linux/string.h>
3933 #include <linux/sysdev.h>
3934 +#include <linux/module.h>
3935 #include "common.h"
3936
3937 #ifdef HAVE_XEN_PLATFORM_COMPAT_H
3938 --- sle11-2009-05-14.orig/drivers/xen/blkback/xenbus.c 2009-05-14 10:56:29.000000000 +0200
3939 +++ sle11-2009-05-14/drivers/xen/blkback/xenbus.c 2009-03-04 11:25:55.000000000 +0100
3940 @@ -527,7 +527,6 @@ static const struct xenbus_device_id blk
3941
3942 static struct xenbus_driver blkback = {
3943 .name = "vbd",
3944 - .owner = THIS_MODULE,
3945 .ids = blkback_ids,
3946 .probe = blkback_probe,
3947 .remove = blkback_remove,
3948 @@ -537,5 +536,6 @@ static struct xenbus_driver blkback = {
3949
3950 void blkif_xenbus_init(void)
3951 {
3952 - xenbus_register_backend(&blkback);
3953 + if (xenbus_register_backend(&blkback))
3954 + BUG();
3955 }
3956 --- sle11-2009-05-14.orig/drivers/xen/blkfront/blkfront.c 2009-03-24 10:08:27.000000000 +0100
3957 +++ sle11-2009-05-14/drivers/xen/blkfront/blkfront.c 2009-03-24 10:08:49.000000000 +0100
3958 @@ -902,7 +902,6 @@ MODULE_ALIAS("xen:vbd");
3959
3960 static struct xenbus_driver blkfront = {
3961 .name = "vbd",
3962 - .owner = THIS_MODULE,
3963 .ids = blkfront_ids,
3964 .probe = blkfront_probe,
3965 .remove = blkfront_remove,
3966 --- sle11-2009-05-14.orig/drivers/xen/blktap/xenbus.c 2009-05-14 10:56:29.000000000 +0200
3967 +++ sle11-2009-05-14/drivers/xen/blktap/xenbus.c 2009-03-04 11:25:55.000000000 +0100
3968 @@ -465,7 +465,6 @@ static const struct xenbus_device_id blk
3969
3970 static struct xenbus_driver blktap = {
3971 .name = "tap",
3972 - .owner = THIS_MODULE,
3973 .ids = blktap_ids,
3974 .probe = blktap_probe,
3975 .remove = blktap_remove,
3976 @@ -475,5 +474,6 @@ static struct xenbus_driver blktap = {
3977
3978 void tap_blkif_xenbus_init(void)
3979 {
3980 - xenbus_register_backend(&blktap);
3981 + if (xenbus_register_backend(&blktap))
3982 + BUG();
3983 }
3984 --- sle11-2009-05-14.orig/drivers/xen/core/evtchn.c 2009-03-04 11:28:34.000000000 +0100
3985 +++ sle11-2009-05-14/drivers/xen/core/evtchn.c 2009-03-04 11:25:55.000000000 +0100
3986 @@ -145,7 +145,7 @@ static void bind_evtchn_to_cpu(unsigned
3987 BUG_ON(!test_bit(chn, s->evtchn_mask));
3988
3989 if (irq != -1)
3990 - set_native_irq_info(irq, cpumask_of_cpu(cpu));
3991 + irq_desc[irq].affinity = cpumask_of_cpu(cpu);
3992
3993 clear_bit(chn, (unsigned long *)cpu_evtchn_mask[cpu_evtchn[chn]]);
3994 set_bit(chn, (unsigned long *)cpu_evtchn_mask[cpu]);
3995 @@ -158,7 +158,7 @@ static void init_evtchn_cpu_bindings(voi
3996
3997 /* By default all event channels notify CPU#0. */
3998 for (i = 0; i < NR_IRQS; i++)
3999 - set_native_irq_info(i, cpumask_of_cpu(0));
4000 + irq_desc[i].affinity = cpumask_of_cpu(0);
4001
4002 memset(cpu_evtchn, 0, sizeof(cpu_evtchn));
4003 memset(cpu_evtchn_mask[0], ~0, sizeof(cpu_evtchn_mask[0]));
4004 @@ -736,6 +736,7 @@ static struct irq_chip dynirq_chip = {
4005 .name = "Dynamic",
4006 .startup = startup_dynirq,
4007 .shutdown = mask_dynirq,
4008 + .disable = mask_dynirq,
4009 .mask = mask_dynirq,
4010 .unmask = unmask_dynirq,
4011 .mask_ack = ack_dynirq,
4012 --- sle11-2009-05-14.orig/drivers/xen/core/smpboot.c 2008-12-15 11:26:44.000000000 +0100
4013 +++ sle11-2009-05-14/drivers/xen/core/smpboot.c 2009-03-04 11:25:55.000000000 +0100
4014 @@ -117,7 +117,7 @@ static int __cpuinit xen_smp_intr_init(u
4015 rc = bind_ipi_to_irqhandler(RESCHEDULE_VECTOR,
4016 cpu,
4017 smp_reschedule_interrupt,
4018 - SA_INTERRUPT,
4019 + IRQF_DISABLED|IRQF_NOBALANCING,
4020 resched_name[cpu],
4021 NULL);
4022 if (rc < 0)
4023 @@ -128,7 +128,7 @@ static int __cpuinit xen_smp_intr_init(u
4024 rc = bind_ipi_to_irqhandler(CALL_FUNCTION_VECTOR,
4025 cpu,
4026 smp_call_function_interrupt,
4027 - SA_INTERRUPT,
4028 + IRQF_DISABLED|IRQF_NOBALANCING,
4029 callfunc_name[cpu],
4030 NULL);
4031 if (rc < 0)
4032 @@ -257,7 +257,7 @@ void __init smp_prepare_cpus(unsigned in
4033 {
4034 unsigned int cpu;
4035 struct task_struct *idle;
4036 - int apicid, acpiid;
4037 + int apicid;
4038 struct vcpu_get_physid cpu_id;
4039 #ifdef __x86_64__
4040 struct desc_ptr *gdt_descr;
4041 @@ -266,14 +266,8 @@ void __init smp_prepare_cpus(unsigned in
4042 #endif
4043
4044 apicid = 0;
4045 - if (HYPERVISOR_vcpu_op(VCPUOP_get_physid, 0, &cpu_id) == 0) {
4046 + if (HYPERVISOR_vcpu_op(VCPUOP_get_physid, 0, &cpu_id) == 0)
4047 apicid = xen_vcpu_physid_to_x86_apicid(cpu_id.phys_id);
4048 - acpiid = xen_vcpu_physid_to_x86_acpiid(cpu_id.phys_id);
4049 -#ifdef CONFIG_ACPI
4050 - if (acpiid != 0xff)
4051 - x86_acpiid_to_apicid[acpiid] = apicid;
4052 -#endif
4053 - }
4054 boot_cpu_data.apicid = apicid;
4055 cpu_data[0] = boot_cpu_data;
4056
4057 @@ -329,14 +323,8 @@ void __init smp_prepare_cpus(unsigned in
4058 XENFEAT_writable_descriptor_tables);
4059
4060 apicid = cpu;
4061 - if (HYPERVISOR_vcpu_op(VCPUOP_get_physid, cpu, &cpu_id) == 0) {
4062 + if (HYPERVISOR_vcpu_op(VCPUOP_get_physid, cpu, &cpu_id) == 0)
4063 apicid = xen_vcpu_physid_to_x86_apicid(cpu_id.phys_id);
4064 - acpiid = xen_vcpu_physid_to_x86_acpiid(cpu_id.phys_id);
4065 -#ifdef CONFIG_ACPI
4066 - if (acpiid != 0xff)
4067 - x86_acpiid_to_apicid[acpiid] = apicid;
4068 -#endif
4069 - }
4070 cpu_data[cpu] = boot_cpu_data;
4071 cpu_data[cpu].apicid = apicid;
4072
4073 --- sle11-2009-05-14.orig/drivers/xen/fbfront/xenfb.c 2008-12-15 11:26:44.000000000 +0100
4074 +++ sle11-2009-05-14/drivers/xen/fbfront/xenfb.c 2009-03-04 11:25:55.000000000 +0100
4075 @@ -857,7 +857,6 @@ MODULE_ALIAS("xen:vfb");
4076
4077 static struct xenbus_driver xenfb_driver = {
4078 .name = "vfb",
4079 - .owner = THIS_MODULE,
4080 .ids = xenfb_ids,
4081 .probe = xenfb_probe,
4082 .remove = xenfb_remove,
4083 --- sle11-2009-05-14.orig/drivers/xen/fbfront/xenkbd.c 2009-03-04 11:28:34.000000000 +0100
4084 +++ sle11-2009-05-14/drivers/xen/fbfront/xenkbd.c 2009-03-04 11:25:55.000000000 +0100
4085 @@ -323,7 +323,6 @@ MODULE_ALIAS("xen:vkbd");
4086
4087 static struct xenbus_driver xenkbd_driver = {
4088 .name = "vkbd",
4089 - .owner = THIS_MODULE,
4090 .ids = xenkbd_ids,
4091 .probe = xenkbd_probe,
4092 .remove = xenkbd_remove,
4093 --- sle11-2009-05-14.orig/drivers/xen/netback/xenbus.c 2009-05-14 10:56:29.000000000 +0200
4094 +++ sle11-2009-05-14/drivers/xen/netback/xenbus.c 2009-03-04 11:25:55.000000000 +0100
4095 @@ -439,7 +439,6 @@ static const struct xenbus_device_id net
4096
4097 static struct xenbus_driver netback = {
4098 .name = "vif",
4099 - .owner = THIS_MODULE,
4100 .ids = netback_ids,
4101 .probe = netback_probe,
4102 .remove = netback_remove,
4103 @@ -450,5 +449,6 @@ static struct xenbus_driver netback = {
4104
4105 void netif_xenbus_init(void)
4106 {
4107 - xenbus_register_backend(&netback);
4108 + if (xenbus_register_backend(&netback))
4109 + BUG();
4110 }
4111 --- sle11-2009-05-14.orig/drivers/xen/netfront/netfront.c 2009-03-30 16:34:59.000000000 +0200
4112 +++ sle11-2009-05-14/drivers/xen/netfront/netfront.c 2009-03-30 16:35:44.000000000 +0200
4113 @@ -1892,20 +1892,19 @@ static struct ethtool_ops network_ethtoo
4114 };
4115
4116 #ifdef CONFIG_SYSFS
4117 -static ssize_t show_rxbuf_min(struct class_device *cd, char *buf)
4118 +static ssize_t show_rxbuf_min(struct device *dev,
4119 + struct device_attribute *attr, char *buf)
4120 {
4121 - struct net_device *netdev = container_of(cd, struct net_device,
4122 - class_dev);
4123 - struct netfront_info *info = netdev_priv(netdev);
4124 + struct netfront_info *info = netdev_priv(to_net_dev(dev));
4125
4126 return sprintf(buf, "%u\n", info->rx_min_target);
4127 }
4128
4129 -static ssize_t store_rxbuf_min(struct class_device *cd,
4130 +static ssize_t store_rxbuf_min(struct device *dev,
4131 + struct device_attribute *attr,
4132 const char *buf, size_t len)
4133 {
4134 - struct net_device *netdev = container_of(cd, struct net_device,
4135 - class_dev);
4136 + struct net_device *netdev = to_net_dev(dev);
4137 struct netfront_info *np = netdev_priv(netdev);
4138 char *endp;
4139 unsigned long target;
4140 @@ -1935,20 +1934,19 @@ static ssize_t store_rxbuf_min(struct cl
4141 return len;
4142 }
4143
4144 -static ssize_t show_rxbuf_max(struct class_device *cd, char *buf)
4145 +static ssize_t show_rxbuf_max(struct device *dev,
4146 + struct device_attribute *attr, char *buf)
4147 {
4148 - struct net_device *netdev = container_of(cd, struct net_device,
4149 - class_dev);
4150 - struct netfront_info *info = netdev_priv(netdev);
4151 + struct netfront_info *info = netdev_priv(to_net_dev(dev));
4152
4153 return sprintf(buf, "%u\n", info->rx_max_target);
4154 }
4155
4156 -static ssize_t store_rxbuf_max(struct class_device *cd,
4157 +static ssize_t store_rxbuf_max(struct device *dev,
4158 + struct device_attribute *attr,
4159 const char *buf, size_t len)
4160 {
4161 - struct net_device *netdev = container_of(cd, struct net_device,
4162 - class_dev);
4163 + struct net_device *netdev = to_net_dev(dev);
4164 struct netfront_info *np = netdev_priv(netdev);
4165 char *endp;
4166 unsigned long target;
4167 @@ -1978,16 +1976,15 @@ static ssize_t store_rxbuf_max(struct cl
4168 return len;
4169 }
4170
4171 -static ssize_t show_rxbuf_cur(struct class_device *cd, char *buf)
4172 +static ssize_t show_rxbuf_cur(struct device *dev,
4173 + struct device_attribute *attr, char *buf)
4174 {
4175 - struct net_device *netdev = container_of(cd, struct net_device,
4176 - class_dev);
4177 - struct netfront_info *info = netdev_priv(netdev);
4178 + struct netfront_info *info = netdev_priv(to_net_dev(dev));
4179
4180 return sprintf(buf, "%u\n", info->rx_target);
4181 }
4182
4183 -static const struct class_device_attribute xennet_attrs[] = {
4184 +static struct device_attribute xennet_attrs[] = {
4185 __ATTR(rxbuf_min, S_IRUGO|S_IWUSR, show_rxbuf_min, store_rxbuf_min),
4186 __ATTR(rxbuf_max, S_IRUGO|S_IWUSR, show_rxbuf_max, store_rxbuf_max),
4187 __ATTR(rxbuf_cur, S_IRUGO, show_rxbuf_cur, NULL),
4188 @@ -1999,8 +1996,8 @@ static int xennet_sysfs_addif(struct net
4189 int error = 0;
4190
4191 for (i = 0; i < ARRAY_SIZE(xennet_attrs); i++) {
4192 - error = class_device_create_file(&netdev->class_dev,
4193 - &xennet_attrs[i]);
4194 + error = device_create_file(&netdev->dev,
4195 + &xennet_attrs[i]);
4196 if (error)
4197 goto fail;
4198 }
4199 @@ -2008,8 +2005,7 @@ static int xennet_sysfs_addif(struct net
4200
4201 fail:
4202 while (--i >= 0)
4203 - class_device_remove_file(&netdev->class_dev,
4204 - &xennet_attrs[i]);
4205 + device_remove_file(&netdev->dev, &xennet_attrs[i]);
4206 return error;
4207 }
4208
4209 @@ -2017,10 +2013,8 @@ static void xennet_sysfs_delif(struct ne
4210 {
4211 int i;
4212
4213 - for (i = 0; i < ARRAY_SIZE(xennet_attrs); i++) {
4214 - class_device_remove_file(&netdev->class_dev,
4215 - &xennet_attrs[i]);
4216 - }
4217 + for (i = 0; i < ARRAY_SIZE(xennet_attrs); i++)
4218 + device_remove_file(&netdev->dev, &xennet_attrs[i]);
4219 }
4220
4221 #endif /* CONFIG_SYSFS */
4222 @@ -2186,7 +2180,6 @@ MODULE_ALIAS("xen:vif");
4223
4224 static struct xenbus_driver netfront_driver = {
4225 .name = "vif",
4226 - .owner = THIS_MODULE,
4227 .ids = netfront_ids,
4228 .probe = netfront_probe,
4229 .remove = __devexit_p(netfront_remove),
4230 --- sle11-2009-05-14.orig/drivers/xen/pciback/xenbus.c 2008-12-15 11:26:44.000000000 +0100
4231 +++ sle11-2009-05-14/drivers/xen/pciback/xenbus.c 2009-03-04 11:25:55.000000000 +0100
4232 @@ -682,7 +682,6 @@ static const struct xenbus_device_id xen
4233
4234 static struct xenbus_driver xenbus_pciback_driver = {
4235 .name = "pciback",
4236 - .owner = THIS_MODULE,
4237 .ids = xenpci_ids,
4238 .probe = pciback_xenbus_probe,
4239 .remove = pciback_xenbus_remove,
4240 --- sle11-2009-05-14.orig/drivers/xen/pcifront/xenbus.c 2009-05-14 10:56:29.000000000 +0200
4241 +++ sle11-2009-05-14/drivers/xen/pcifront/xenbus.c 2009-03-04 11:25:55.000000000 +0100
4242 @@ -436,7 +436,6 @@ MODULE_ALIAS("xen:pci");
4243
4244 static struct xenbus_driver xenbus_pcifront_driver = {
4245 .name = "pcifront",
4246 - .owner = THIS_MODULE,
4247 .ids = xenpci_ids,
4248 .probe = pcifront_xenbus_probe,
4249 .remove = pcifront_xenbus_remove,
4250 --- sle11-2009-05-14.orig/drivers/xen/scsiback/xenbus.c 2009-05-14 10:56:29.000000000 +0200
4251 +++ sle11-2009-05-14/drivers/xen/scsiback/xenbus.c 2009-03-04 11:25:55.000000000 +0100
4252 @@ -350,7 +350,6 @@ static struct xenbus_device_id scsiback_
4253
4254 static struct xenbus_driver scsiback = {
4255 .name = "vscsi",
4256 - .owner = THIS_MODULE,
4257 .ids = scsiback_ids,
4258 .probe = scsiback_probe,
4259 .remove = scsiback_remove,
4260 --- sle11-2009-05-14.orig/drivers/xen/scsifront/xenbus.c 2009-05-14 10:56:29.000000000 +0200
4261 +++ sle11-2009-05-14/drivers/xen/scsifront/xenbus.c 2009-03-04 11:25:55.000000000 +0100
4262 @@ -401,7 +401,6 @@ static struct xenbus_device_id scsifront
4263
4264 static struct xenbus_driver scsifront_driver = {
4265 .name = "vscsi",
4266 - .owner = THIS_MODULE,
4267 .ids = scsifront_ids,
4268 .probe = scsifront_probe,
4269 .remove = scsifront_remove,
4270 --- sle11-2009-05-14.orig/drivers/xen/tpmback/common.h 2009-03-04 11:28:34.000000000 +0100
4271 +++ sle11-2009-05-14/drivers/xen/tpmback/common.h 2009-03-04 11:25:55.000000000 +0100
4272 @@ -54,11 +54,11 @@ typedef struct tpmif_st {
4273
4274 void tpmif_disconnect_complete(tpmif_t * tpmif);
4275 tpmif_t *tpmif_find(domid_t domid, struct backend_info *bi);
4276 -void tpmif_interface_init(void);
4277 +int tpmif_interface_init(void);
4278 void tpmif_interface_exit(void);
4279 void tpmif_schedule_work(tpmif_t * tpmif);
4280 void tpmif_deschedule_work(tpmif_t * tpmif);
4281 -void tpmif_xenbus_init(void);
4282 +int tpmif_xenbus_init(void);
4283 void tpmif_xenbus_exit(void);
4284 int tpmif_map(tpmif_t *tpmif, unsigned long shared_page, unsigned int evtchn);
4285 irqreturn_t tpmif_be_int(int irq, void *dev_id);
4286 --- sle11-2009-05-14.orig/drivers/xen/tpmback/interface.c 2008-12-15 11:26:44.000000000 +0100
4287 +++ sle11-2009-05-14/drivers/xen/tpmback/interface.c 2009-03-04 11:25:55.000000000 +0100
4288 @@ -156,13 +156,14 @@ void tpmif_disconnect_complete(tpmif_t *
4289 free_tpmif(tpmif);
4290 }
4291
4292 -void __init tpmif_interface_init(void)
4293 +int __init tpmif_interface_init(void)
4294 {
4295 tpmif_cachep = kmem_cache_create("tpmif_cache", sizeof (tpmif_t),
4296 0, 0, NULL, NULL);
4297 + return tpmif_cachep ? 0 : -ENOMEM;
4298 }
4299
4300 -void __exit tpmif_interface_exit(void)
4301 +void tpmif_interface_exit(void)
4302 {
4303 kmem_cache_destroy(tpmif_cachep);
4304 }
4305 --- sle11-2009-05-14.orig/drivers/xen/tpmback/tpmback.c 2009-03-04 11:28:34.000000000 +0100
4306 +++ sle11-2009-05-14/drivers/xen/tpmback/tpmback.c 2009-03-04 11:25:55.000000000 +0100
4307 @@ -923,22 +923,30 @@ static int __init tpmback_init(void)
4308 spin_lock_init(&tpm_schedule_list_lock);
4309 INIT_LIST_HEAD(&tpm_schedule_list);
4310
4311 - tpmif_interface_init();
4312 - tpmif_xenbus_init();
4313 + rc = tpmif_interface_init();
4314 + if (!rc) {
4315 + rc = tpmif_xenbus_init();
4316 + if (rc)
4317 + tpmif_interface_exit();
4318 + }
4319 + if (rc) {
4320 + misc_deregister(&vtpms_miscdevice);
4321 + return rc;
4322 + }
4323
4324 printk(KERN_ALERT "Successfully initialized TPM backend driver.\n");
4325
4326 return 0;
4327 }
4328 -
4329 module_init(tpmback_init);
4330
4331 -void __exit tpmback_exit(void)
4332 +static void __exit tpmback_exit(void)
4333 {
4334 vtpm_release_packets(NULL, 0);
4335 tpmif_xenbus_exit();
4336 tpmif_interface_exit();
4337 misc_deregister(&vtpms_miscdevice);
4338 }
4339 +module_exit(tpmback_exit)
4340
4341 MODULE_LICENSE("Dual BSD/GPL");
4342 --- sle11-2009-05-14.orig/drivers/xen/tpmback/xenbus.c 2009-05-14 10:56:29.000000000 +0200
4343 +++ sle11-2009-05-14/drivers/xen/tpmback/xenbus.c 2009-03-04 11:25:55.000000000 +0100
4344 @@ -270,7 +270,6 @@ static const struct xenbus_device_id tpm
4345
4346 static struct xenbus_driver tpmback = {
4347 .name = "vtpm",
4348 - .owner = THIS_MODULE,
4349 .ids = tpmback_ids,
4350 .probe = tpmback_probe,
4351 .remove = tpmback_remove,
4352 @@ -278,9 +277,9 @@ static struct xenbus_driver tpmback = {
4353 };
4354
4355
4356 -void tpmif_xenbus_init(void)
4357 +int tpmif_xenbus_init(void)
4358 {
4359 - xenbus_register_backend(&tpmback);
4360 + return xenbus_register_backend(&tpmback);
4361 }
4362
4363 void tpmif_xenbus_exit(void)
4364 --- sle11-2009-05-14.orig/drivers/xen/xenbus/xenbus_probe.c 2008-12-15 11:26:44.000000000 +0100
4365 +++ sle11-2009-05-14/drivers/xen/xenbus/xenbus_probe.c 2009-03-04 11:25:55.000000000 +0100
4366 @@ -365,7 +365,9 @@ static void xenbus_dev_shutdown(struct d
4367 }
4368
4369 int xenbus_register_driver_common(struct xenbus_driver *drv,
4370 - struct xen_bus_type *bus)
4371 + struct xen_bus_type *bus,
4372 + struct module *owner,
4373 + const char *mod_name)
4374 {
4375 int ret;
4376
4377 @@ -375,7 +377,10 @@ int xenbus_register_driver_common(struct
4378 drv->driver.name = drv->name;
4379 drv->driver.bus = &bus->bus;
4380 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
4381 - drv->driver.owner = drv->owner;
4382 + drv->driver.owner = owner;
4383 +#endif
4384 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
4385 + drv->driver.mod_name = mod_name;
4386 #endif
4387 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)
4388 drv->driver.probe = xenbus_dev_probe;
4389 @@ -389,13 +394,15 @@ int xenbus_register_driver_common(struct
4390 return ret;
4391 }
4392
4393 -int xenbus_register_frontend(struct xenbus_driver *drv)
4394 +int __xenbus_register_frontend(struct xenbus_driver *drv,
4395 + struct module *owner, const char *mod_name)
4396 {
4397 int ret;
4398
4399 drv->read_otherend_details = read_backend_details;
4400
4401 - ret = xenbus_register_driver_common(drv, &xenbus_frontend);
4402 + ret = xenbus_register_driver_common(drv, &xenbus_frontend,
4403 + owner, mod_name);
4404 if (ret)
4405 return ret;
4406
4407 @@ -404,7 +411,7 @@ int xenbus_register_frontend(struct xenb
4408
4409 return 0;
4410 }
4411 -EXPORT_SYMBOL_GPL(xenbus_register_frontend);
4412 +EXPORT_SYMBOL_GPL(__xenbus_register_frontend);
4413
4414 void xenbus_unregister_driver(struct xenbus_driver *drv)
4415 {
4416 --- sle11-2009-05-14.orig/drivers/xen/xenbus/xenbus_probe.h 2008-11-25 12:35:56.000000000 +0100
4417 +++ sle11-2009-05-14/drivers/xen/xenbus/xenbus_probe.h 2009-03-04 11:25:55.000000000 +0100
4418 @@ -63,7 +63,9 @@ extern int xenbus_match(struct device *_
4419 extern int xenbus_dev_probe(struct device *_dev);
4420 extern int xenbus_dev_remove(struct device *_dev);
4421 extern int xenbus_register_driver_common(struct xenbus_driver *drv,
4422 - struct xen_bus_type *bus);
4423 + struct xen_bus_type *bus,
4424 + struct module *owner,
4425 + const char *mod_name);
4426 extern int xenbus_probe_node(struct xen_bus_type *bus,
4427 const char *type,
4428 const char *nodename);
4429 --- sle11-2009-05-14.orig/drivers/xen/xenbus/xenbus_probe_backend.c 2009-05-14 10:56:29.000000000 +0200
4430 +++ sle11-2009-05-14/drivers/xen/xenbus/xenbus_probe_backend.c 2009-03-04 11:25:55.000000000 +0100
4431 @@ -172,13 +172,15 @@ static int xenbus_uevent_backend(struct
4432 return 0;
4433 }
4434
4435 -int xenbus_register_backend(struct xenbus_driver *drv)
4436 +int __xenbus_register_backend(struct xenbus_driver *drv,
4437 + struct module *owner, const char *mod_name)
4438 {
4439 drv->read_otherend_details = read_frontend_details;
4440
4441 - return xenbus_register_driver_common(drv, &xenbus_backend);
4442 + return xenbus_register_driver_common(drv, &xenbus_backend,
4443 + owner, mod_name);
4444 }
4445 -EXPORT_SYMBOL_GPL(xenbus_register_backend);
4446 +EXPORT_SYMBOL_GPL(__xenbus_register_backend);
4447
4448 /* backend/<typename>/<frontend-uuid>/<name> */
4449 static int xenbus_probe_backend_unit(const char *dir,
4450 --- sle11-2009-05-14.orig/drivers/xen/xenoprof/xenoprofile.c 2009-03-04 11:28:34.000000000 +0100
4451 +++ sle11-2009-05-14/drivers/xen/xenoprof/xenoprofile.c 2009-03-04 11:25:55.000000000 +0100
4452 @@ -235,7 +235,7 @@ static int bind_virq(void)
4453 result = bind_virq_to_irqhandler(VIRQ_XENOPROF,
4454 i,
4455 xenoprof_ovf_interrupt,
4456 - SA_INTERRUPT,
4457 + IRQF_DISABLED|IRQF_NOBALANCING,
4458 "xenoprof",
4459 NULL);
4460
4461 --- sle11-2009-05-14.orig/include/asm-x86/i8253.h 2009-05-14 10:56:29.000000000 +0200
4462 +++ sle11-2009-05-14/include/asm-x86/i8253.h 2009-03-04 11:25:55.000000000 +0100
4463 @@ -8,10 +8,14 @@
4464
4465 extern spinlock_t i8253_lock;
4466
4467 +#ifdef CONFIG_GENERIC_CLOCKEVENTS
4468 +
4469 extern struct clock_event_device *global_clock_event;
4470
4471 extern void setup_pit_timer(void);
4472
4473 +#endif
4474 +
4475 #define inb_pit inb_p
4476 #define outb_pit outb_p
4477
4478 --- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/desc_32.h 2008-12-15 11:26:44.000000000 +0100
4479 +++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/desc_32.h 2009-03-04 11:25:55.000000000 +0100
4480 @@ -21,7 +21,7 @@ struct Xgt_desc_struct {
4481
4482 extern struct Xgt_desc_struct idt_descr;
4483 DECLARE_PER_CPU(struct Xgt_desc_struct, cpu_gdt_descr);
4484 -
4485 +extern struct Xgt_desc_struct early_gdt_descr;
4486
4487 static inline struct desc_struct *get_cpu_gdt_table(unsigned int cpu)
4488 {
4489 --- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/hypervisor.h 2008-12-15 11:26:44.000000000 +0100
4490 +++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/hypervisor.h 2009-03-04 11:28:11.000000000 +0100
4491 @@ -158,6 +158,19 @@ static inline void arch_leave_lazy_mmu_m
4492 #define arch_use_lazy_mmu_mode() unlikely(__get_cpu_var(xen_lazy_mmu))
4493 #endif
4494
4495 +#if 0 /* All uses are in places potentially called asynchronously, but
4496 + * asynchronous code should rather not make use of lazy mode at all.
4497 + * Therefore, all uses of this function get commented out, proper
4498 + * detection of asynchronous invocations is added whereever needed,
4499 + * and this function is disabled to catch any new (improper) uses.
4500 + */
4501 +static inline void arch_flush_lazy_mmu_mode(void)
4502 +{
4503 + if (arch_use_lazy_mmu_mode())
4504 + xen_multicall_flush(false);
4505 +}
4506 +#endif
4507 +
4508 #else /* !CONFIG_XEN || MODULE */
4509
4510 static inline void xen_multicall_flush(bool ignore) {}
4511 @@ -215,7 +228,7 @@ HYPERVISOR_block(
4512 return rc;
4513 }
4514
4515 -static inline void /*__noreturn*/
4516 +static inline void __noreturn
4517 HYPERVISOR_shutdown(
4518 unsigned int reason)
4519 {
4520 --- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/mmu_context_32.h 2008-12-15 11:26:44.000000000 +0100
4521 +++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/mmu_context_32.h 2009-03-04 11:25:55.000000000 +0100
4522 @@ -27,13 +27,13 @@ static inline void enter_lazy_tlb(struct
4523 static inline void __prepare_arch_switch(void)
4524 {
4525 /*
4526 - * Save away %fs. No need to save %gs, as it was saved on the
4527 + * Save away %gs. No need to save %fs, as it was saved on the
4528 * stack on entry. No need to save %es and %ds, as those are
4529 * always kernel segments while inside the kernel.
4530 */
4531 - asm volatile ( "mov %%fs,%0"
4532 - : "=m" (current->thread.fs));
4533 - asm volatile ( "movl %0,%%fs"
4534 + asm volatile ( "mov %%gs,%0"
4535 + : "=m" (current->thread.gs));
4536 + asm volatile ( "movl %0,%%gs"
4537 : : "r" (0) );
4538 }
4539
4540 @@ -95,7 +95,7 @@ static inline void switch_mm(struct mm_s
4541 }
4542
4543 #define deactivate_mm(tsk, mm) \
4544 - asm("movl %0,%%fs": :"r" (0));
4545 + asm("movl %0,%%gs": :"r" (0));
4546
4547 static inline void activate_mm(struct mm_struct *prev, struct mm_struct *next)
4548 {
4549 --- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgalloc_32.h 2009-05-14 10:56:29.000000000 +0200
4550 +++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgalloc_32.h 2009-03-04 11:25:55.000000000 +0100
4551 @@ -6,12 +6,23 @@
4552 #include <linux/mm.h> /* for struct page */
4553 #include <asm/io.h> /* for phys_to_virt and page_to_pseudophys */
4554
4555 -#define pmd_populate_kernel(mm, pmd, pte) \
4556 - set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte)))
4557 +#define paravirt_alloc_pt(pfn) do { } while (0)
4558 +#define paravirt_alloc_pd(pfn) do { } while (0)
4559 +#define paravirt_alloc_pd(pfn) do { } while (0)
4560 +#define paravirt_alloc_pd_clone(pfn, clonepfn, start, count) do { } while (0)
4561 +#define paravirt_release_pt(pfn) do { } while (0)
4562 +#define paravirt_release_pd(pfn) do { } while (0)
4563 +
4564 +#define pmd_populate_kernel(mm, pmd, pte) \
4565 +do { \
4566 + paravirt_alloc_pt(__pa(pte) >> PAGE_SHIFT); \
4567 + set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte))); \
4568 +} while (0)
4569
4570 #define pmd_populate(mm, pmd, pte) \
4571 do { \
4572 unsigned long pfn = page_to_pfn(pte); \
4573 + paravirt_alloc_pt(pfn); \
4574 if (test_bit(PG_pinned, &virt_to_page((mm)->pgd)->flags)) { \
4575 if (!PageHighMem(pte)) \
4576 BUG_ON(HYPERVISOR_update_va_mapping( \
4577 @@ -42,7 +53,11 @@ static inline void pte_free_kernel(pte_t
4578
4579 extern void pte_free(struct page *pte);
4580
4581 -#define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte))
4582 +#define __pte_free_tlb(tlb,pte) \
4583 +do { \
4584 + paravirt_release_pt(page_to_pfn(pte)); \
4585 + tlb_remove_page((tlb),(pte)); \
4586 +} while (0)
4587
4588 #ifdef CONFIG_X86_PAE
4589 /*
4590 --- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgtable_32.h 2008-12-15 11:26:44.000000000 +0100
4591 +++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgtable_32.h 2009-03-04 11:25:55.000000000 +0100
4592 @@ -275,6 +275,7 @@ static inline pte_t pte_mkhuge(pte_t pte
4593 */
4594 #define pte_update(mm, addr, ptep) do { } while (0)
4595 #define pte_update_defer(mm, addr, ptep) do { } while (0)
4596 +#define paravirt_map_pt_hook(slot, va, pfn) do { } while (0)
4597
4598 /*
4599 * We only update the dirty/accessed state if we set
4600 @@ -490,12 +491,24 @@ extern pte_t *lookup_address(unsigned lo
4601 #endif
4602
4603 #if defined(CONFIG_HIGHPTE)
4604 -#define pte_offset_map(dir, address) \
4605 - ((pte_t *)kmap_atomic_pte(pmd_page(*(dir)),KM_PTE0) + \
4606 - pte_index(address))
4607 -#define pte_offset_map_nested(dir, address) \
4608 - ((pte_t *)kmap_atomic_pte(pmd_page(*(dir)),KM_PTE1) + \
4609 - pte_index(address))
4610 +#define pte_offset_map(dir, address) \
4611 +({ \
4612 + pte_t *__ptep; \
4613 + unsigned pfn = pmd_val(*(dir)) >> PAGE_SHIFT; \
4614 + __ptep = (pte_t *)kmap_atomic_pte(pfn_to_page(pfn),KM_PTE0); \
4615 + paravirt_map_pt_hook(KM_PTE0,__ptep, pfn); \
4616 + __ptep = __ptep + pte_index(address); \
4617 + __ptep; \
4618 +})
4619 +#define pte_offset_map_nested(dir, address) \
4620 +({ \
4621 + pte_t *__ptep; \
4622 + unsigned pfn = pmd_val(*(dir)) >> PAGE_SHIFT; \
4623 + __ptep = (pte_t *)kmap_atomic_pte(pfn_to_page(pfn),KM_PTE1); \
4624 + paravirt_map_pt_hook(KM_PTE1,__ptep, pfn); \
4625 + __ptep = __ptep + pte_index(address); \
4626 + __ptep; \
4627 +})
4628 #define pte_unmap(pte) kunmap_atomic(pte, KM_PTE0)
4629 #define pte_unmap_nested(pte) kunmap_atomic(pte, KM_PTE1)
4630 #else
4631 --- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/processor_32.h 2008-12-15 11:26:44.000000000 +0100
4632 +++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/processor_32.h 2009-03-04 11:25:55.000000000 +0100
4633 @@ -431,7 +431,7 @@ struct thread_struct {
4634 .vm86_info = NULL, \
4635 .sysenter_cs = __KERNEL_CS, \
4636 .io_bitmap_ptr = NULL, \
4637 - .gs = __KERNEL_PDA, \
4638 + .fs = __KERNEL_PDA, \
4639 }
4640
4641 /*
4642 @@ -449,8 +449,8 @@ struct thread_struct {
4643 }
4644
4645 #define start_thread(regs, new_eip, new_esp) do { \
4646 - __asm__("movl %0,%%fs": :"r" (0)); \
4647 - regs->xgs = 0; \
4648 + __asm__("movl %0,%%gs": :"r" (0)); \
4649 + regs->xfs = 0; \
4650 set_fs(USER_DS); \
4651 regs->xds = __USER_DS; \
4652 regs->xes = __USER_DS; \
4653 --- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/segment_32.h 2008-12-15 11:26:44.000000000 +0100
4654 +++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/segment_32.h 2009-03-04 11:25:55.000000000 +0100
4655 @@ -83,14 +83,8 @@
4656 * The GDT has 32 entries
4657 */
4658 #define GDT_ENTRIES 32
4659 -
4660 #define GDT_SIZE (GDT_ENTRIES * 8)
4661
4662 -/* Matches __KERNEL_CS and __USER_CS (they must be 2 entries apart) */
4663 -#define SEGMENT_IS_FLAT_CODE(x) (((x) & 0xec) == GDT_ENTRY_KERNEL_CS * 8)
4664 -/* Matches PNP_CS32 and PNP_CS16 (they must be consecutive) */
4665 -#define SEGMENT_IS_PNP_CODE(x) (((x) & 0xf4) == GDT_ENTRY_PNPBIOS_BASE * 8)
4666 -
4667 /* Simple and small GDT entries for booting only */
4668
4669 #define GDT_ENTRY_BOOT_CS 2
4670 @@ -132,4 +126,21 @@
4671 #define SEGMENT_GDT 0x0
4672
4673 #define get_kernel_rpl() (xen_feature(XENFEAT_supervisor_mode_kernel)?0:1)
4674 +
4675 +/*
4676 + * Matching rules for certain types of segments.
4677 + */
4678 +
4679 +/* Matches only __KERNEL_CS, ignoring PnP / USER / APM segments */
4680 +#define SEGMENT_IS_KERNEL_CODE(x) (((x) & ~3) == GDT_ENTRY_KERNEL_CS * 8 \
4681 + || ((x) & ~3) == (FLAT_KERNEL_CS & ~3))
4682 +
4683 +/* Matches __KERNEL_CS and __USER_CS (they must be 2 entries apart) */
4684 +#define SEGMENT_IS_FLAT_CODE(x) (((x) & ~0x13) == GDT_ENTRY_KERNEL_CS * 8 \
4685 + || ((x) & ~3) == (FLAT_KERNEL_CS & ~3) \
4686 + || ((x) & ~3) == (FLAT_USER_CS & ~3))
4687 +
4688 +/* Matches PNP_CS32 and PNP_CS16 (they must be consecutive) */
4689 +#define SEGMENT_IS_PNP_CODE(x) (((x) & ~0x0b) == GDT_ENTRY_PNPBIOS_BASE * 8)
4690 +
4691 #endif
4692 --- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/smp_32.h 2008-12-15 11:26:44.000000000 +0100
4693 +++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/smp_32.h 2009-03-04 11:25:55.000000000 +0100
4694 @@ -52,6 +52,11 @@ extern void cpu_exit_clear(void);
4695 extern void cpu_uninit(void);
4696 #endif
4697
4698 +#ifndef CONFIG_PARAVIRT
4699 +#define startup_ipi_hook(phys_apicid, start_eip, start_esp) \
4700 +do { } while (0)
4701 +#endif
4702 +
4703 /*
4704 * This function is needed by all SMP systems. It must _always_ be valid
4705 * from the initial startup. We map APIC_BASE very early in page_setup(),
4706 --- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/dma-mapping_64.h 2008-12-15 11:26:44.000000000 +0100
4707 +++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/dma-mapping_64.h 2009-03-04 11:25:55.000000000 +0100
4708 @@ -9,7 +9,6 @@
4709
4710 #include <asm/scatterlist.h>
4711 #include <asm/io.h>
4712 -#include <asm/swiotlb.h>
4713
4714 struct dma_mapping_ops {
4715 int (*mapping_error)(dma_addr_t dma_addr);
4716 @@ -67,6 +66,9 @@ static inline int dma_mapping_error(dma_
4717 #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
4718 #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
4719
4720 +#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
4721 +#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
4722 +
4723 extern void *dma_alloc_coherent(struct device *dev, size_t size,
4724 dma_addr_t *dma_handle, gfp_t gfp);
4725 extern void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
4726 --- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgtable_64.h 2008-12-15 11:26:44.000000000 +0100
4727 +++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-03-04 11:25:55.000000000 +0100
4728 @@ -416,15 +416,6 @@ static inline int pmd_large(pmd_t pte) {
4729 #define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot))
4730 #define mk_pte_huge(entry) (__pte_val(entry) |= _PAGE_PRESENT | _PAGE_PSE)
4731
4732 -/* physical address -> PTE */
4733 -static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot)
4734 -{
4735 - unsigned long pteval;
4736 - pteval = physpage | pgprot_val(pgprot);
4737 - pteval &= __supported_pte_mask;
4738 - return __pte(pteval);
4739 -}
4740 -
4741 /* Change flags of a PTE */
4742 static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
4743 {
4744 --- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/smp_64.h 2008-12-15 11:26:44.000000000 +0100
4745 +++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/smp_64.h 2009-03-04 11:25:55.000000000 +0100
4746 @@ -7,6 +7,7 @@
4747 #include <linux/threads.h>
4748 #include <linux/cpumask.h>
4749 #include <linux/bitops.h>
4750 +#include <linux/init.h>
4751 extern int disable_apic;
4752
4753 #ifdef CONFIG_X86_LOCAL_APIC
4754 @@ -73,7 +74,7 @@ extern int __cpu_disable(void);
4755 extern void __cpu_die(unsigned int cpu);
4756 extern void prefill_possible_map(void);
4757 extern unsigned num_processors;
4758 -extern unsigned disabled_cpus;
4759 +extern unsigned __cpuinitdata disabled_cpus;
4760
4761 #define NO_PROC_ID 0xFF /* No processor magic marker */
4762
4763 --- sle11-2009-05-14.orig/include/xen/xenbus.h 2008-11-25 12:35:56.000000000 +0100
4764 +++ sle11-2009-05-14/include/xen/xenbus.h 2009-03-04 11:25:55.000000000 +0100
4765 @@ -93,8 +93,7 @@ struct xenbus_device_id
4766
4767 /* A xenbus driver. */
4768 struct xenbus_driver {
4769 - char *name;
4770 - struct module *owner;
4771 + const char *name;
4772 const struct xenbus_device_id *ids;
4773 int (*probe)(struct xenbus_device *dev,
4774 const struct xenbus_device_id *id);
4775 @@ -115,8 +114,25 @@ static inline struct xenbus_driver *to_x
4776 return container_of(drv, struct xenbus_driver, driver);
4777 }
4778
4779 -int xenbus_register_frontend(struct xenbus_driver *drv);
4780 -int xenbus_register_backend(struct xenbus_driver *drv);
4781 +int __must_check __xenbus_register_frontend(struct xenbus_driver *drv,
4782 + struct module *owner,
4783 + const char *mod_name);
4784 +
4785 +static inline int __must_check
4786 +xenbus_register_frontend(struct xenbus_driver *drv)
4787 +{
4788 + return __xenbus_register_frontend(drv, THIS_MODULE, KBUILD_MODNAME);
4789 +}
4790 +
4791 +int __must_check __xenbus_register_backend(struct xenbus_driver *drv,
4792 + struct module *owner,
4793 + const char *mod_name);
4794 +static inline int __must_check
4795 +xenbus_register_backend(struct xenbus_driver *drv)
4796 +{
4797 + return __xenbus_register_backend(drv, THIS_MODULE, KBUILD_MODNAME);
4798 +}
4799 +
4800 void xenbus_unregister_driver(struct xenbus_driver *drv);
4801
4802 struct xenbus_transaction
4803 --- sle11-2009-05-14.orig/lib/swiotlb-xen.c 2009-03-20 10:00:58.000000000 +0100
4804 +++ sle11-2009-05-14/lib/swiotlb-xen.c 2009-03-04 11:25:55.000000000 +0100
4805 @@ -135,8 +135,8 @@ __setup("swiotlb=", setup_io_tlb_npages)
4806 * Statically reserve bounce buffer space and initialize bounce buffer data
4807 * structures for the software IO TLB used to implement the PCI DMA API.
4808 */
4809 -void
4810 -swiotlb_init_with_default_size (size_t default_size)
4811 +void __init
4812 +swiotlb_init_with_default_size(size_t default_size)
4813 {
4814 unsigned long i, bytes;
4815 int rc;
4816 @@ -221,7 +221,7 @@ swiotlb_init_with_default_size (size_t d
4817 dma_bits);
4818 }
4819
4820 -void
4821 +void __init
4822 swiotlb_init(void)
4823 {
4824 long ram_end;
4825 @@ -457,8 +457,8 @@ swiotlb_full(struct device *dev, size_t
4826 * When the mapping is small enough return a static buffer to limit
4827 * the damage, or panic when the transfer is too big.
4828 */
4829 - printk(KERN_ERR "PCI-DMA: Out of SW-IOMMU space for %lu bytes at "
4830 - "device %s\n", (unsigned long)size, dev ? dev->bus_id : "?");
4831 + printk(KERN_ERR "PCI-DMA: Out of SW-IOMMU space for %zu bytes at "
4832 + "device %s\n", size, dev ? dev->bus_id : "?");
4833
4834 if (size > io_tlb_overflow && do_panic) {
4835 if (dir == PCI_DMA_FROMDEVICE || dir == PCI_DMA_BIDIRECTIONAL)
4836 @@ -602,7 +602,7 @@ swiotlb_map_sg(struct device *hwdev, str
4837 sg[0].dma_length = 0;
4838 return 0;
4839 }
4840 - sg->dma_address = (dma_addr_t)virt_to_bus(map);
4841 + sg->dma_address = virt_to_bus(map);
4842 } else
4843 sg->dma_address = dev_addr;
4844 sg->dma_length = sg->length;
4845 @@ -624,8 +624,7 @@ swiotlb_unmap_sg(struct device *hwdev, s
4846
4847 for (i = 0; i < nelems; i++, sg++)
4848 if (in_swiotlb_aperture(sg->dma_address))
4849 - unmap_single(hwdev,
4850 - (void *)bus_to_virt(sg->dma_address),
4851 + unmap_single(hwdev, bus_to_virt(sg->dma_address),
4852 sg->dma_length, dir);
4853 else
4854 gnttab_dma_unmap_page(sg->dma_address);
4855 @@ -648,8 +647,7 @@ swiotlb_sync_sg_for_cpu(struct device *h
4856
4857 for (i = 0; i < nelems; i++, sg++)
4858 if (in_swiotlb_aperture(sg->dma_address))
4859 - sync_single(hwdev,
4860 - (void *)bus_to_virt(sg->dma_address),
4861 + sync_single(hwdev, bus_to_virt(sg->dma_address),
4862 sg->dma_length, dir);
4863 }
4864
4865 @@ -663,8 +661,7 @@ swiotlb_sync_sg_for_device(struct device
4866
4867 for (i = 0; i < nelems; i++, sg++)
4868 if (in_swiotlb_aperture(sg->dma_address))
4869 - sync_single(hwdev,
4870 - (void *)bus_to_virt(sg->dma_address),
4871 + sync_single(hwdev, bus_to_virt(sg->dma_address),
4872 sg->dma_length, dir);
4873 }
4874