]> git.ipfire.org Git - ipfire-2.x.git/blame - src/patches/suse-2.6.27.39/patches.xen/xen-x86-no-lapic
Fix oinkmaster patch.
[ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.xen / xen-x86-no-lapic
CommitLineData
2cb7cef9
BS
1From: jbeulich@novell.com
2Subject: Disallow all accesses to the local APIC page
3Patch-mainline: obsolete
4References: 191115
5
82094b55
AF
6--- sle11-2009-08-26.orig/arch/x86/kernel/Makefile 2008-12-08 13:39:19.000000000 +0100
7+++ sle11-2009-08-26/arch/x86/kernel/Makefile 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
8@@ -120,9 +120,11 @@ ifeq ($(CONFIG_X86_64),y)
9
10 obj-$(CONFIG_PCI_MMCONFIG) += mmconf-fam10h_64.o
11
12+ apic_64-$(CONFIG_XEN) += apic_32.o
13 time_64-$(CONFIG_XEN) += time_32.o
14 endif
15
16-disabled-obj-$(CONFIG_XEN) := %_uv.o crash.o early-quirks.o hpet.o i8253.o \
17- i8259.o irqinit_$(BITS).o pci-swiotlb_64.o reboot.o smpboot.o \
18- tlb_$(BITS).o tsc.o tsc_sync.o uv_%.o vsmp_64.o
19+disabled-obj-$(CONFIG_XEN) := %_uv.o crash.o early-quirks.o genapic_flat_64.o \
20+ genx2apic_%.o hpet.o i8253.o i8259.o irqinit_$(BITS).o \
21+ pci-swiotlb_64.o reboot.o smpboot.o tlb_$(BITS).o tsc.o tsc_sync.o \
22+ uv_%.o vsmp_64.o
82094b55
AF
23--- sle11-2009-08-26.orig/arch/x86/kernel/acpi/boot.c 2009-08-26 12:03:49.000000000 +0200
24+++ sle11-2009-08-26/arch/x86/kernel/acpi/boot.c 2009-08-26 12:15:28.000000000 +0200
2cb7cef9
BS
25@@ -89,7 +89,7 @@ int acpi_sci_override_gsi __initdata;
26 int acpi_skip_timer_override __initdata;
27 int acpi_use_timer_override __initdata;
28
29-#ifdef CONFIG_X86_LOCAL_APIC
30+#if defined(CONFIG_X86_LOCAL_APIC) && !defined(CONFIG_XEN)
31 static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
32 #endif
33
34@@ -237,12 +237,14 @@ static int __init acpi_parse_madt(struct
35 return -ENODEV;
36 }
37
38+#ifndef CONFIG_XEN
39 if (madt->address) {
40 acpi_lapic_addr = (u64) madt->address;
41
42 printk(KERN_DEBUG PREFIX "Local APIC address 0x%08x\n",
43 madt->address);
44 }
45+#endif
46
47 acpi_madt_oem_check(madt->header.oem_id, madt->header.oem_table_id);
48
82094b55 49@@ -315,6 +317,7 @@ static int __init
2cb7cef9
BS
50 acpi_parse_lapic_addr_ovr(struct acpi_subtable_header * header,
51 const unsigned long end)
52 {
53+#ifndef CONFIG_XEN
54 struct acpi_madt_local_apic_override *lapic_addr_ovr = NULL;
55
56 lapic_addr_ovr = (struct acpi_madt_local_apic_override *)header;
82094b55 57@@ -323,6 +326,7 @@ acpi_parse_lapic_addr_ovr(struct acpi_su
2cb7cef9
BS
58 return -EINVAL;
59
60 acpi_lapic_addr = lapic_addr_ovr->address;
61+#endif
62
63 return 0;
64 }
82094b55 65@@ -902,10 +906,12 @@ static int mp_find_ioapic(int gsi)
2cb7cef9
BS
66 static u8 __init uniq_ioapic_id(u8 id)
67 {
68 #ifdef CONFIG_X86_32
69+#ifndef CONFIG_XEN
70 if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) &&
71 !APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
72 return io_apic_get_unique_id(nr_ioapics, id);
73 else
74+#endif
75 return id;
76 #else
77 int i;
82094b55 78@@ -1137,7 +1143,7 @@ int mp_register_gsi(u32 gsi, int trigger
2cb7cef9
BS
79
80 ioapic_pin = gsi - mp_ioapic_routing[ioapic].gsi_base;
81
82-#ifdef CONFIG_X86_32
83+#if defined(CONFIG_X86_32) && !defined(CONFIG_XEN)
84 if (ioapic_renumber_irq)
85 gsi = ioapic_renumber_irq(ioapic, gsi);
86 #endif
82094b55
AF
87--- sle11-2009-08-26.orig/arch/x86/kernel/apic_32-xen.c 2009-06-04 10:21:39.000000000 +0200
88+++ sle11-2009-08-26/arch/x86/kernel/apic_32-xen.c 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
89@@ -1,60 +1,11 @@
90 /*
91- * Local APIC handling, local APIC timers
92- *
93- * (c) 1999, 2000 Ingo Molnar <mingo@redhat.com>
94- *
95- * Fixes
96- * Maciej W. Rozycki : Bits for genuine 82489DX APICs;
97- * thanks to Eric Gilmore
98- * and Rolf G. Tews
99- * for testing these extensively.
100- * Maciej W. Rozycki : Various updates and fixes.
101- * Mikael Pettersson : Power Management for UP-APIC.
102- * Pavel Machek and
103- * Mikael Pettersson : PM converted to driver model.
104+ * Local APIC handling stubs
105 */
106
107 #include <linux/init.h>
108-
109-#include <linux/mm.h>
110-#include <linux/delay.h>
111-#include <linux/bootmem.h>
112 #include <linux/interrupt.h>
113-#include <linux/mc146818rtc.h>
114-#include <linux/kernel_stat.h>
115-#include <linux/sysdev.h>
116-#include <linux/cpu.h>
117-#include <linux/clockchips.h>
118-#include <linux/acpi_pmtmr.h>
119-#include <linux/module.h>
120
121-#include <asm/atomic.h>
122 #include <asm/smp.h>
123-#include <asm/mtrr.h>
124-#include <asm/mpspec.h>
125-#include <asm/desc.h>
126-#include <asm/arch_hooks.h>
127-#include <asm/hpet.h>
128-#include <asm/i8253.h>
129-#include <asm/nmi.h>
130-
131-#include <mach_apic.h>
132-#include <mach_apicdef.h>
133-#include <mach_ipi.h>
134-
135-#include "io_ports.h"
136-
137-#ifndef CONFIG_XEN
138-/*
139- * cpu_mask that denotes the CPUs that needs timer interrupt coming in as
140- * IPIs in place of local APIC timers
141- */
142-static cpumask_t timer_bcast_ipi;
143-#endif
144-
145-/*
146- * Knob to control our willingness to enable the local APIC.
147- */
148
149 /*
150 * Debug level, exported for io_apic.c
151@@ -64,33 +15,32 @@ unsigned int apic_verbosity;
152 /* Have we found an MP table */
153 int smp_found_config;
154
155-#ifndef CONFIG_XEN
156-static int modern_apic(void)
157+static int __init apic_set_verbosity(char *str)
158 {
159- /* AMD systems use old APIC versions, so check the CPU */
160- if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
161- boot_cpu_data.x86 >= 0xf)
162- return 1;
163- return lapic_get_version() >= 0x14;
164+ if (strcmp("debug", str) == 0)
165+ apic_verbosity = APIC_DEBUG;
166+ else if (strcmp("verbose", str) == 0)
167+ apic_verbosity = APIC_VERBOSE;
168+ return 1;
169 }
170-#endif /* !CONFIG_XEN */
171
172-int get_physical_broadcast(void)
173-{
174- return 0xff;
175-}
176+__setup("apic=", apic_set_verbosity);
177
178 int setup_profiling_timer(unsigned int multiplier)
179 {
180 return -EINVAL;
181 }
182
183+#ifndef CONFIG_SMP
184 /*
185 * This initializes the IO-APIC and APIC hardware if this is
186 * a UP kernel.
187 */
188 int __init APIC_init_uniprocessor(void)
189 {
190+ if (!cpu_has_apic)
191+ return -1;
192+
193 #ifdef CONFIG_X86_IO_APIC
194 if (smp_found_config)
195 if (!skip_ioapic_setup && nr_ioapics)
196@@ -99,3 +49,4 @@ int __init APIC_init_uniprocessor(void)
197
198 return 0;
199 }
200+#endif
82094b55 201--- sle11-2009-08-26.orig/arch/x86/kernel/apic_64-xen.c 2009-06-04 10:21:39.000000000 +0200
2cb7cef9
BS
202+++ /dev/null 1970-01-01 00:00:00.000000000 +0000
203@@ -1,188 +0,0 @@
204-/*
205- * Local APIC handling, local APIC timers
206- *
207- * (c) 1999, 2000 Ingo Molnar <mingo@redhat.com>
208- *
209- * Fixes
210- * Maciej W. Rozycki : Bits for genuine 82489DX APICs;
211- * thanks to Eric Gilmore
212- * and Rolf G. Tews
213- * for testing these extensively.
214- * Maciej W. Rozycki : Various updates and fixes.
215- * Mikael Pettersson : Power Management for UP-APIC.
216- * Pavel Machek and
217- * Mikael Pettersson : PM converted to driver model.
218- */
219-
220-#include <linux/init.h>
221-
222-#include <linux/mm.h>
223-#include <linux/delay.h>
224-#include <linux/bootmem.h>
225-#include <linux/interrupt.h>
226-#include <linux/mc146818rtc.h>
227-#include <linux/kernel_stat.h>
228-#include <linux/sysdev.h>
229-#include <linux/module.h>
230-
231-#include <asm/atomic.h>
232-#include <asm/smp.h>
233-#include <asm/mtrr.h>
234-#include <asm/mpspec.h>
235-#include <asm/desc.h>
236-#include <asm/arch_hooks.h>
237-#include <asm/hpet.h>
238-#include <asm/idle.h>
239-
240-int disable_apic;
241-
242-/*
243- * Debug level, exported for io_apic.c
244- */
245-unsigned int apic_verbosity;
246-
247-/* Have we found an MP table */
248-int smp_found_config;
249-
250-/*
251- * The guts of the apic timer interrupt
252- */
253-static void local_apic_timer_interrupt(void)
254-{
255-#ifndef CONFIG_XEN
256- int cpu = smp_processor_id();
257- struct clock_event_device *evt = &per_cpu(lapic_events, cpu);
258-
259- /*
260- * Normally we should not be here till LAPIC has been initialized but
261- * in some cases like kdump, its possible that there is a pending LAPIC
262- * timer interrupt from previous kernel's context and is delivered in
263- * new kernel the moment interrupts are enabled.
264- *
265- * Interrupts are enabled early and LAPIC is setup much later, hence
266- * its possible that when we get here evt->event_handler is NULL.
267- * Check for event_handler being NULL and discard the interrupt as
268- * spurious.
269- */
270- if (!evt->event_handler) {
271- printk(KERN_WARNING
272- "Spurious LAPIC timer interrupt on cpu %d\n", cpu);
273- /* Switch it off */
274- lapic_timer_setup(CLOCK_EVT_MODE_SHUTDOWN, evt);
275- return;
276- }
277-#endif
278-
279- /*
280- * the NMI deadlock-detector uses this.
281- */
282- add_pda(apic_timer_irqs, 1);
283-
284-#ifndef CONFIG_XEN
285- evt->event_handler(evt);
286-#endif
287-}
288-
289-/*
290- * Local APIC timer interrupt. This is the most natural way for doing
291- * local interrupts, but local timer interrupts can be emulated by
292- * broadcast interrupts too. [in case the hw doesn't support APIC timers]
293- *
294- * [ if a single-CPU system runs an SMP kernel then we call the local
295- * interrupt as well. Thus we cannot inline the local irq ... ]
296- */
297-void smp_apic_timer_interrupt(struct pt_regs *regs)
298-{
299- struct pt_regs *old_regs = set_irq_regs(regs);
300-
301- /*
302- * NOTE! We'd better ACK the irq immediately,
303- * because timer handling can be slow.
304- */
305- ack_APIC_irq();
306- /*
307- * update_process_times() expects us to have done irq_enter().
308- * Besides, if we don't timer interrupts ignore the global
309- * interrupt lock, which is the WrongThing (tm) to do.
310- */
311- exit_idle();
312- irq_enter();
313- local_apic_timer_interrupt();
314- irq_exit();
315- set_irq_regs(old_regs);
316-}
317-
318-int setup_profiling_timer(unsigned int multiplier)
319-{
320- return -EINVAL;
321-}
322-
323-/*
324- * This initializes the IO-APIC and APIC hardware if this is
325- * a UP kernel.
326- */
327-int __init APIC_init_uniprocessor(void)
328-{
329-#ifdef CONFIG_X86_IO_APIC
330- if (smp_found_config && !skip_ioapic_setup && nr_ioapics)
331- setup_IO_APIC();
332-#endif
333-
334- return 1;
335-}
336-
337-/*
338- * Local APIC interrupts
339- */
340-
341-/*
342- * This interrupt should _never_ happen with our APIC/SMP architecture
343- */
344-asmlinkage void smp_spurious_interrupt(void)
345-{
346- unsigned int v;
347- exit_idle();
348- irq_enter();
349- /*
350- * Check if this really is a spurious interrupt and ACK it
351- * if it is a vectored one. Just in case...
352- * Spurious interrupts should not be ACKed.
353- */
354- v = apic_read(APIC_ISR + ((SPURIOUS_APIC_VECTOR & ~0x1f) >> 1));
355- if (v & (1 << (SPURIOUS_APIC_VECTOR & 0x1f)))
356- ack_APIC_irq();
357-
358- add_pda(irq_spurious_count, 1);
359- irq_exit();
360-}
361-
362-/*
363- * This interrupt should never happen with our APIC/SMP architecture
364- */
365-asmlinkage void smp_error_interrupt(void)
366-{
367- unsigned int v, v1;
368-
369- exit_idle();
370- irq_enter();
371- /* First tickle the hardware, only then report what went on. -- REW */
372- v = apic_read(APIC_ESR);
373- apic_write(APIC_ESR, 0);
374- v1 = apic_read(APIC_ESR);
375- ack_APIC_irq();
376- atomic_inc(&irq_err_count);
377-
378- /* Here is what the APIC error bits mean:
379- 0: Send CS error
380- 1: Receive CS error
381- 2: Send accept error
382- 3: Receive accept error
383- 4: Reserved
384- 5: Send illegal vector
385- 6: Received illegal vector
386- 7: Illegal register address
387- */
388- printk (KERN_DEBUG "APIC error on CPU%d: %02x(%02x)\n",
389- smp_processor_id(), v , v1);
390- irq_exit();
391-}
82094b55
AF
392--- sle11-2009-08-26.orig/arch/x86/kernel/cpu/common-xen.c 2009-02-16 17:03:24.000000000 +0100
393+++ sle11-2009-08-26/arch/x86/kernel/cpu/common-xen.c 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
394@@ -19,10 +19,6 @@
395 #include <asm/mpspec.h>
396 #include <asm/apic.h>
397 #include <mach_apic.h>
398-#else
399-#ifdef CONFIG_XEN
400-#define phys_pkg_id(a,b) a
401-#endif
402 #endif
403 #include <asm/hypervisor.h>
404
82094b55
AF
405--- sle11-2009-08-26.orig/arch/x86/kernel/genapic_64-xen.c 2008-11-04 14:40:00.000000000 +0100
406+++ sle11-2009-08-26/arch/x86/kernel/genapic_64-xen.c 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
407@@ -18,7 +18,6 @@
408 #include <linux/hardirq.h>
409
410 #include <asm/smp.h>
411-#include <asm/ipi.h>
412 #include <asm/genapic.h>
413
414 #ifdef CONFIG_ACPI
82094b55
AF
415--- sle11-2009-08-26.orig/arch/x86/kernel/genapic_xen_64.c 2009-06-04 10:47:21.000000000 +0200
416+++ sle11-2009-08-26/arch/x86/kernel/genapic_xen_64.c 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
417@@ -18,7 +18,6 @@
418 #include <linux/init.h>
419 #ifdef CONFIG_XEN_PRIVILEGED_GUEST
420 #include <asm/smp.h>
421-#include <asm/ipi.h>
422 #else
423 #include <asm/apic.h>
424 #endif
425@@ -78,20 +77,6 @@ static const cpumask_t *xen_target_cpus(
426 return &cpu_online_map;
427 }
428
429-static void xen_vector_allocation_domain(int cpu, cpumask_t *retmask)
430-{
431- cpus_clear(*retmask);
432- cpu_set(cpu, *retmask);
433-}
434-
435-/*
436- * Set up the logical destination ID.
437- * Do nothing, not called now.
438- */
439-static void xen_init_apic_ldr(void)
440-{
441-}
442-
443 static void xen_send_IPI_mask(const cpumask_t *cpumask, int vector)
444 {
445 xen_send_IPI_shortcut(APIC_DEST_ALLINC, cpumask, vector);
446@@ -118,17 +103,9 @@ static void xen_send_IPI_self(int vector
447 xen_send_IPI_shortcut(APIC_DEST_SELF, NULL, vector);
448 }
449
450-#ifdef CONFIG_XEN_PRIVILEGED_GUEST
451-static int xen_apic_id_registered(void)
452-{
453- /* better be set */
454- return physid_isset(smp_processor_id(), phys_cpu_present_map);
455-}
456-#endif
457-
458 static unsigned int xen_cpu_mask_to_apicid(const cpumask_t *cpumask)
459 {
460- return cpus_addr(*cpumask)[0] & APIC_ALL_CPUS;
461+ return cpus_addr(*cpumask)[0];
462 }
463
464 static unsigned int phys_pkg_id(int index_msb)
465@@ -144,13 +121,8 @@ struct genapic apic_xen = {
466 #ifdef CONFIG_XEN_PRIVILEGED_GUEST
467 .int_delivery_mode = dest_LowestPrio,
468 #endif
469- .int_dest_mode = (APIC_DEST_LOGICAL != 0),
470+ .int_dest_mode = 1,
471 .target_cpus = xen_target_cpus,
472- .vector_allocation_domain = xen_vector_allocation_domain,
473-#ifdef CONFIG_XEN_PRIVILEGED_GUEST
474- .apic_id_registered = xen_apic_id_registered,
475-#endif
476- .init_apic_ldr = xen_init_apic_ldr,
477 .send_IPI_all = xen_send_IPI_all,
478 .send_IPI_allbutself = xen_send_IPI_allbutself,
479 .send_IPI_mask = xen_send_IPI_mask,
82094b55
AF
480--- sle11-2009-08-26.orig/arch/x86/kernel/io_apic_32-xen.c 2008-11-25 14:37:47.000000000 +0100
481+++ sle11-2009-08-26/arch/x86/kernel/io_apic_32-xen.c 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
482@@ -48,7 +48,6 @@
483 #include <asm/hypertransport.h>
484
485 #include <mach_apic.h>
486-#include <mach_apicdef.h>
487
488 #ifdef CONFIG_XEN
489 #include <xen/interface/xen.h>
490@@ -63,20 +62,20 @@
491 unsigned long io_apic_irqs;
492
493 #define clear_IO_APIC() ((void)0)
494-#endif /* CONFIG_XEN */
495-
496+#else
497 int (*ioapic_renumber_irq)(int ioapic, int irq);
498 atomic_t irq_mis_count;
499
500-#ifndef CONFIG_XEN
501 /* Where if anywhere is the i8259 connect in external int mode */
502 static struct { int pin, apic; } ioapic_i8259 = { -1, -1 };
503-#endif
504+#endif /* CONFIG_XEN */
505
506 static DEFINE_SPINLOCK(ioapic_lock);
507 static DEFINE_SPINLOCK(vector_lock);
508
509+#ifndef CONFIG_XEN
510 int timer_through_8259 __initdata;
511+#endif
512
513 /*
514 * Is the SiS APIC rmw bug present ?
515@@ -105,7 +104,9 @@ int mp_bus_id_to_type[MAX_MP_BUSSES];
516
517 DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES);
518
519+#ifndef CONFIG_XEN
520 static int disable_timer_pin_1 __initdata;
521+#endif
522
523 /*
524 * Rough estimation of how many shared IRQs there are, can
525@@ -1177,11 +1178,13 @@ static int pin_2_irq(int idx, int apic,
526 irq += nr_ioapic_registers[i++];
527 irq += pin;
528
529+#ifndef CONFIG_XEN
530 /*
531 * For MPS mode, so far only needed by ES7000 platform
532 */
533 if (ioapic_renumber_irq)
534 irq = ioapic_renumber_irq(apic, irq);
535+#endif
536 }
537
538 /*
539@@ -2933,6 +2936,7 @@ int acpi_get_override_irq(int bus_irq, i
540
541 #endif /* CONFIG_ACPI */
542
543+#ifndef CONFIG_XEN
544 static int __init parse_disable_timer_pin_1(char *arg)
545 {
546 disable_timer_pin_1 = 1;
547@@ -2946,6 +2950,7 @@ static int __init parse_enable_timer_pin
548 return 0;
549 }
550 early_param("enable_timer_pin_1", parse_enable_timer_pin_1);
551+#endif
552
553 static int __init parse_noapic(char *arg)
554 {
82094b55
AF
555--- sle11-2009-08-26.orig/arch/x86/kernel/io_apic_64-xen.c 2008-11-25 14:29:21.000000000 +0100
556+++ sle11-2009-08-26/arch/x86/kernel/io_apic_64-xen.c 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
557@@ -78,10 +78,6 @@ char system_vectors[NR_VECTORS] = { [0 .
558
559 int sis_apic_bug; /* not actually supported, dummy for compile */
560
561-static int no_timer_check;
562-
563-static int disable_timer_pin_1 __initdata;
564-
565 #ifdef CONFIG_XEN
566 #include <xen/interface/xen.h>
567 #include <xen/interface/physdev.h>
568@@ -96,6 +92,10 @@ unsigned long io_apic_irqs;
569
570 #define clear_IO_APIC() ((void)0)
571 #else
572+static int no_timer_check;
573+
574+static int disable_timer_pin_1 __initdata;
575+
576 int timer_through_8259 __initdata;
577
578 /* Where if anywhere is the i8259 connect in external int mode */
579@@ -487,6 +487,7 @@ static int __init parse_noapic(char *str
580 }
581 early_param("noapic", parse_noapic);
582
583+#ifndef CONFIG_XEN
584 /* Actually the next is obsolete, but keep it for paranoid reasons -AK */
585 static int __init disable_timer_pin_setup(char *arg)
586 {
587@@ -494,6 +495,7 @@ static int __init disable_timer_pin_setu
588 return 1;
589 }
590 __setup("disable_timer_pin_1", disable_timer_pin_setup);
591+#endif
592
593
594 /*
595@@ -1820,10 +1822,6 @@ static inline void __init check_timer(vo
596 out:
597 local_irq_restore(flags);
598 }
599-#else
600-#define check_timer() ((void)0)
601-int timer_uses_ioapic_pin_0 = 0;
602-#endif /* !CONFIG_XEN */
603
604 static int __init notimercheck(char *s)
605 {
606@@ -1831,6 +1829,10 @@ static int __init notimercheck(char *s)
607 return 1;
608 }
609 __setup("no_timer_check", notimercheck);
610+#else
611+#define check_timer() ((void)0)
612+int timer_uses_ioapic_pin_0 = 0;
613+#endif /* !CONFIG_XEN */
614
615 /*
616 *
82094b55
AF
617--- sle11-2009-08-26.orig/arch/x86/kernel/irq_32-xen.c 2009-06-04 10:47:21.000000000 +0200
618+++ sle11-2009-08-26/arch/x86/kernel/irq_32-xen.c 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
619@@ -252,7 +252,9 @@ unsigned int do_IRQ(struct pt_regs *regs
620 * Interrupt statistics:
621 */
622
623+#ifndef CONFIG_XEN
624 atomic_t irq_err_count;
625+#endif
626
627 /*
628 * /proc/interrupts printing:
629@@ -308,7 +310,7 @@ skip:
630 for_each_online_cpu(j)
631 seq_printf(p, "%10u ", nmi_count(j));
632 seq_printf(p, " Non-maskable interrupts\n");
633-#ifdef CONFIG_X86_LOCAL_APIC
634+#if defined(CONFIG_X86_LOCAL_APIC) && !defined(CONFIG_XEN)
635 seq_printf(p, "LOC: ");
636 for_each_online_cpu(j)
637 seq_printf(p, "%10u ",
638@@ -341,6 +343,7 @@ skip:
639 per_cpu(irq_stat,j).irq_thermal_count);
640 seq_printf(p, " Thermal event interrupts\n");
641 #endif
642+#ifndef CONFIG_XEN
643 #ifdef CONFIG_X86_LOCAL_APIC
644 seq_printf(p, "SPU: ");
645 for_each_online_cpu(j)
646@@ -352,6 +355,7 @@ skip:
647 #if defined(CONFIG_X86_IO_APIC)
648 seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
649 #endif
650+#endif
651 }
652 return 0;
653 }
654@@ -384,12 +388,16 @@ u64 arch_irq_stat_cpu(unsigned int cpu)
655
656 u64 arch_irq_stat(void)
657 {
658+#ifndef CONFIG_XEN
659 u64 sum = atomic_read(&irq_err_count);
660
661 #ifdef CONFIG_X86_IO_APIC
662 sum += atomic_read(&irq_mis_count);
663 #endif
664 return sum;
665+#else
666+ return 0;
667+#endif
668 }
669
670 #ifdef CONFIG_HOTPLUG_CPU
82094b55
AF
671--- sle11-2009-08-26.orig/arch/x86/kernel/irq_64-xen.c 2009-06-04 10:47:21.000000000 +0200
672+++ sle11-2009-08-26/arch/x86/kernel/irq_64-xen.c 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
673@@ -18,7 +18,9 @@
674 #include <asm/idle.h>
675 #include <asm/smp.h>
676
677+#ifndef CONFIG_XEN
678 atomic_t irq_err_count;
679+#endif
680
681 /*
682 * 'what should we do if we get a hw irq event on an illegal vector'.
683@@ -27,19 +29,6 @@ atomic_t irq_err_count;
684 void ack_bad_irq(unsigned int irq)
685 {
686 printk(KERN_WARNING "unexpected IRQ trap at irq %02x\n", irq);
687-#ifdef CONFIG_X86_LOCAL_APIC
688- /*
689- * Currently unexpected vectors happen only on SMP and APIC.
690- * We _must_ ack these because every local APIC has only N
691- * irq slots per priority level, and a 'hanging, unacked' IRQ
692- * holds up an irq slot - in excessive cases (when multiple
693- * unexpected vectors occur) that might lock up the APIC
694- * completely.
695- * But don't ack when the APIC is disabled. -AK
696- */
697- if (!disable_apic)
698- ack_APIC_irq();
699-#endif
700 }
701
702 #ifdef CONFIG_DEBUG_STACKOVERFLOW
703@@ -119,7 +108,7 @@ skip:
704 for_each_online_cpu(j)
705 seq_printf(p, "%10u ", cpu_pda(j)->__nmi_count);
706 seq_printf(p, " Non-maskable interrupts\n");
707-#ifdef CONFIG_X86_LOCAL_APIC
708+#ifndef CONFIG_XEN
709 seq_printf(p, "LOC: ");
710 for_each_online_cpu(j)
711 seq_printf(p, "%10u ", cpu_pda(j)->apic_timer_irqs);
712@@ -151,13 +140,13 @@ skip:
713 seq_printf(p, "%10u ", cpu_pda(j)->irq_threshold_count);
714 seq_printf(p, " Threshold APIC interrupts\n");
715 #endif
716-#ifdef CONFIG_X86_LOCAL_APIC
717+#ifndef CONFIG_XEN
718 seq_printf(p, "SPU: ");
719 for_each_online_cpu(j)
720 seq_printf(p, "%10u ", cpu_pda(j)->irq_spurious_count);
721 seq_printf(p, " Spurious interrupts\n");
722-#endif
723 seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
724+#endif
725 }
726 return 0;
727 }
728@@ -187,7 +176,11 @@ u64 arch_irq_stat_cpu(unsigned int cpu)
729
730 u64 arch_irq_stat(void)
731 {
732+#ifndef CONFIG_XEN
733 return atomic_read(&irq_err_count);
734+#else
735+ return 0;
736+#endif
737 }
738
739 /*
82094b55
AF
740--- sle11-2009-08-26.orig/arch/x86/kernel/mpparse-xen.c 2009-06-04 10:21:39.000000000 +0200
741+++ sle11-2009-08-26/arch/x86/kernel/mpparse-xen.c 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
742@@ -31,7 +31,6 @@
743
744 #include <mach_apic.h>
745 #ifdef CONFIG_X86_32
746-#include <mach_apicdef.h>
747 #include <mach_mpparse.h>
748 #endif
749
750@@ -287,7 +286,9 @@ static int __init smp_check_mpc(struct m
751
752 printk(KERN_INFO "MPTABLE: Product ID: %s\n", str);
753
754+#ifndef CONFIG_XEN
755 printk(KERN_INFO "MPTABLE: APIC at: 0x%X\n", mpc->mpc_lapic);
756+#endif
757
758 return 1;
759 }
760@@ -315,9 +316,11 @@ static int __init smp_read_mpc(struct mp
761 } else
762 mps_oem_check(mpc, oem, str);
763 #endif
764+#ifndef CONFIG_XEN
765 /* save the local APIC address, it might be non-default */
766 if (!acpi_lapic)
767 mp_lapic_addr = mpc->mpc_lapic;
768+#endif
769
770 if (early)
771 return 1;
772@@ -548,10 +551,12 @@ static inline void __init construct_defa
773 int linttypes[2] = { mp_ExtINT, mp_NMI };
774 int i;
775
776+#ifndef CONFIG_XEN
777 /*
778 * local APIC has default address
779 */
780 mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
781+#endif
782
783 /*
784 * 2 CPUs, numbered 0 & 1.
785@@ -627,10 +632,12 @@ static void __init __get_smp_config(unsi
786 */
787 if (mpf->mpf_feature1 != 0) {
788 if (early) {
789+#ifndef CONFIG_XEN
790 /*
791 * local APIC has default address
792 */
793 mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
794+#endif
795 return;
796 }
797
82094b55
AF
798--- sle11-2009-08-26.orig/arch/x86/kernel/setup_percpu-xen.c 2009-06-04 10:21:39.000000000 +0200
799+++ sle11-2009-08-26/arch/x86/kernel/setup_percpu-xen.c 2009-08-26 12:17:43.000000000 +0200
800@@ -17,14 +17,9 @@
801
802 #ifdef CONFIG_X86_LOCAL_APIC
803 unsigned int num_processors;
804-unsigned disabled_cpus __cpuinitdata;
805 /* Processor that is doing the boot up */
806 unsigned int boot_cpu_physical_apicid = -1U;
807-unsigned int max_physical_apicid;
808 EXPORT_SYMBOL(boot_cpu_physical_apicid);
809-
810-/* Bitmask of physically existing CPUs */
811-physid_mask_t phys_cpu_present_map;
812 #endif
813
814 /* map cpu index to physical APIC ID */
815--- sle11-2009-08-26.orig/arch/x86/kernel/traps_64-xen.c 2008-12-08 13:39:19.000000000 +0100
816+++ sle11-2009-08-26/arch/x86/kernel/traps_64-xen.c 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
817@@ -1174,15 +1174,15 @@ asmlinkage void do_spurious_interrupt_bu
818 {
819 }
820
821-#if 0
822+#ifndef CONFIG_XEN
823 asmlinkage void __attribute__((weak)) smp_thermal_interrupt(void)
824 {
825 }
826-#endif
827
828 asmlinkage void __attribute__((weak)) mce_threshold_interrupt(void)
829 {
830 }
831+#endif
832
833 /*
834 * 'math_state_restore()' saves the current math information in the
82094b55
AF
835--- sle11-2009-08-26.orig/drivers/xen/core/smpboot.c 2009-06-04 10:47:28.000000000 +0200
836+++ sle11-2009-08-26/drivers/xen/core/smpboot.c 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
837@@ -346,7 +346,7 @@ void __init smp_prepare_cpus(unsigned in
838 * Here we can be sure that there is an IO-APIC in the system. Let's
839 * go and set it up:
840 */
841- if (!skip_ioapic_setup && nr_ioapics)
842+ if (cpu_has_apic && !skip_ioapic_setup && nr_ioapics)
843 setup_IO_APIC();
844 #endif
845 }
82094b55
AF
846--- sle11-2009-08-26.orig/include/asm-x86/apic.h 2008-12-01 11:11:08.000000000 +0100
847+++ sle11-2009-08-26/include/asm-x86/apic.h 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
848@@ -5,7 +5,9 @@
849 #include <linux/delay.h>
850
851 #include <asm/alternative.h>
852+#ifndef CONFIG_XEN
853 #include <asm/fixmap.h>
854+#endif
855 #include <asm/apicdef.h>
856 #include <asm/processor.h>
857 #include <asm/system.h>
858@@ -40,6 +42,7 @@ extern void generic_apic_probe(void);
859 #ifdef CONFIG_X86_LOCAL_APIC
860
861 extern unsigned int apic_verbosity;
862+#ifndef CONFIG_XEN
863 extern int local_apic_timer_c2_ok;
864
865 extern int ioapic_force;
866@@ -149,6 +152,7 @@ static inline void ack_APIC_irq(void)
867 /* Docs say use 0 for future compatibility */
868 apic_write(APIC_EOI, 0);
869 }
870+#endif
871
872 extern int lapic_get_maxlvt(void);
873 extern void clear_local_APIC(void);
82094b55
AF
874--- sle11-2009-08-26.orig/include/asm-x86/apicdef.h 2009-08-26 11:46:28.000000000 +0200
875+++ sle11-2009-08-26/include/asm-x86/apicdef.h 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
876@@ -1,6 +1,8 @@
877 #ifndef _ASM_X86_APICDEF_H
878 #define _ASM_X86_APICDEF_H
879
880+#ifndef CONFIG_XEN
881+
882 /*
883 * Constants for various Intel APICs. (local APIC, IOAPIC, etc.)
884 *
885@@ -132,6 +134,16 @@
886 #define APIC_BASE_MSR 0x800
887 #define X2APIC_ENABLE (1UL << 10)
888
889+#else /* CONFIG_XEN */
890+
891+enum {
892+ APIC_DEST_ALLBUT = 0x1,
893+ APIC_DEST_SELF,
894+ APIC_DEST_ALLINC
895+};
896+
897+#endif /* CONFIG_XEN */
898+
899 #ifdef CONFIG_X86_32
900 # define MAX_IO_APICS 64
901 #else
902@@ -139,6 +151,8 @@
903 # define MAX_LOCAL_APIC 32768
904 #endif
905
906+#ifndef CONFIG_XEN
907+
908 /*
909 * All x86-64 systems are xAPIC compatible.
910 * In the following, "apicid" is a physical APIC ID.
911@@ -409,6 +423,8 @@ struct local_apic {
912
913 #undef u32
914
915+#endif /* CONFIG_XEN */
916+
917 #ifdef CONFIG_X86_32
918 #define BAD_APICID 0xFFu
919 #else
82094b55
AF
920--- sle11-2009-08-26.orig/include/asm-x86/ipi.h 2009-08-26 11:46:28.000000000 +0200
921+++ sle11-2009-08-26/include/asm-x86/ipi.h 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
922@@ -1,6 +1,8 @@
923 #ifndef __ASM_IPI_H
924 #define __ASM_IPI_H
925
926+#ifndef CONFIG_XEN
927+
928 /*
929 * Copyright 2004 James Cleverdon, IBM.
930 * Subject to the GNU Public License, v.2
931@@ -151,4 +153,6 @@ static inline void send_IPI_mask_allbuts
932 local_irq_restore(flags);
933 }
934
935+#endif /* CONFIG_XEN */
936+
937 #endif /* __ASM_IPI_H */
82094b55
AF
938--- sle11-2009-08-26.orig/include/asm-x86/mach-xen/asm/fixmap_32.h 2009-06-04 10:21:39.000000000 +0200
939+++ sle11-2009-08-26/include/asm-x86/mach-xen/asm/fixmap_32.h 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
940@@ -55,10 +55,10 @@ enum fixed_addresses {
941 FIX_VDSO,
942 FIX_DBGP_BASE,
943 FIX_EARLYCON_MEM_BASE,
944+#ifndef CONFIG_XEN
945 #ifdef CONFIG_X86_LOCAL_APIC
946 FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
947 #endif
948-#ifndef CONFIG_XEN
949 #ifdef CONFIG_X86_IO_APIC
950 FIX_IO_APIC_BASE_0,
951 FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS-1,
82094b55
AF
952--- sle11-2009-08-26.orig/include/asm-x86/mach-xen/asm/fixmap_64.h 2009-06-04 10:21:39.000000000 +0200
953+++ sle11-2009-08-26/include/asm-x86/mach-xen/asm/fixmap_64.h 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
954@@ -13,7 +13,6 @@
955
956 #include <linux/kernel.h>
957 #include <asm/acpi.h>
958-#include <asm/apicdef.h>
959 #include <asm/page.h>
960 #include <asm/vsyscall.h>
961 #include <asm/efi.h>
962@@ -41,10 +40,8 @@ enum fixed_addresses {
963 VSYSCALL_HPET,
964 FIX_DBGP_BASE,
965 FIX_EARLYCON_MEM_BASE,
966-#ifdef CONFIG_X86_LOCAL_APIC
967- FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
968-#endif
969 #ifndef CONFIG_XEN
970+ FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
971 FIX_IO_APIC_BASE_0,
972 FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS - 1,
973 #endif
82094b55
AF
974--- sle11-2009-08-26.orig/include/asm-x86/mach-xen/asm/smp.h 2008-11-04 14:07:28.000000000 +0100
975+++ sle11-2009-08-26/include/asm-x86/mach-xen/asm/smp.h 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
976@@ -16,7 +16,7 @@
977 # endif
978 #endif
979 #include <asm/pda.h>
980-#include <asm/thread_info.h>
981+#include <linux/thread_info.h>
982
983 #define cpu_callout_map cpu_possible_map
984 extern cpumask_t cpu_initialized;
985@@ -178,7 +178,7 @@ DECLARE_PER_CPU(int, cpu_number);
986 #define stack_smp_processor_id() 0
987 #endif
988
989-#ifdef CONFIG_X86_LOCAL_APIC
990+#if defined(CONFIG_X86_LOCAL_APIC) && !defined(CONFIG_XEN)
991
992 static inline int logical_smp_processor_id(void)
993 {
994--- /dev/null 1970-01-01 00:00:00.000000000 +0000
82094b55 995+++ sle11-2009-08-26/include/asm-x86/mach-xen/mach_apic.h 2009-06-04 10:47:37.000000000 +0200
2cb7cef9
BS
996@@ -0,0 +1,54 @@
997+#ifndef __ASM_MACH_APIC_H
998+#define __ASM_MACH_APIC_H
999+
1000+#include <asm/smp.h>
1001+
1002+#ifdef CONFIG_X86_64
1003+
1004+#include <asm/genapic.h>
1005+#define INT_DELIVERY_MODE (genapic->int_delivery_mode)
1006+#define INT_DEST_MODE (genapic->int_dest_mode)
1007+#define TARGET_CPUS (genapic->target_cpus())
1008+#define cpu_mask_to_apicid (genapic->cpu_mask_to_apicid)
1009+#define phys_pkg_id (genapic->phys_pkg_id)
1010+#define send_IPI_self (genapic->send_IPI_self)
1011+extern void setup_apic_routing(void);
1012+
1013+#else
1014+
1015+#ifdef CONFIG_SMP
1016+#define TARGET_CPUS cpu_online_map
1017+#else
1018+#define TARGET_CPUS cpumask_of_cpu(0)
1019+#endif
1020+
1021+#define INT_DELIVERY_MODE dest_LowestPrio
1022+#define INT_DEST_MODE 1
1023+
1024+static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
1025+{
1026+ return cpuid_apic;
1027+}
1028+
1029+static inline void setup_apic_routing(void)
1030+{
1031+}
1032+
1033+static inline int multi_timer_check(int apic, int irq)
1034+{
1035+ return 0;
1036+}
1037+
1038+static inline int apicid_to_node(int logical_apicid)
1039+{
1040+ return 0;
1041+}
1042+
1043+static inline unsigned int cpu_mask_to_apicid(cpumask_t cpumask)
1044+{
1045+ return cpus_addr(cpumask)[0];
1046+}
1047+
1048+#endif /* CONFIG_X86_64 */
1049+
1050+#endif /* __ASM_MACH_APIC_H */