aboutsummaryrefslogtreecommitdiffstats
path: root/arch/alpha/kernel/irq_alpha.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/alpha/kernel/irq_alpha.c')
-rw-r--r--arch/alpha/kernel/irq_alpha.c22
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
39do_entInt(unsigned long type, unsigned long vector, 39do_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
121void 128void
122process_mcheck_info(unsigned long vector, unsigned long la_ptr, 129process_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) {