71 lines
2.3 KiB
Diff
71 lines
2.3 KiB
Diff
|
# HG changeset patch
|
||
|
# User Keir Fraser <keir@xen.org>
|
||
|
# Date 1286028195 -3600
|
||
|
# Node ID aed9fd361340158daf2d7160d1b367478b6312d6
|
||
|
# Parent 3518149c4d5d0d8ce7402a24f95d3badbecc1c17
|
||
|
x86: fix boot failure (regression from pre-4.0 IRQ handling changes)
|
||
|
References: bnc#583568, bnc#615206
|
||
|
|
||
|
With the change to index irq_desc[] by IRQ rather than by vector, the
|
||
|
prior implicit change of the used flow handler when altering the IRQ
|
||
|
routing path to go through the 8259A didn't work anymore, and hence
|
||
|
on boards needing the ExtINT delivery workaround failed to boot.
|
||
|
|
||
|
Make make_8259A_irq() a real function again, thus allowing the flow
|
||
|
handler to be changed there.
|
||
|
|
||
|
Also eliminate the generally superfluous and (at least theoretically)
|
||
|
dangerous hard coded setting of the flow handler for IRQ0: Earlier
|
||
|
code should have set this already based on information coming from
|
||
|
ACPI/MPS, and non-standard systems may e.g. have this IRQ level
|
||
|
triggered.
|
||
|
|
||
|
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
||
|
Tested-by: Markus Schuster <ml@markus.schuster.name>
|
||
|
|
||
|
--- a/xen/arch/x86/i8259.c
|
||
|
+++ b/xen/arch/x86/i8259.c
|
||
|
@@ -367,6 +367,12 @@ void __devinit init_8259A(int auto_eoi)
|
||
|
spin_unlock_irqrestore(&i8259A_lock, flags);
|
||
|
}
|
||
|
|
||
|
+void __init make_8259A_irq(unsigned int irq)
|
||
|
+{
|
||
|
+ io_apic_irqs &= ~(1 << irq);
|
||
|
+ irq_to_desc(irq)->handler = &i8259A_irq_type;
|
||
|
+}
|
||
|
+
|
||
|
static struct irqaction __read_mostly cascade = { no_action, "cascade", NULL};
|
||
|
|
||
|
void __init init_IRQ(void)
|
||
|
--- a/xen/arch/x86/io_apic.c
|
||
|
+++ b/xen/arch/x86/io_apic.c
|
||
|
@@ -38,9 +38,6 @@
|
||
|
#include <io_ports.h>
|
||
|
#include <public/physdev.h>
|
||
|
|
||
|
-/* Different to Linux: our implementation can be simpler. */
|
||
|
-#define make_8259A_irq(irq) (io_apic_irqs &= ~(1<<(irq)))
|
||
|
-
|
||
|
int (*ioapic_renumber_irq)(int ioapic, int irq);
|
||
|
atomic_t irq_mis_count;
|
||
|
|
||
|
@@ -1929,7 +1926,6 @@ static inline void check_timer(void)
|
||
|
|
||
|
irq_desc[0].depth = 0;
|
||
|
irq_desc[0].status &= ~IRQ_DISABLED;
|
||
|
- irq_desc[0].handler = &ioapic_edge_type;
|
||
|
|
||
|
/*
|
||
|
* Subtle, code in do_timer_interrupt() expects an AEOI
|
||
|
--- a/xen/include/asm-x86/irq.h
|
||
|
+++ b/xen/include/asm-x86/irq.h
|
||
|
@@ -94,6 +94,7 @@ int i8259A_irq_pending(unsigned int irq)
|
||
|
void mask_8259A(void);
|
||
|
void unmask_8259A(void);
|
||
|
void init_8259A(int aeoi);
|
||
|
+void make_8259A_irq(unsigned int irq);
|
||
|
int i8259A_suspend(void);
|
||
|
int i8259A_resume(void);
|
||
|
|