diff options
Diffstat (limited to 'arch/alpha/kernel')
-rw-r--r-- | arch/alpha/kernel/irq_alpha.c | 5 | ||||
-rw-r--r-- | arch/alpha/kernel/irq_i8259.c | 4 | ||||
-rw-r--r-- | arch/alpha/kernel/irq_impl.h | 6 | ||||
-rw-r--r-- | arch/alpha/kernel/irq_pyxis.c | 6 | ||||
-rw-r--r-- | arch/alpha/kernel/irq_srm.c | 4 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_alcor.c | 6 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_cabriolet.c | 16 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_dp264.c | 14 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_eb64p.c | 6 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_eiger.c | 16 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_jensen.c | 6 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_marvel.c | 4 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_miata.c | 4 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_mikasa.c | 6 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_noritake.c | 10 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_rawhide.c | 4 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_rx164.c | 6 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_sable.c | 4 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_takara.c | 16 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_titan.c | 11 | ||||
-rw-r--r-- | arch/alpha/kernel/sys_wildfire.c | 4 |
21 files changed, 82 insertions, 76 deletions
diff --git a/arch/alpha/kernel/irq_alpha.c b/arch/alpha/kernel/irq_alpha.c index ddf5cf8dcb0b..d14cc423aa48 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 |
@@ -72,7 +73,9 @@ do_entInt(unsigned long type, unsigned long vector, | |||
72 | alpha_mv.machine_check(vector, la_ptr, regs); | 73 | alpha_mv.machine_check(vector, la_ptr, regs); |
73 | return; | 74 | return; |
74 | case 3: | 75 | case 3: |
75 | alpha_mv.device_interrupt(vector, regs); | 76 | old_regs = set_irq_regs(regs); |
77 | alpha_mv.device_interrupt(vector); | ||
78 | set_irq_regs(old_regs); | ||
76 | return; | 79 | return; |
77 | case 4: | 80 | case 4: |
78 | perf_irq(la_ptr, regs); | 81 | perf_irq(la_ptr, regs); |
diff --git a/arch/alpha/kernel/irq_i8259.c b/arch/alpha/kernel/irq_i8259.c index ebbadbc0c36a..6c70f8b97b72 100644 --- a/arch/alpha/kernel/irq_i8259.c +++ b/arch/alpha/kernel/irq_i8259.c | |||
@@ -137,7 +137,7 @@ init_i8259a_irqs(void) | |||
137 | 137 | ||
138 | #if defined(IACK_SC) | 138 | #if defined(IACK_SC) |
139 | void | 139 | void |
140 | isa_device_interrupt(unsigned long vector, struct pt_regs *regs) | 140 | isa_device_interrupt(unsigned long vector) |
141 | { | 141 | { |
142 | /* | 142 | /* |
143 | * Generate a PCI interrupt acknowledge cycle. The PIC will | 143 | * Generate a PCI interrupt acknowledge cycle. The PIC will |
@@ -147,7 +147,7 @@ isa_device_interrupt(unsigned long vector, struct pt_regs *regs) | |||
147 | */ | 147 | */ |
148 | int j = *(vuip) IACK_SC; | 148 | int j = *(vuip) IACK_SC; |
149 | j &= 0xff; | 149 | j &= 0xff; |
150 | handle_irq(j, regs); | 150 | handle_irq(j, get_irq_regs()); |
151 | } | 151 | } |
152 | #endif | 152 | #endif |
153 | 153 | ||
diff --git a/arch/alpha/kernel/irq_impl.h b/arch/alpha/kernel/irq_impl.h index f201d8ffc0d9..5d84dbdcdb89 100644 --- a/arch/alpha/kernel/irq_impl.h +++ b/arch/alpha/kernel/irq_impl.h | |||
@@ -15,10 +15,10 @@ | |||
15 | 15 | ||
16 | #define RTC_IRQ 8 | 16 | #define RTC_IRQ 8 |
17 | 17 | ||
18 | extern void isa_device_interrupt(unsigned long, struct pt_regs *); | 18 | extern void isa_device_interrupt(unsigned long); |
19 | extern void isa_no_iack_sc_device_interrupt(unsigned long, struct pt_regs *); | 19 | extern void isa_no_iack_sc_device_interrupt(unsigned long, struct pt_regs *); |
20 | extern void srm_device_interrupt(unsigned long, struct pt_regs *); | 20 | extern void srm_device_interrupt(unsigned long); |
21 | extern void pyxis_device_interrupt(unsigned long, struct pt_regs *); | 21 | extern void pyxis_device_interrupt(unsigned long); |
22 | 22 | ||
23 | extern struct irqaction timer_irqaction; | 23 | extern struct irqaction timer_irqaction; |
24 | extern struct irqaction isa_cascade_irqaction; | 24 | extern struct irqaction isa_cascade_irqaction; |
diff --git a/arch/alpha/kernel/irq_pyxis.c b/arch/alpha/kernel/irq_pyxis.c index 3b581415bab0..686dc22111b2 100644 --- a/arch/alpha/kernel/irq_pyxis.c +++ b/arch/alpha/kernel/irq_pyxis.c | |||
@@ -81,7 +81,7 @@ static struct hw_interrupt_type pyxis_irq_type = { | |||
81 | }; | 81 | }; |
82 | 82 | ||
83 | void | 83 | void |
84 | pyxis_device_interrupt(unsigned long vector, struct pt_regs *regs) | 84 | pyxis_device_interrupt(unsigned long vector) |
85 | { | 85 | { |
86 | unsigned long pld; | 86 | unsigned long pld; |
87 | unsigned int i; | 87 | unsigned int i; |
@@ -98,9 +98,9 @@ pyxis_device_interrupt(unsigned long vector, struct pt_regs *regs) | |||
98 | i = ffz(~pld); | 98 | i = ffz(~pld); |
99 | pld &= pld - 1; /* clear least bit set */ | 99 | pld &= pld - 1; /* clear least bit set */ |
100 | if (i == 7) | 100 | if (i == 7) |
101 | isa_device_interrupt(vector, regs); | 101 | isa_device_interrupt(vector); |
102 | else | 102 | else |
103 | handle_irq(16+i, regs); | 103 | handle_irq(16+i, get_irq_regs()); |
104 | } | 104 | } |
105 | } | 105 | } |
106 | 106 | ||
diff --git a/arch/alpha/kernel/irq_srm.c b/arch/alpha/kernel/irq_srm.c index 8e4d121f84cc..2e9f6d421a8e 100644 --- a/arch/alpha/kernel/irq_srm.c +++ b/arch/alpha/kernel/irq_srm.c | |||
@@ -72,8 +72,8 @@ init_srm_irqs(long max, unsigned long ignore_mask) | |||
72 | } | 72 | } |
73 | 73 | ||
74 | void | 74 | void |
75 | srm_device_interrupt(unsigned long vector, struct pt_regs * regs) | 75 | srm_device_interrupt(unsigned long vector) |
76 | { | 76 | { |
77 | int irq = (vector - 0x800) >> 4; | 77 | int irq = (vector - 0x800) >> 4; |
78 | handle_irq(irq, regs); | 78 | handle_irq(irq, get_irq_regs()); |
79 | } | 79 | } |
diff --git a/arch/alpha/kernel/sys_alcor.c b/arch/alpha/kernel/sys_alcor.c index d6926b7b1e99..2d412c876549 100644 --- a/arch/alpha/kernel/sys_alcor.c +++ b/arch/alpha/kernel/sys_alcor.c | |||
@@ -100,7 +100,7 @@ static struct hw_interrupt_type alcor_irq_type = { | |||
100 | }; | 100 | }; |
101 | 101 | ||
102 | static void | 102 | static void |
103 | alcor_device_interrupt(unsigned long vector, struct pt_regs *regs) | 103 | alcor_device_interrupt(unsigned long vector) |
104 | { | 104 | { |
105 | unsigned long pld; | 105 | unsigned long pld; |
106 | unsigned int i; | 106 | unsigned int i; |
@@ -116,9 +116,9 @@ alcor_device_interrupt(unsigned long vector, struct pt_regs *regs) | |||
116 | i = ffz(~pld); | 116 | i = ffz(~pld); |
117 | pld &= pld - 1; /* clear least bit set */ | 117 | pld &= pld - 1; /* clear least bit set */ |
118 | if (i == 31) { | 118 | if (i == 31) { |
119 | isa_device_interrupt(vector, regs); | 119 | isa_device_interrupt(vector); |
120 | } else { | 120 | } else { |
121 | handle_irq(16 + i, regs); | 121 | handle_irq(16 + i, get_irq_regs()); |
122 | } | 122 | } |
123 | } | 123 | } |
124 | } | 124 | } |
diff --git a/arch/alpha/kernel/sys_cabriolet.c b/arch/alpha/kernel/sys_cabriolet.c index 25a215067da8..e75f0cea6fcc 100644 --- a/arch/alpha/kernel/sys_cabriolet.c +++ b/arch/alpha/kernel/sys_cabriolet.c | |||
@@ -82,7 +82,7 @@ static struct hw_interrupt_type cabriolet_irq_type = { | |||
82 | }; | 82 | }; |
83 | 83 | ||
84 | static void | 84 | static void |
85 | cabriolet_device_interrupt(unsigned long v, struct pt_regs *r) | 85 | cabriolet_device_interrupt(unsigned long v) |
86 | { | 86 | { |
87 | unsigned long pld; | 87 | unsigned long pld; |
88 | unsigned int i; | 88 | unsigned int i; |
@@ -98,15 +98,15 @@ cabriolet_device_interrupt(unsigned long v, struct pt_regs *r) | |||
98 | i = ffz(~pld); | 98 | i = ffz(~pld); |
99 | pld &= pld - 1; /* clear least bit set */ | 99 | pld &= pld - 1; /* clear least bit set */ |
100 | if (i == 4) { | 100 | if (i == 4) { |
101 | isa_device_interrupt(v, r); | 101 | isa_device_interrupt(v); |
102 | } else { | 102 | } else { |
103 | handle_irq(16 + i, r); | 103 | handle_irq(16 + i, get_irq_regs()); |
104 | } | 104 | } |
105 | } | 105 | } |
106 | } | 106 | } |
107 | 107 | ||
108 | static void __init | 108 | static void __init |
109 | common_init_irq(void (*srm_dev_int)(unsigned long v, struct pt_regs *r)) | 109 | common_init_irq(void (*srm_dev_int)(unsigned long v)) |
110 | { | 110 | { |
111 | init_i8259a_irqs(); | 111 | init_i8259a_irqs(); |
112 | 112 | ||
@@ -154,18 +154,18 @@ cabriolet_init_irq(void) | |||
154 | too invasive though. */ | 154 | too invasive though. */ |
155 | 155 | ||
156 | static void | 156 | static void |
157 | pc164_srm_device_interrupt(unsigned long v, struct pt_regs *r) | 157 | pc164_srm_device_interrupt(unsigned long v) |
158 | { | 158 | { |
159 | __min_ipl = getipl(); | 159 | __min_ipl = getipl(); |
160 | srm_device_interrupt(v, r); | 160 | srm_device_interrupt(v); |
161 | __min_ipl = 0; | 161 | __min_ipl = 0; |
162 | } | 162 | } |
163 | 163 | ||
164 | static void | 164 | static void |
165 | pc164_device_interrupt(unsigned long v, struct pt_regs *r) | 165 | pc164_device_interrupt(unsigned long v) |
166 | { | 166 | { |
167 | __min_ipl = getipl(); | 167 | __min_ipl = getipl(); |
168 | cabriolet_device_interrupt(v, r); | 168 | cabriolet_device_interrupt(v); |
169 | __min_ipl = 0; | 169 | __min_ipl = 0; |
170 | } | 170 | } |
171 | 171 | ||
diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c index dd6103b867e7..57dce0098a1b 100644 --- a/arch/alpha/kernel/sys_dp264.c +++ b/arch/alpha/kernel/sys_dp264.c | |||
@@ -217,7 +217,7 @@ static struct hw_interrupt_type clipper_irq_type = { | |||
217 | }; | 217 | }; |
218 | 218 | ||
219 | static void | 219 | static void |
220 | dp264_device_interrupt(unsigned long vector, struct pt_regs * regs) | 220 | dp264_device_interrupt(unsigned long vector) |
221 | { | 221 | { |
222 | #if 1 | 222 | #if 1 |
223 | printk("dp264_device_interrupt: NOT IMPLEMENTED YET!! \n"); | 223 | printk("dp264_device_interrupt: NOT IMPLEMENTED YET!! \n"); |
@@ -236,9 +236,9 @@ dp264_device_interrupt(unsigned long vector, struct pt_regs * regs) | |||
236 | i = ffz(~pld); | 236 | i = ffz(~pld); |
237 | pld &= pld - 1; /* clear least bit set */ | 237 | pld &= pld - 1; /* clear least bit set */ |
238 | if (i == 55) | 238 | if (i == 55) |
239 | isa_device_interrupt(vector, regs); | 239 | isa_device_interrupt(vector); |
240 | else | 240 | else |
241 | handle_irq(16 + i, 16 + i, regs); | 241 | handle_irq(16 + i, get_irq_regs()); |
242 | #if 0 | 242 | #if 0 |
243 | TSUNAMI_cchip->dir0.csr = 1UL << i; mb(); | 243 | TSUNAMI_cchip->dir0.csr = 1UL << i; mb(); |
244 | tmp = TSUNAMI_cchip->dir0.csr; | 244 | tmp = TSUNAMI_cchip->dir0.csr; |
@@ -248,7 +248,7 @@ dp264_device_interrupt(unsigned long vector, struct pt_regs * regs) | |||
248 | } | 248 | } |
249 | 249 | ||
250 | static void | 250 | static void |
251 | dp264_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) | 251 | dp264_srm_device_interrupt(unsigned long vector) |
252 | { | 252 | { |
253 | int irq; | 253 | int irq; |
254 | 254 | ||
@@ -268,11 +268,11 @@ dp264_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) | |||
268 | if (irq >= 32) | 268 | if (irq >= 32) |
269 | irq -= 16; | 269 | irq -= 16; |
270 | 270 | ||
271 | handle_irq(irq, regs); | 271 | handle_irq(irq, get_irq_regs()); |
272 | } | 272 | } |
273 | 273 | ||
274 | static void | 274 | static void |
275 | clipper_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) | 275 | clipper_srm_device_interrupt(unsigned long vector) |
276 | { | 276 | { |
277 | int irq; | 277 | int irq; |
278 | 278 | ||
@@ -290,7 +290,7 @@ clipper_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) | |||
290 | * | 290 | * |
291 | * Eg IRQ 24 is DRIR bit 8, etc, etc | 291 | * Eg IRQ 24 is DRIR bit 8, etc, etc |
292 | */ | 292 | */ |
293 | handle_irq(irq, regs); | 293 | handle_irq(irq, get_irq_regs()); |
294 | } | 294 | } |
295 | 295 | ||
296 | static void __init | 296 | static void __init |
diff --git a/arch/alpha/kernel/sys_eb64p.c b/arch/alpha/kernel/sys_eb64p.c index ed108b66ec09..90d27256d7d6 100644 --- a/arch/alpha/kernel/sys_eb64p.c +++ b/arch/alpha/kernel/sys_eb64p.c | |||
@@ -80,7 +80,7 @@ static struct hw_interrupt_type eb64p_irq_type = { | |||
80 | }; | 80 | }; |
81 | 81 | ||
82 | static void | 82 | static void |
83 | eb64p_device_interrupt(unsigned long vector, struct pt_regs *regs) | 83 | eb64p_device_interrupt(unsigned long vector) |
84 | { | 84 | { |
85 | unsigned long pld; | 85 | unsigned long pld; |
86 | unsigned int i; | 86 | unsigned int i; |
@@ -97,9 +97,9 @@ eb64p_device_interrupt(unsigned long vector, struct pt_regs *regs) | |||
97 | pld &= pld - 1; /* clear least bit set */ | 97 | pld &= pld - 1; /* clear least bit set */ |
98 | 98 | ||
99 | if (i == 5) { | 99 | if (i == 5) { |
100 | isa_device_interrupt(vector, regs); | 100 | isa_device_interrupt(vector); |
101 | } else { | 101 | } else { |
102 | handle_irq(16 + i, regs); | 102 | handle_irq(16 + i, get_irq_regs()); |
103 | } | 103 | } |
104 | } | 104 | } |
105 | } | 105 | } |
diff --git a/arch/alpha/kernel/sys_eiger.c b/arch/alpha/kernel/sys_eiger.c index 64a785baf53a..f38cded2df97 100644 --- a/arch/alpha/kernel/sys_eiger.c +++ b/arch/alpha/kernel/sys_eiger.c | |||
@@ -91,7 +91,7 @@ static struct hw_interrupt_type eiger_irq_type = { | |||
91 | }; | 91 | }; |
92 | 92 | ||
93 | static void | 93 | static void |
94 | eiger_device_interrupt(unsigned long vector, struct pt_regs * regs) | 94 | eiger_device_interrupt(unsigned long vector) |
95 | { | 95 | { |
96 | unsigned intstatus; | 96 | unsigned intstatus; |
97 | 97 | ||
@@ -118,20 +118,20 @@ eiger_device_interrupt(unsigned long vector, struct pt_regs * regs) | |||
118 | * despatch an interrupt if it's set. | 118 | * despatch an interrupt if it's set. |
119 | */ | 119 | */ |
120 | 120 | ||
121 | if (intstatus & 8) handle_irq(16+3, regs); | 121 | if (intstatus & 8) handle_irq(16+3, get_irq_regs()); |
122 | if (intstatus & 4) handle_irq(16+2, regs); | 122 | if (intstatus & 4) handle_irq(16+2, get_irq_regs()); |
123 | if (intstatus & 2) handle_irq(16+1, regs); | 123 | if (intstatus & 2) handle_irq(16+1, get_irq_regs()); |
124 | if (intstatus & 1) handle_irq(16+0, regs); | 124 | if (intstatus & 1) handle_irq(16+0, get_irq_regs()); |
125 | } else { | 125 | } else { |
126 | isa_device_interrupt(vector, regs); | 126 | isa_device_interrupt(vector); |
127 | } | 127 | } |
128 | } | 128 | } |
129 | 129 | ||
130 | static void | 130 | static void |
131 | eiger_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) | 131 | eiger_srm_device_interrupt(unsigned long vector) |
132 | { | 132 | { |
133 | int irq = (vector - 0x800) >> 4; | 133 | int irq = (vector - 0x800) >> 4; |
134 | handle_irq(irq, regs); | 134 | handle_irq(irq, get_irq_regs()); |
135 | } | 135 | } |
136 | 136 | ||
137 | static void __init | 137 | static void __init |
diff --git a/arch/alpha/kernel/sys_jensen.c b/arch/alpha/kernel/sys_jensen.c index 4ac2b328b8de..fc316369f4d4 100644 --- a/arch/alpha/kernel/sys_jensen.c +++ b/arch/alpha/kernel/sys_jensen.c | |||
@@ -129,7 +129,7 @@ static struct hw_interrupt_type jensen_local_irq_type = { | |||
129 | }; | 129 | }; |
130 | 130 | ||
131 | static void | 131 | static void |
132 | jensen_device_interrupt(unsigned long vector, struct pt_regs * regs) | 132 | jensen_device_interrupt(unsigned long vector) |
133 | { | 133 | { |
134 | int irq; | 134 | int irq; |
135 | 135 | ||
@@ -189,7 +189,7 @@ jensen_device_interrupt(unsigned long vector, struct pt_regs * regs) | |||
189 | if (cc - last_msg > ((JENSEN_CYCLES_PER_SEC) * 3) || | 189 | if (cc - last_msg > ((JENSEN_CYCLES_PER_SEC) * 3) || |
190 | irq != last_irq) { | 190 | irq != last_irq) { |
191 | printk(KERN_CRIT " irq %d count %d cc %u @ %lx\n", | 191 | printk(KERN_CRIT " irq %d count %d cc %u @ %lx\n", |
192 | irq, count, cc-last_cc, regs->pc); | 192 | irq, count, cc-last_cc, get_irq_regs()->pc); |
193 | count = 0; | 193 | count = 0; |
194 | last_msg = cc; | 194 | last_msg = cc; |
195 | last_irq = irq; | 195 | last_irq = irq; |
@@ -198,7 +198,7 @@ jensen_device_interrupt(unsigned long vector, struct pt_regs * regs) | |||
198 | } | 198 | } |
199 | #endif | 199 | #endif |
200 | 200 | ||
201 | handle_irq(irq, regs); | 201 | handle_irq(irq, get_irq_regs()); |
202 | } | 202 | } |
203 | 203 | ||
204 | static void __init | 204 | static void __init |
diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c index 36d215954376..4ea5615be43a 100644 --- a/arch/alpha/kernel/sys_marvel.c +++ b/arch/alpha/kernel/sys_marvel.c | |||
@@ -38,7 +38,7 @@ | |||
38 | * Interrupt handling. | 38 | * Interrupt handling. |
39 | */ | 39 | */ |
40 | static void | 40 | static void |
41 | io7_device_interrupt(unsigned long vector, struct pt_regs * regs) | 41 | io7_device_interrupt(unsigned long vector) |
42 | { | 42 | { |
43 | unsigned int pid; | 43 | unsigned int pid; |
44 | unsigned int irq; | 44 | unsigned int irq; |
@@ -64,7 +64,7 @@ io7_device_interrupt(unsigned long vector, struct pt_regs * regs) | |||
64 | irq &= MARVEL_IRQ_VEC_IRQ_MASK; /* not too many bits */ | 64 | irq &= MARVEL_IRQ_VEC_IRQ_MASK; /* not too many bits */ |
65 | irq |= pid << MARVEL_IRQ_VEC_PE_SHIFT; /* merge the pid */ | 65 | irq |= pid << MARVEL_IRQ_VEC_PE_SHIFT; /* merge the pid */ |
66 | 66 | ||
67 | handle_irq(irq, regs); | 67 | handle_irq(irq, get_irq_regs()); |
68 | } | 68 | } |
69 | 69 | ||
70 | static volatile unsigned long * | 70 | static volatile unsigned long * |
diff --git a/arch/alpha/kernel/sys_miata.c b/arch/alpha/kernel/sys_miata.c index 61ac56f8eeea..fbbd95212a96 100644 --- a/arch/alpha/kernel/sys_miata.c +++ b/arch/alpha/kernel/sys_miata.c | |||
@@ -33,7 +33,7 @@ | |||
33 | 33 | ||
34 | 34 | ||
35 | static void | 35 | static void |
36 | miata_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) | 36 | miata_srm_device_interrupt(unsigned long vector) |
37 | { | 37 | { |
38 | int irq; | 38 | int irq; |
39 | 39 | ||
@@ -56,7 +56,7 @@ miata_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) | |||
56 | if (irq >= 16) | 56 | if (irq >= 16) |
57 | irq = irq + 8; | 57 | irq = irq + 8; |
58 | 58 | ||
59 | handle_irq(irq, regs); | 59 | handle_irq(irq, get_irq_regs()); |
60 | } | 60 | } |
61 | 61 | ||
62 | static void __init | 62 | static void __init |
diff --git a/arch/alpha/kernel/sys_mikasa.c b/arch/alpha/kernel/sys_mikasa.c index cc4c58111366..5429ba0e08f1 100644 --- a/arch/alpha/kernel/sys_mikasa.c +++ b/arch/alpha/kernel/sys_mikasa.c | |||
@@ -79,7 +79,7 @@ static struct hw_interrupt_type mikasa_irq_type = { | |||
79 | }; | 79 | }; |
80 | 80 | ||
81 | static void | 81 | static void |
82 | mikasa_device_interrupt(unsigned long vector, struct pt_regs *regs) | 82 | mikasa_device_interrupt(unsigned long vector) |
83 | { | 83 | { |
84 | unsigned long pld; | 84 | unsigned long pld; |
85 | unsigned int i; | 85 | unsigned int i; |
@@ -97,9 +97,9 @@ mikasa_device_interrupt(unsigned long vector, struct pt_regs *regs) | |||
97 | i = ffz(~pld); | 97 | i = ffz(~pld); |
98 | pld &= pld - 1; /* clear least bit set */ | 98 | pld &= pld - 1; /* clear least bit set */ |
99 | if (i < 16) { | 99 | if (i < 16) { |
100 | isa_device_interrupt(vector, regs); | 100 | isa_device_interrupt(vector); |
101 | } else { | 101 | } else { |
102 | handle_irq(i, regs); | 102 | handle_irq(i, get_irq_regs()); |
103 | } | 103 | } |
104 | } | 104 | } |
105 | } | 105 | } |
diff --git a/arch/alpha/kernel/sys_noritake.c b/arch/alpha/kernel/sys_noritake.c index 2d3cff7e8c5f..b9a843447b89 100644 --- a/arch/alpha/kernel/sys_noritake.c +++ b/arch/alpha/kernel/sys_noritake.c | |||
@@ -77,7 +77,7 @@ static struct hw_interrupt_type noritake_irq_type = { | |||
77 | }; | 77 | }; |
78 | 78 | ||
79 | static void | 79 | static void |
80 | noritake_device_interrupt(unsigned long vector, struct pt_regs *regs) | 80 | noritake_device_interrupt(unsigned long vector) |
81 | { | 81 | { |
82 | unsigned long pld; | 82 | unsigned long pld; |
83 | unsigned int i; | 83 | unsigned int i; |
@@ -96,15 +96,15 @@ noritake_device_interrupt(unsigned long vector, struct pt_regs *regs) | |||
96 | i = ffz(~pld); | 96 | i = ffz(~pld); |
97 | pld &= pld - 1; /* clear least bit set */ | 97 | pld &= pld - 1; /* clear least bit set */ |
98 | if (i < 16) { | 98 | if (i < 16) { |
99 | isa_device_interrupt(vector, regs); | 99 | isa_device_interrupt(vector); |
100 | } else { | 100 | } else { |
101 | handle_irq(i, regs); | 101 | handle_irq(i, get_irq_regs()); |
102 | } | 102 | } |
103 | } | 103 | } |
104 | } | 104 | } |
105 | 105 | ||
106 | static void | 106 | static void |
107 | noritake_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) | 107 | noritake_srm_device_interrupt(unsigned long vector) |
108 | { | 108 | { |
109 | int irq; | 109 | int irq; |
110 | 110 | ||
@@ -122,7 +122,7 @@ noritake_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) | |||
122 | if (irq >= 16) | 122 | if (irq >= 16) |
123 | irq = irq + 1; | 123 | irq = irq + 1; |
124 | 124 | ||
125 | handle_irq(irq, regs); | 125 | handle_irq(irq, get_irq_regs()); |
126 | } | 126 | } |
127 | 127 | ||
128 | static void __init | 128 | static void __init |
diff --git a/arch/alpha/kernel/sys_rawhide.c b/arch/alpha/kernel/sys_rawhide.c index 949607e3d6fb..bef65162bfab 100644 --- a/arch/alpha/kernel/sys_rawhide.c +++ b/arch/alpha/kernel/sys_rawhide.c | |||
@@ -134,7 +134,7 @@ static struct hw_interrupt_type rawhide_irq_type = { | |||
134 | }; | 134 | }; |
135 | 135 | ||
136 | static void | 136 | static void |
137 | rawhide_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) | 137 | rawhide_srm_device_interrupt(unsigned long vector) |
138 | { | 138 | { |
139 | int irq; | 139 | int irq; |
140 | 140 | ||
@@ -158,7 +158,7 @@ rawhide_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) | |||
158 | /* Adjust by which hose it is from. */ | 158 | /* Adjust by which hose it is from. */ |
159 | irq -= ((irq + 16) >> 2) & 0x38; | 159 | irq -= ((irq + 16) >> 2) & 0x38; |
160 | 160 | ||
161 | handle_irq(irq, regs); | 161 | handle_irq(irq, get_irq_regs()); |
162 | } | 162 | } |
163 | 163 | ||
164 | static void __init | 164 | static void __init |
diff --git a/arch/alpha/kernel/sys_rx164.c b/arch/alpha/kernel/sys_rx164.c index 6ae506052635..fa8eef8dd8c6 100644 --- a/arch/alpha/kernel/sys_rx164.c +++ b/arch/alpha/kernel/sys_rx164.c | |||
@@ -83,7 +83,7 @@ static struct hw_interrupt_type rx164_irq_type = { | |||
83 | }; | 83 | }; |
84 | 84 | ||
85 | static void | 85 | static void |
86 | rx164_device_interrupt(unsigned long vector, struct pt_regs *regs) | 86 | rx164_device_interrupt(unsigned long vector) |
87 | { | 87 | { |
88 | unsigned long pld; | 88 | unsigned long pld; |
89 | volatile unsigned int *dirr; | 89 | volatile unsigned int *dirr; |
@@ -102,9 +102,9 @@ rx164_device_interrupt(unsigned long vector, struct pt_regs *regs) | |||
102 | i = ffz(~pld); | 102 | i = ffz(~pld); |
103 | pld &= pld - 1; /* clear least bit set */ | 103 | pld &= pld - 1; /* clear least bit set */ |
104 | if (i == 20) { | 104 | if (i == 20) { |
105 | isa_no_iack_sc_device_interrupt(vector, regs); | 105 | isa_no_iack_sc_device_interrupt(vector, get_irq_regs()); |
106 | } else { | 106 | } else { |
107 | handle_irq(16+i, regs); | 107 | handle_irq(16+i, get_irq_regs()); |
108 | } | 108 | } |
109 | } | 109 | } |
110 | } | 110 | } |
diff --git a/arch/alpha/kernel/sys_sable.c b/arch/alpha/kernel/sys_sable.c index a7a14647b50e..791379101e7c 100644 --- a/arch/alpha/kernel/sys_sable.c +++ b/arch/alpha/kernel/sys_sable.c | |||
@@ -512,7 +512,7 @@ static struct hw_interrupt_type sable_lynx_irq_type = { | |||
512 | }; | 512 | }; |
513 | 513 | ||
514 | static void | 514 | static void |
515 | sable_lynx_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) | 515 | sable_lynx_srm_device_interrupt(unsigned long vector) |
516 | { | 516 | { |
517 | /* Note that the vector reported by the SRM PALcode corresponds | 517 | /* Note that the vector reported by the SRM PALcode corresponds |
518 | to the interrupt mask bits, but we have to manage via the | 518 | to the interrupt mask bits, but we have to manage via the |
@@ -526,7 +526,7 @@ sable_lynx_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) | |||
526 | printk("%s: vector 0x%lx bit 0x%x irq 0x%x\n", | 526 | printk("%s: vector 0x%lx bit 0x%x irq 0x%x\n", |
527 | __FUNCTION__, vector, bit, irq); | 527 | __FUNCTION__, vector, bit, irq); |
528 | #endif | 528 | #endif |
529 | handle_irq(irq, regs); | 529 | handle_irq(irq, get_irq_regs()); |
530 | } | 530 | } |
531 | 531 | ||
532 | static void __init | 532 | static void __init |
diff --git a/arch/alpha/kernel/sys_takara.c b/arch/alpha/kernel/sys_takara.c index 2c75cd1fd81a..ce2d3b081dc8 100644 --- a/arch/alpha/kernel/sys_takara.c +++ b/arch/alpha/kernel/sys_takara.c | |||
@@ -85,7 +85,7 @@ static struct hw_interrupt_type takara_irq_type = { | |||
85 | }; | 85 | }; |
86 | 86 | ||
87 | static void | 87 | static void |
88 | takara_device_interrupt(unsigned long vector, struct pt_regs *regs) | 88 | takara_device_interrupt(unsigned long vector) |
89 | { | 89 | { |
90 | unsigned intstatus; | 90 | unsigned intstatus; |
91 | 91 | ||
@@ -112,20 +112,20 @@ takara_device_interrupt(unsigned long vector, struct pt_regs *regs) | |||
112 | * despatch an interrupt if it's set. | 112 | * despatch an interrupt if it's set. |
113 | */ | 113 | */ |
114 | 114 | ||
115 | if (intstatus & 8) handle_irq(16+3, regs); | 115 | if (intstatus & 8) handle_irq(16+3, get_irq_regs()); |
116 | if (intstatus & 4) handle_irq(16+2, regs); | 116 | if (intstatus & 4) handle_irq(16+2, get_irq_regs()); |
117 | if (intstatus & 2) handle_irq(16+1, regs); | 117 | if (intstatus & 2) handle_irq(16+1, get_irq_regs()); |
118 | if (intstatus & 1) handle_irq(16+0, regs); | 118 | if (intstatus & 1) handle_irq(16+0, get_irq_regs()); |
119 | } else { | 119 | } else { |
120 | isa_device_interrupt (vector, regs); | 120 | isa_device_interrupt (vector); |
121 | } | 121 | } |
122 | } | 122 | } |
123 | 123 | ||
124 | static void | 124 | static void |
125 | takara_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) | 125 | takara_srm_device_interrupt(unsigned long vector) |
126 | { | 126 | { |
127 | int irq = (vector - 0x800) >> 4; | 127 | int irq = (vector - 0x800) >> 4; |
128 | handle_irq(irq, regs); | 128 | handle_irq(irq, get_irq_regs()); |
129 | } | 129 | } |
130 | 130 | ||
131 | static void __init | 131 | static void __init |
diff --git a/arch/alpha/kernel/sys_titan.c b/arch/alpha/kernel/sys_titan.c index 302aab38d95f..1473aa0e6982 100644 --- a/arch/alpha/kernel/sys_titan.c +++ b/arch/alpha/kernel/sys_titan.c | |||
@@ -167,18 +167,18 @@ titan_set_irq_affinity(unsigned int irq, cpumask_t affinity) | |||
167 | } | 167 | } |
168 | 168 | ||
169 | static void | 169 | static void |
170 | titan_device_interrupt(unsigned long vector, struct pt_regs * regs) | 170 | titan_device_interrupt(unsigned long vector) |
171 | { | 171 | { |
172 | printk("titan_device_interrupt: NOT IMPLEMENTED YET!! \n"); | 172 | printk("titan_device_interrupt: NOT IMPLEMENTED YET!! \n"); |
173 | } | 173 | } |
174 | 174 | ||
175 | static void | 175 | static void |
176 | titan_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) | 176 | titan_srm_device_interrupt(unsigned long vector) |
177 | { | 177 | { |
178 | int irq; | 178 | int irq; |
179 | 179 | ||
180 | irq = (vector - 0x800) >> 4; | 180 | irq = (vector - 0x800) >> 4; |
181 | handle_irq(irq, regs); | 181 | handle_irq(irq, get_irq_regs()); |
182 | } | 182 | } |
183 | 183 | ||
184 | 184 | ||
@@ -245,6 +245,7 @@ titan_legacy_init_irq(void) | |||
245 | void | 245 | void |
246 | titan_dispatch_irqs(u64 mask, struct pt_regs *regs) | 246 | titan_dispatch_irqs(u64 mask, struct pt_regs *regs) |
247 | { | 247 | { |
248 | struct pt_regs *old_regs; | ||
248 | unsigned long vector; | 249 | unsigned long vector; |
249 | 250 | ||
250 | /* | 251 | /* |
@@ -252,6 +253,7 @@ titan_dispatch_irqs(u64 mask, struct pt_regs *regs) | |||
252 | */ | 253 | */ |
253 | mask &= titan_cpu_irq_affinity[smp_processor_id()]; | 254 | mask &= titan_cpu_irq_affinity[smp_processor_id()]; |
254 | 255 | ||
256 | old_regs = set_irq_regs(regs); | ||
255 | /* | 257 | /* |
256 | * Dispatch all requested interrupts | 258 | * Dispatch all requested interrupts |
257 | */ | 259 | */ |
@@ -263,8 +265,9 @@ titan_dispatch_irqs(u64 mask, struct pt_regs *regs) | |||
263 | vector = 0x900 + (vector << 4); /* convert to SRM vector */ | 265 | vector = 0x900 + (vector << 4); /* convert to SRM vector */ |
264 | 266 | ||
265 | /* dispatch it */ | 267 | /* dispatch it */ |
266 | alpha_mv.device_interrupt(vector, regs); | 268 | alpha_mv.device_interrupt(vector); |
267 | } | 269 | } |
270 | set_irq_regs(old_regs); | ||
268 | } | 271 | } |
269 | 272 | ||
270 | 273 | ||
diff --git a/arch/alpha/kernel/sys_wildfire.c b/arch/alpha/kernel/sys_wildfire.c index 22c5798fe083..ddf5edd0cecd 100644 --- a/arch/alpha/kernel/sys_wildfire.c +++ b/arch/alpha/kernel/sys_wildfire.c | |||
@@ -234,7 +234,7 @@ wildfire_init_irq(void) | |||
234 | } | 234 | } |
235 | 235 | ||
236 | static void | 236 | static void |
237 | wildfire_device_interrupt(unsigned long vector, struct pt_regs * regs) | 237 | wildfire_device_interrupt(unsigned long vector) |
238 | { | 238 | { |
239 | int irq; | 239 | int irq; |
240 | 240 | ||
@@ -246,7 +246,7 @@ wildfire_device_interrupt(unsigned long vector, struct pt_regs * regs) | |||
246 | * bits 5-0: irq in PCA | 246 | * bits 5-0: irq in PCA |
247 | */ | 247 | */ |
248 | 248 | ||
249 | handle_irq(irq, regs); | 249 | handle_irq(irq, get_irq_regs()); |
250 | return; | 250 | return; |
251 | } | 251 | } |
252 | 252 | ||