diff options
Diffstat (limited to 'arch/alpha/kernel/irq_alpha.c')
-rw-r--r-- | arch/alpha/kernel/irq_alpha.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/arch/alpha/kernel/irq_alpha.c b/arch/alpha/kernel/irq_alpha.c index ddf5cf8dcb0b..6dd126b8be85 100644 --- a/arch/alpha/kernel/irq_alpha.c +++ b/arch/alpha/kernel/irq_alpha.c | |||
@@ -39,6 +39,7 @@ asmlinkage void | |||
39 | do_entInt(unsigned long type, unsigned long vector, | 39 | do_entInt(unsigned long type, unsigned long vector, |
40 | unsigned long la_ptr, struct pt_regs *regs) | 40 | unsigned long la_ptr, struct pt_regs *regs) |
41 | { | 41 | { |
42 | struct pt_regs *old_regs; | ||
42 | switch (type) { | 43 | switch (type) { |
43 | case 0: | 44 | case 0: |
44 | #ifdef CONFIG_SMP | 45 | #ifdef CONFIG_SMP |
@@ -51,6 +52,7 @@ do_entInt(unsigned long type, unsigned long vector, | |||
51 | #endif | 52 | #endif |
52 | break; | 53 | break; |
53 | case 1: | 54 | case 1: |
55 | old_regs = set_irq_regs(regs); | ||
54 | #ifdef CONFIG_SMP | 56 | #ifdef CONFIG_SMP |
55 | { | 57 | { |
56 | long cpu; | 58 | long cpu; |
@@ -61,18 +63,23 @@ do_entInt(unsigned long type, unsigned long vector, | |||
61 | if (cpu != boot_cpuid) { | 63 | if (cpu != boot_cpuid) { |
62 | kstat_cpu(cpu).irqs[RTC_IRQ]++; | 64 | kstat_cpu(cpu).irqs[RTC_IRQ]++; |
63 | } else { | 65 | } else { |
64 | handle_irq(RTC_IRQ, regs); | 66 | handle_irq(RTC_IRQ); |
65 | } | 67 | } |
66 | } | 68 | } |
67 | #else | 69 | #else |
68 | handle_irq(RTC_IRQ, regs); | 70 | handle_irq(RTC_IRQ); |
69 | #endif | 71 | #endif |
72 | set_irq_regs(old_regs); | ||
70 | return; | 73 | return; |
71 | case 2: | 74 | case 2: |
72 | alpha_mv.machine_check(vector, la_ptr, regs); | 75 | old_regs = set_irq_regs(regs); |
76 | alpha_mv.machine_check(vector, la_ptr); | ||
77 | set_irq_regs(old_regs); | ||
73 | return; | 78 | return; |
74 | case 3: | 79 | case 3: |
75 | alpha_mv.device_interrupt(vector, regs); | 80 | old_regs = set_irq_regs(regs); |
81 | alpha_mv.device_interrupt(vector); | ||
82 | set_irq_regs(old_regs); | ||
76 | return; | 83 | return; |
77 | case 4: | 84 | case 4: |
78 | perf_irq(la_ptr, regs); | 85 | perf_irq(la_ptr, regs); |
@@ -120,8 +127,7 @@ struct mcheck_info __mcheck_info; | |||
120 | 127 | ||
121 | void | 128 | void |
122 | process_mcheck_info(unsigned long vector, unsigned long la_ptr, | 129 | process_mcheck_info(unsigned long vector, unsigned long la_ptr, |
123 | struct pt_regs *regs, const char *machine, | 130 | const char *machine, int expected) |
124 | int expected) | ||
125 | { | 131 | { |
126 | struct el_common *mchk_header; | 132 | struct el_common *mchk_header; |
127 | const char *reason; | 133 | const char *reason; |
@@ -148,7 +154,7 @@ process_mcheck_info(unsigned long vector, unsigned long la_ptr, | |||
148 | mchk_header = (struct el_common *)la_ptr; | 154 | mchk_header = (struct el_common *)la_ptr; |
149 | 155 | ||
150 | printk(KERN_CRIT "%s machine check: vector=0x%lx pc=0x%lx code=0x%x\n", | 156 | printk(KERN_CRIT "%s machine check: vector=0x%lx pc=0x%lx code=0x%x\n", |
151 | machine, vector, regs->pc, mchk_header->code); | 157 | machine, vector, get_irq_regs()->pc, mchk_header->code); |
152 | 158 | ||
153 | switch (mchk_header->code) { | 159 | switch (mchk_header->code) { |
154 | /* Machine check reasons. Defined according to PALcode sources. */ | 160 | /* Machine check reasons. Defined according to PALcode sources. */ |
@@ -189,7 +195,7 @@ process_mcheck_info(unsigned long vector, unsigned long la_ptr, | |||
189 | printk(KERN_CRIT "machine check type: %s%s\n", | 195 | printk(KERN_CRIT "machine check type: %s%s\n", |
190 | reason, mchk_header->retry ? " (retryable)" : ""); | 196 | reason, mchk_header->retry ? " (retryable)" : ""); |
191 | 197 | ||
192 | dik_show_regs(regs, NULL); | 198 | dik_show_regs(get_irq_regs(), NULL); |
193 | 199 | ||
194 | #ifdef CONFIG_VERBOSE_MCHECK | 200 | #ifdef CONFIG_VERBOSE_MCHECK |
195 | if (alpha_verbose_mcheck > 1) { | 201 | if (alpha_verbose_mcheck > 1) { |