diff options
Diffstat (limited to 'arch/sh/kernel/irq.c')
-rw-r--r-- | arch/sh/kernel/irq.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c index c7ebd6aec951..3b93682bf18b 100644 --- a/arch/sh/kernel/irq.c +++ b/arch/sh/kernel/irq.c | |||
@@ -17,6 +17,8 @@ | |||
17 | #include <asm/thread_info.h> | 17 | #include <asm/thread_info.h> |
18 | #include <asm/cpu/mmu_context.h> | 18 | #include <asm/cpu/mmu_context.h> |
19 | 19 | ||
20 | atomic_t irq_err_count; | ||
21 | |||
20 | /* | 22 | /* |
21 | * 'what should we do if we get a hw irq event on an illegal vector'. | 23 | * 'what should we do if we get a hw irq event on an illegal vector'. |
22 | * each architecture has to answer this themselves, it doesn't deserve | 24 | * each architecture has to answer this themselves, it doesn't deserve |
@@ -47,8 +49,10 @@ int show_interrupts(struct seq_file *p, void *v) | |||
47 | if (!action) | 49 | if (!action) |
48 | goto unlock; | 50 | goto unlock; |
49 | seq_printf(p, "%3d: ",i); | 51 | seq_printf(p, "%3d: ",i); |
50 | seq_printf(p, "%10u ", kstat_irqs(i)); | 52 | for_each_online_cpu(j) |
51 | seq_printf(p, " %14s", irq_desc[i].chip->typename); | 53 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); |
54 | seq_printf(p, " %14s", irq_desc[i].chip->name); | ||
55 | seq_printf(p, "-%s", handle_irq_name(irq_desc[i].handle_irq)); | ||
52 | seq_printf(p, " %s", action->name); | 56 | seq_printf(p, " %s", action->name); |
53 | 57 | ||
54 | for (action=action->next; action; action = action->next) | 58 | for (action=action->next; action; action = action->next) |
@@ -56,7 +60,9 @@ int show_interrupts(struct seq_file *p, void *v) | |||
56 | seq_putc(p, '\n'); | 60 | seq_putc(p, '\n'); |
57 | unlock: | 61 | unlock: |
58 | spin_unlock_irqrestore(&irq_desc[i].lock, flags); | 62 | spin_unlock_irqrestore(&irq_desc[i].lock, flags); |
59 | } | 63 | } else if (i == NR_IRQS) |
64 | seq_printf(p, "Err: %10u\n", atomic_read(&irq_err_count)); | ||
65 | |||
60 | return 0; | 66 | return 0; |
61 | } | 67 | } |
62 | #endif | 68 | #endif |
@@ -78,6 +84,7 @@ asmlinkage int do_IRQ(unsigned long r4, unsigned long r5, | |||
78 | unsigned long r6, unsigned long r7, | 84 | unsigned long r6, unsigned long r7, |
79 | struct pt_regs regs) | 85 | struct pt_regs regs) |
80 | { | 86 | { |
87 | struct pt_regs *old_regs = set_irq_regs(®s); | ||
81 | int irq = r4; | 88 | int irq = r4; |
82 | #ifdef CONFIG_4KSTACKS | 89 | #ifdef CONFIG_4KSTACKS |
83 | union irq_ctx *curctx, *irqctx; | 90 | union irq_ctx *curctx, *irqctx; |
@@ -139,7 +146,6 @@ asmlinkage int do_IRQ(unsigned long r4, unsigned long r5, | |||
139 | 146 | ||
140 | __asm__ __volatile__ ( | 147 | __asm__ __volatile__ ( |
141 | "mov %0, r4 \n" | 148 | "mov %0, r4 \n" |
142 | "mov %1, r5 \n" | ||
143 | "mov r15, r9 \n" | 149 | "mov r15, r9 \n" |
144 | "jsr @%2 \n" | 150 | "jsr @%2 \n" |
145 | /* swith to the irq stack */ | 151 | /* swith to the irq stack */ |
@@ -147,17 +153,18 @@ asmlinkage int do_IRQ(unsigned long r4, unsigned long r5, | |||
147 | /* restore the stack (ring zero) */ | 153 | /* restore the stack (ring zero) */ |
148 | "mov r9, r15 \n" | 154 | "mov r9, r15 \n" |
149 | : /* no outputs */ | 155 | : /* no outputs */ |
150 | : "r" (irq), "r" (®s), "r" (__do_IRQ), "r" (isp) | 156 | : "r" (irq), "r" (generic_handle_irq), "r" (isp) |
151 | /* XXX: A somewhat excessive clobber list? -PFM */ | 157 | /* XXX: A somewhat excessive clobber list? -PFM */ |
152 | : "memory", "r0", "r1", "r2", "r3", "r4", | 158 | : "memory", "r0", "r1", "r2", "r3", "r4", |
153 | "r5", "r6", "r7", "r8", "t", "pr" | 159 | "r5", "r6", "r7", "r8", "t", "pr" |
154 | ); | 160 | ); |
155 | } else | 161 | } else |
156 | #endif | 162 | #endif |
157 | __do_IRQ(irq, ®s); | 163 | generic_handle_irq(irq); |
158 | 164 | ||
159 | irq_exit(); | 165 | irq_exit(); |
160 | 166 | ||
167 | set_irq_regs(old_regs); | ||
161 | return 1; | 168 | return 1; |
162 | } | 169 | } |
163 | 170 | ||