diff options
author | Ingo Molnar <mingo@elte.hu> | 2006-10-04 05:16:26 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-04 10:55:25 -0400 |
commit | f5b9ed7acdcfea4bf73a70dececa7483787503ed (patch) | |
tree | d2d1510d8a4dd8a5a00310dd07ab791c2ab0612f /arch/i386/kernel/irq.c | |
parent | f29bd1ba68c8c6a0f50bd678bbd5a26674018f7c (diff) |
[PATCH] genirq: convert the i386 architecture to irq-chips
This patch converts all the i386 PIC controllers (except VisWS and Voyager,
which I could not test - but which should still work as old-style IRQ layers)
to the new and simpler irq-chip interrupt handling layer.
[akpm@osdl.org: build fix]
[mingo@elte.hu: enable fasteoi handler for i386 level-triggered IO-APIC irqs]
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Roland Dreier <rolandd@cisco.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/i386/kernel/irq.c')
-rw-r--r-- | arch/i386/kernel/irq.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/arch/i386/kernel/irq.c b/arch/i386/kernel/irq.c index 5fe547cd8f9f..3dd2e180151b 100644 --- a/arch/i386/kernel/irq.c +++ b/arch/i386/kernel/irq.c | |||
@@ -55,6 +55,7 @@ fastcall unsigned int do_IRQ(struct pt_regs *regs) | |||
55 | { | 55 | { |
56 | /* high bit used in ret_from_ code */ | 56 | /* high bit used in ret_from_ code */ |
57 | int irq = ~regs->orig_eax; | 57 | int irq = ~regs->orig_eax; |
58 | struct irq_desc *desc = irq_desc + irq; | ||
58 | #ifdef CONFIG_4KSTACKS | 59 | #ifdef CONFIG_4KSTACKS |
59 | union irq_ctx *curctx, *irqctx; | 60 | union irq_ctx *curctx, *irqctx; |
60 | u32 *isp; | 61 | u32 *isp; |
@@ -94,7 +95,7 @@ fastcall unsigned int do_IRQ(struct pt_regs *regs) | |||
94 | * current stack (which is the irq stack already after all) | 95 | * current stack (which is the irq stack already after all) |
95 | */ | 96 | */ |
96 | if (curctx != irqctx) { | 97 | if (curctx != irqctx) { |
97 | int arg1, arg2, ebx; | 98 | int arg1, arg2, arg3, ebx; |
98 | 99 | ||
99 | /* build the stack frame on the IRQ stack */ | 100 | /* build the stack frame on the IRQ stack */ |
100 | isp = (u32*) ((char*)irqctx + sizeof(*irqctx)); | 101 | isp = (u32*) ((char*)irqctx + sizeof(*irqctx)); |
@@ -110,16 +111,17 @@ fastcall unsigned int do_IRQ(struct pt_regs *regs) | |||
110 | (curctx->tinfo.preempt_count & SOFTIRQ_MASK); | 111 | (curctx->tinfo.preempt_count & SOFTIRQ_MASK); |
111 | 112 | ||
112 | asm volatile( | 113 | asm volatile( |
113 | " xchgl %%ebx,%%esp \n" | 114 | " xchgl %%ebx,%%esp \n" |
114 | " call __do_IRQ \n" | 115 | " call *%%edi \n" |
115 | " movl %%ebx,%%esp \n" | 116 | " movl %%ebx,%%esp \n" |
116 | : "=a" (arg1), "=d" (arg2), "=b" (ebx) | 117 | : "=a" (arg1), "=d" (arg2), "=c" (arg3), "=b" (ebx) |
117 | : "0" (irq), "1" (regs), "2" (isp) | 118 | : "0" (irq), "1" (desc), "2" (regs), "3" (isp), |
118 | : "memory", "cc", "ecx" | 119 | "D" (desc->handle_irq) |
120 | : "memory", "cc" | ||
119 | ); | 121 | ); |
120 | } else | 122 | } else |
121 | #endif | 123 | #endif |
122 | __do_IRQ(irq, regs); | 124 | desc->handle_irq(irq, desc, regs); |
123 | 125 | ||
124 | irq_exit(); | 126 | irq_exit(); |
125 | 127 | ||
@@ -253,7 +255,8 @@ int show_interrupts(struct seq_file *p, void *v) | |||
253 | for_each_online_cpu(j) | 255 | for_each_online_cpu(j) |
254 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 256 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); |
255 | #endif | 257 | #endif |
256 | seq_printf(p, " %14s", irq_desc[i].chip->typename); | 258 | seq_printf(p, " %8s", irq_desc[i].chip->name); |
259 | seq_printf(p, "-%s", handle_irq_name(irq_desc[i].handle_irq)); | ||
257 | seq_printf(p, " %s", action->name); | 260 | seq_printf(p, " %s", action->name); |
258 | 261 | ||
259 | for (action=action->next; action; action = action->next) | 262 | for (action=action->next; action; action = action->next) |