diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-05 19:32:01 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-05 19:32:01 -0400 |
commit | 44aefd2706bb6f5b65ba2c38cd89e7609e2b43d3 (patch) | |
tree | 93824f573767da634fbc82c388b6d33cc454212b /arch/i386 | |
parent | c1a26e7d40fb814716950122353a1a556844286b (diff) | |
parent | 7d12e780e003f93433d49ce78cfedf4b4c52adc5 (diff) |
Merge git://git.infradead.org/~dhowells/irq-2.6
* git://git.infradead.org/~dhowells/irq-2.6:
IRQ: Maintain regs pointer globally rather than passing to IRQ handlers
IRQ: Typedef the IRQ handler function type
IRQ: Typedef the IRQ flow handler function type
Diffstat (limited to 'arch/i386')
-rw-r--r-- | arch/i386/kernel/apic.c | 18 | ||||
-rw-r--r-- | arch/i386/kernel/i8259.c | 4 | ||||
-rw-r--r-- | arch/i386/kernel/irq.c | 12 | ||||
-rw-r--r-- | arch/i386/kernel/smp.c | 6 | ||||
-rw-r--r-- | arch/i386/kernel/time.c | 6 | ||||
-rw-r--r-- | arch/i386/kernel/time_hpet.c | 4 | ||||
-rw-r--r-- | arch/i386/kernel/vm86.c | 2 | ||||
-rw-r--r-- | arch/i386/mach-visws/visws_apic.c | 4 | ||||
-rw-r--r-- | arch/i386/mach-voyager/voyager_basic.c | 2 | ||||
-rw-r--r-- | arch/i386/mach-voyager/voyager_smp.c | 28 |
10 files changed, 52 insertions, 34 deletions
diff --git a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c index 90faae5c5d30..7d500da0e63b 100644 --- a/arch/i386/kernel/apic.c +++ b/arch/i386/kernel/apic.c | |||
@@ -1193,11 +1193,11 @@ EXPORT_SYMBOL(switch_ipi_to_APIC_timer); | |||
1193 | * value into /proc/profile. | 1193 | * value into /proc/profile. |
1194 | */ | 1194 | */ |
1195 | 1195 | ||
1196 | inline void smp_local_timer_interrupt(struct pt_regs * regs) | 1196 | inline void smp_local_timer_interrupt(void) |
1197 | { | 1197 | { |
1198 | profile_tick(CPU_PROFILING, regs); | 1198 | profile_tick(CPU_PROFILING); |
1199 | #ifdef CONFIG_SMP | 1199 | #ifdef CONFIG_SMP |
1200 | update_process_times(user_mode_vm(regs)); | 1200 | update_process_times(user_mode_vm(irq_regs)); |
1201 | #endif | 1201 | #endif |
1202 | 1202 | ||
1203 | /* | 1203 | /* |
@@ -1223,6 +1223,7 @@ inline void smp_local_timer_interrupt(struct pt_regs * regs) | |||
1223 | 1223 | ||
1224 | fastcall void smp_apic_timer_interrupt(struct pt_regs *regs) | 1224 | fastcall void smp_apic_timer_interrupt(struct pt_regs *regs) |
1225 | { | 1225 | { |
1226 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
1226 | int cpu = smp_processor_id(); | 1227 | int cpu = smp_processor_id(); |
1227 | 1228 | ||
1228 | /* | 1229 | /* |
@@ -1241,12 +1242,13 @@ fastcall void smp_apic_timer_interrupt(struct pt_regs *regs) | |||
1241 | * interrupt lock, which is the WrongThing (tm) to do. | 1242 | * interrupt lock, which is the WrongThing (tm) to do. |
1242 | */ | 1243 | */ |
1243 | irq_enter(); | 1244 | irq_enter(); |
1244 | smp_local_timer_interrupt(regs); | 1245 | smp_local_timer_interrupt(); |
1245 | irq_exit(); | 1246 | irq_exit(); |
1247 | set_irq_regs(old_regs); | ||
1246 | } | 1248 | } |
1247 | 1249 | ||
1248 | #ifndef CONFIG_SMP | 1250 | #ifndef CONFIG_SMP |
1249 | static void up_apic_timer_interrupt_call(struct pt_regs *regs) | 1251 | static void up_apic_timer_interrupt_call(void) |
1250 | { | 1252 | { |
1251 | int cpu = smp_processor_id(); | 1253 | int cpu = smp_processor_id(); |
1252 | 1254 | ||
@@ -1255,11 +1257,11 @@ static void up_apic_timer_interrupt_call(struct pt_regs *regs) | |||
1255 | */ | 1257 | */ |
1256 | per_cpu(irq_stat, cpu).apic_timer_irqs++; | 1258 | per_cpu(irq_stat, cpu).apic_timer_irqs++; |
1257 | 1259 | ||
1258 | smp_local_timer_interrupt(regs); | 1260 | smp_local_timer_interrupt(); |
1259 | } | 1261 | } |
1260 | #endif | 1262 | #endif |
1261 | 1263 | ||
1262 | void smp_send_timer_broadcast_ipi(struct pt_regs *regs) | 1264 | void smp_send_timer_broadcast_ipi(void) |
1263 | { | 1265 | { |
1264 | cpumask_t mask; | 1266 | cpumask_t mask; |
1265 | 1267 | ||
@@ -1272,7 +1274,7 @@ void smp_send_timer_broadcast_ipi(struct pt_regs *regs) | |||
1272 | * We can directly call the apic timer interrupt handler | 1274 | * We can directly call the apic timer interrupt handler |
1273 | * in UP case. Minus all irq related functions | 1275 | * in UP case. Minus all irq related functions |
1274 | */ | 1276 | */ |
1275 | up_apic_timer_interrupt_call(regs); | 1277 | up_apic_timer_interrupt_call(); |
1276 | #endif | 1278 | #endif |
1277 | } | 1279 | } |
1278 | } | 1280 | } |
diff --git a/arch/i386/kernel/i8259.c b/arch/i386/kernel/i8259.c index d07ed31f11e3..d53eafb6daa7 100644 --- a/arch/i386/kernel/i8259.c +++ b/arch/i386/kernel/i8259.c | |||
@@ -335,13 +335,13 @@ void init_8259A(int auto_eoi) | |||
335 | */ | 335 | */ |
336 | 336 | ||
337 | 337 | ||
338 | static irqreturn_t math_error_irq(int cpl, void *dev_id, struct pt_regs *regs) | 338 | static irqreturn_t math_error_irq(int cpl, void *dev_id) |
339 | { | 339 | { |
340 | extern void math_error(void __user *); | 340 | extern void math_error(void __user *); |
341 | outb(0,0xF0); | 341 | outb(0,0xF0); |
342 | if (ignore_fpu_irq || !boot_cpu_data.hard_math) | 342 | if (ignore_fpu_irq || !boot_cpu_data.hard_math) |
343 | return IRQ_NONE; | 343 | return IRQ_NONE; |
344 | math_error((void __user *)regs->eip); | 344 | math_error((void __user *)get_irq_regs()->eip); |
345 | return IRQ_HANDLED; | 345 | return IRQ_HANDLED; |
346 | } | 346 | } |
347 | 347 | ||
diff --git a/arch/i386/kernel/irq.c b/arch/i386/kernel/irq.c index 3dd2e180151b..8cfc7dbec7b9 100644 --- a/arch/i386/kernel/irq.c +++ b/arch/i386/kernel/irq.c | |||
@@ -53,6 +53,7 @@ static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly; | |||
53 | */ | 53 | */ |
54 | fastcall unsigned int do_IRQ(struct pt_regs *regs) | 54 | fastcall unsigned int do_IRQ(struct pt_regs *regs) |
55 | { | 55 | { |
56 | struct pt_regs *old_regs; | ||
56 | /* high bit used in ret_from_ code */ | 57 | /* high bit used in ret_from_ code */ |
57 | int irq = ~regs->orig_eax; | 58 | int irq = ~regs->orig_eax; |
58 | struct irq_desc *desc = irq_desc + irq; | 59 | struct irq_desc *desc = irq_desc + irq; |
@@ -67,6 +68,7 @@ fastcall unsigned int do_IRQ(struct pt_regs *regs) | |||
67 | BUG(); | 68 | BUG(); |
68 | } | 69 | } |
69 | 70 | ||
71 | old_regs = set_irq_regs(regs); | ||
70 | irq_enter(); | 72 | irq_enter(); |
71 | #ifdef CONFIG_DEBUG_STACKOVERFLOW | 73 | #ifdef CONFIG_DEBUG_STACKOVERFLOW |
72 | /* Debugging check for stack overflow: is there less than 1KB free? */ | 74 | /* Debugging check for stack overflow: is there less than 1KB free? */ |
@@ -95,7 +97,7 @@ fastcall unsigned int do_IRQ(struct pt_regs *regs) | |||
95 | * current stack (which is the irq stack already after all) | 97 | * current stack (which is the irq stack already after all) |
96 | */ | 98 | */ |
97 | if (curctx != irqctx) { | 99 | if (curctx != irqctx) { |
98 | int arg1, arg2, arg3, ebx; | 100 | int arg1, arg2, ebx; |
99 | 101 | ||
100 | /* build the stack frame on the IRQ stack */ | 102 | /* build the stack frame on the IRQ stack */ |
101 | isp = (u32*) ((char*)irqctx + sizeof(*irqctx)); | 103 | isp = (u32*) ((char*)irqctx + sizeof(*irqctx)); |
@@ -114,17 +116,17 @@ fastcall unsigned int do_IRQ(struct pt_regs *regs) | |||
114 | " xchgl %%ebx,%%esp \n" | 116 | " xchgl %%ebx,%%esp \n" |
115 | " call *%%edi \n" | 117 | " call *%%edi \n" |
116 | " movl %%ebx,%%esp \n" | 118 | " movl %%ebx,%%esp \n" |
117 | : "=a" (arg1), "=d" (arg2), "=c" (arg3), "=b" (ebx) | 119 | : "=a" (arg1), "=d" (arg2), "=b" (ebx) |
118 | : "0" (irq), "1" (desc), "2" (regs), "3" (isp), | 120 | : "0" (irq), "1" (desc), "2" (isp), |
119 | "D" (desc->handle_irq) | 121 | "D" (desc->handle_irq) |
120 | : "memory", "cc" | 122 | : "memory", "cc" |
121 | ); | 123 | ); |
122 | } else | 124 | } else |
123 | #endif | 125 | #endif |
124 | desc->handle_irq(irq, desc, regs); | 126 | desc->handle_irq(irq, desc); |
125 | 127 | ||
126 | irq_exit(); | 128 | irq_exit(); |
127 | 129 | set_irq_regs(old_regs); | |
128 | return 1; | 130 | return 1; |
129 | } | 131 | } |
130 | 132 | ||
diff --git a/arch/i386/kernel/smp.c b/arch/i386/kernel/smp.c index 1b080ab8a49f..31e5c6573aae 100644 --- a/arch/i386/kernel/smp.c +++ b/arch/i386/kernel/smp.c | |||
@@ -321,6 +321,7 @@ static inline void leave_mm (unsigned long cpu) | |||
321 | 321 | ||
322 | fastcall void smp_invalidate_interrupt(struct pt_regs *regs) | 322 | fastcall void smp_invalidate_interrupt(struct pt_regs *regs) |
323 | { | 323 | { |
324 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
324 | unsigned long cpu; | 325 | unsigned long cpu; |
325 | 326 | ||
326 | cpu = get_cpu(); | 327 | cpu = get_cpu(); |
@@ -351,6 +352,7 @@ fastcall void smp_invalidate_interrupt(struct pt_regs *regs) | |||
351 | smp_mb__after_clear_bit(); | 352 | smp_mb__after_clear_bit(); |
352 | out: | 353 | out: |
353 | put_cpu_no_resched(); | 354 | put_cpu_no_resched(); |
355 | set_irq_regs(old_regs); | ||
354 | } | 356 | } |
355 | 357 | ||
356 | static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm, | 358 | static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm, |
@@ -605,11 +607,14 @@ void smp_send_stop(void) | |||
605 | */ | 607 | */ |
606 | fastcall void smp_reschedule_interrupt(struct pt_regs *regs) | 608 | fastcall void smp_reschedule_interrupt(struct pt_regs *regs) |
607 | { | 609 | { |
610 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
608 | ack_APIC_irq(); | 611 | ack_APIC_irq(); |
612 | set_irq_regs(old_regs); | ||
609 | } | 613 | } |
610 | 614 | ||
611 | fastcall void smp_call_function_interrupt(struct pt_regs *regs) | 615 | fastcall void smp_call_function_interrupt(struct pt_regs *regs) |
612 | { | 616 | { |
617 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
613 | void (*func) (void *info) = call_data->func; | 618 | void (*func) (void *info) = call_data->func; |
614 | void *info = call_data->info; | 619 | void *info = call_data->info; |
615 | int wait = call_data->wait; | 620 | int wait = call_data->wait; |
@@ -632,6 +637,7 @@ fastcall void smp_call_function_interrupt(struct pt_regs *regs) | |||
632 | mb(); | 637 | mb(); |
633 | atomic_inc(&call_data->finished); | 638 | atomic_inc(&call_data->finished); |
634 | } | 639 | } |
640 | set_irq_regs(old_regs); | ||
635 | } | 641 | } |
636 | 642 | ||
637 | /* | 643 | /* |
diff --git a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c index 58a2d5582419..3f221f5eb47e 100644 --- a/arch/i386/kernel/time.c +++ b/arch/i386/kernel/time.c | |||
@@ -161,7 +161,7 @@ EXPORT_SYMBOL(profile_pc); | |||
161 | * Time Stamp Counter value at the time of the timer interrupt, so that | 161 | * Time Stamp Counter value at the time of the timer interrupt, so that |
162 | * we later on can estimate the time of day more exactly. | 162 | * we later on can estimate the time of day more exactly. |
163 | */ | 163 | */ |
164 | irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 164 | irqreturn_t timer_interrupt(int irq, void *dev_id) |
165 | { | 165 | { |
166 | /* | 166 | /* |
167 | * Here we are in the timer irq handler. We just have irqs locally | 167 | * Here we are in the timer irq handler. We just have irqs locally |
@@ -188,7 +188,7 @@ irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
188 | } | 188 | } |
189 | #endif | 189 | #endif |
190 | 190 | ||
191 | do_timer_interrupt_hook(regs); | 191 | do_timer_interrupt_hook(); |
192 | 192 | ||
193 | 193 | ||
194 | if (MCA_bus) { | 194 | if (MCA_bus) { |
@@ -209,7 +209,7 @@ irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
209 | 209 | ||
210 | #ifdef CONFIG_X86_LOCAL_APIC | 210 | #ifdef CONFIG_X86_LOCAL_APIC |
211 | if (using_apic_timer) | 211 | if (using_apic_timer) |
212 | smp_send_timer_broadcast_ipi(regs); | 212 | smp_send_timer_broadcast_ipi(); |
213 | #endif | 213 | #endif |
214 | 214 | ||
215 | return IRQ_HANDLED; | 215 | return IRQ_HANDLED; |
diff --git a/arch/i386/kernel/time_hpet.c b/arch/i386/kernel/time_hpet.c index 6bf14a4e995e..1a2a979cf6a3 100644 --- a/arch/i386/kernel/time_hpet.c +++ b/arch/i386/kernel/time_hpet.c | |||
@@ -441,7 +441,7 @@ int hpet_rtc_dropped_irq(void) | |||
441 | return 1; | 441 | return 1; |
442 | } | 442 | } |
443 | 443 | ||
444 | irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 444 | irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id) |
445 | { | 445 | { |
446 | struct rtc_time curr_time; | 446 | struct rtc_time curr_time; |
447 | unsigned long rtc_int_flag = 0; | 447 | unsigned long rtc_int_flag = 0; |
@@ -480,7 +480,7 @@ irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
480 | } | 480 | } |
481 | if (call_rtc_interrupt) { | 481 | if (call_rtc_interrupt) { |
482 | rtc_int_flag |= (RTC_IRQF | (RTC_NUM_INTS << 8)); | 482 | rtc_int_flag |= (RTC_IRQF | (RTC_NUM_INTS << 8)); |
483 | rtc_interrupt(rtc_int_flag, dev_id, regs); | 483 | rtc_interrupt(rtc_int_flag, dev_id); |
484 | } | 484 | } |
485 | return IRQ_HANDLED; | 485 | return IRQ_HANDLED; |
486 | } | 486 | } |
diff --git a/arch/i386/kernel/vm86.c b/arch/i386/kernel/vm86.c index 8355d8d87d18..cbcd61d6120b 100644 --- a/arch/i386/kernel/vm86.c +++ b/arch/i386/kernel/vm86.c | |||
@@ -714,7 +714,7 @@ static int irqbits; | |||
714 | | (1 << SIGUSR1) | (1 << SIGUSR2) | (1 << SIGIO) | (1 << SIGURG) \ | 714 | | (1 << SIGUSR1) | (1 << SIGUSR2) | (1 << SIGIO) | (1 << SIGURG) \ |
715 | | (1 << SIGUNUSED) ) | 715 | | (1 << SIGUNUSED) ) |
716 | 716 | ||
717 | static irqreturn_t irq_handler(int intno, void *dev_id, struct pt_regs * regs) | 717 | static irqreturn_t irq_handler(int intno, void *dev_id) |
718 | { | 718 | { |
719 | int irq_bit; | 719 | int irq_bit; |
720 | unsigned long flags; | 720 | unsigned long flags; |
diff --git a/arch/i386/mach-visws/visws_apic.c b/arch/i386/mach-visws/visws_apic.c index 5929f884d79b..07097ed48890 100644 --- a/arch/i386/mach-visws/visws_apic.c +++ b/arch/i386/mach-visws/visws_apic.c | |||
@@ -191,7 +191,7 @@ static struct hw_interrupt_type piix4_virtual_irq_type = { | |||
191 | * enable_irq gets the right irq. This 'master' irq is never directly | 191 | * enable_irq gets the right irq. This 'master' irq is never directly |
192 | * manipulated by any driver. | 192 | * manipulated by any driver. |
193 | */ | 193 | */ |
194 | static irqreturn_t piix4_master_intr(int irq, void *dev_id, struct pt_regs * regs) | 194 | static irqreturn_t piix4_master_intr(int irq, void *dev_id) |
195 | { | 195 | { |
196 | int realirq; | 196 | int realirq; |
197 | irq_desc_t *desc; | 197 | irq_desc_t *desc; |
@@ -244,7 +244,7 @@ static irqreturn_t piix4_master_intr(int irq, void *dev_id, struct pt_regs * reg | |||
244 | kstat_cpu(smp_processor_id()).irqs[realirq]++; | 244 | kstat_cpu(smp_processor_id()).irqs[realirq]++; |
245 | 245 | ||
246 | if (likely(desc->action != NULL)) | 246 | if (likely(desc->action != NULL)) |
247 | handle_IRQ_event(realirq, regs, desc->action); | 247 | handle_IRQ_event(realirq, desc->action); |
248 | 248 | ||
249 | if (!(desc->status & IRQ_DISABLED)) | 249 | if (!(desc->status & IRQ_DISABLED)) |
250 | enable_8259A_irq(realirq); | 250 | enable_8259A_irq(realirq); |
diff --git a/arch/i386/mach-voyager/voyager_basic.c b/arch/i386/mach-voyager/voyager_basic.c index 80b7f2fc4f46..c639d30d8bdc 100644 --- a/arch/i386/mach-voyager/voyager_basic.c +++ b/arch/i386/mach-voyager/voyager_basic.c | |||
@@ -87,7 +87,7 @@ voyager_detect(struct voyager_bios_info *bios) | |||
87 | } | 87 | } |
88 | 88 | ||
89 | void | 89 | void |
90 | voyager_system_interrupt(int cpl, void *dev_id, struct pt_regs *regs) | 90 | voyager_system_interrupt(int cpl, void *dev_id) |
91 | { | 91 | { |
92 | printk("Voyager: detected system interrupt\n"); | 92 | printk("Voyager: detected system interrupt\n"); |
93 | } | 93 | } |
diff --git a/arch/i386/mach-voyager/voyager_smp.c b/arch/i386/mach-voyager/voyager_smp.c index 856c73fcb7e7..d42422fc4af3 100644 --- a/arch/i386/mach-voyager/voyager_smp.c +++ b/arch/i386/mach-voyager/voyager_smp.c | |||
@@ -126,10 +126,10 @@ send_QIC_CPI(__u32 cpuset, __u8 cpi) | |||
126 | } | 126 | } |
127 | 127 | ||
128 | static inline void | 128 | static inline void |
129 | wrapper_smp_local_timer_interrupt(struct pt_regs *regs) | 129 | wrapper_smp_local_timer_interrupt(void) |
130 | { | 130 | { |
131 | irq_enter(); | 131 | irq_enter(); |
132 | smp_local_timer_interrupt(regs); | 132 | smp_local_timer_interrupt(); |
133 | irq_exit(); | 133 | irq_exit(); |
134 | } | 134 | } |
135 | 135 | ||
@@ -786,7 +786,7 @@ fastcall void | |||
786 | smp_vic_sys_interrupt(struct pt_regs *regs) | 786 | smp_vic_sys_interrupt(struct pt_regs *regs) |
787 | { | 787 | { |
788 | ack_CPI(VIC_SYS_INT); | 788 | ack_CPI(VIC_SYS_INT); |
789 | printk("Voyager SYSTEM INTERRUPT\n"); | 789 | printk("Voyager SYSTEM INTERRUPT\n"); |
790 | } | 790 | } |
791 | 791 | ||
792 | /* Handle a voyager CMN_INT; These interrupts occur either because of | 792 | /* Handle a voyager CMN_INT; These interrupts occur either because of |
@@ -1135,7 +1135,9 @@ EXPORT_SYMBOL(smp_call_function); | |||
1135 | fastcall void | 1135 | fastcall void |
1136 | smp_apic_timer_interrupt(struct pt_regs *regs) | 1136 | smp_apic_timer_interrupt(struct pt_regs *regs) |
1137 | { | 1137 | { |
1138 | wrapper_smp_local_timer_interrupt(regs); | 1138 | struct pt_regs *old_regs = set_irq_regs(regs); |
1139 | wrapper_smp_local_timer_interrupt(); | ||
1140 | set_irq_regs(old_regs); | ||
1139 | } | 1141 | } |
1140 | 1142 | ||
1141 | /* All of the QUAD interrupt GATES */ | 1143 | /* All of the QUAD interrupt GATES */ |
@@ -1143,7 +1145,9 @@ fastcall void | |||
1143 | smp_qic_timer_interrupt(struct pt_regs *regs) | 1145 | smp_qic_timer_interrupt(struct pt_regs *regs) |
1144 | { | 1146 | { |
1145 | ack_QIC_CPI(QIC_TIMER_CPI); | 1147 | ack_QIC_CPI(QIC_TIMER_CPI); |
1146 | wrapper_smp_local_timer_interrupt(regs); | 1148 | struct pt_regs *old_regs = set_irq_regs(regs); |
1149 | wrapper_smp_local_timer_interrupt(void); | ||
1150 | set_irq_regs(old_regs); | ||
1147 | } | 1151 | } |
1148 | 1152 | ||
1149 | fastcall void | 1153 | fastcall void |
@@ -1177,6 +1181,7 @@ smp_qic_call_function_interrupt(struct pt_regs *regs) | |||
1177 | fastcall void | 1181 | fastcall void |
1178 | smp_vic_cpi_interrupt(struct pt_regs *regs) | 1182 | smp_vic_cpi_interrupt(struct pt_regs *regs) |
1179 | { | 1183 | { |
1184 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
1180 | __u8 cpu = smp_processor_id(); | 1185 | __u8 cpu = smp_processor_id(); |
1181 | 1186 | ||
1182 | if(is_cpu_quad()) | 1187 | if(is_cpu_quad()) |
@@ -1185,7 +1190,7 @@ smp_vic_cpi_interrupt(struct pt_regs *regs) | |||
1185 | ack_VIC_CPI(VIC_CPI_LEVEL0); | 1190 | ack_VIC_CPI(VIC_CPI_LEVEL0); |
1186 | 1191 | ||
1187 | if(test_and_clear_bit(VIC_TIMER_CPI, &vic_cpi_mailbox[cpu])) | 1192 | if(test_and_clear_bit(VIC_TIMER_CPI, &vic_cpi_mailbox[cpu])) |
1188 | wrapper_smp_local_timer_interrupt(regs); | 1193 | wrapper_smp_local_timer_interrupt(); |
1189 | if(test_and_clear_bit(VIC_INVALIDATE_CPI, &vic_cpi_mailbox[cpu])) | 1194 | if(test_and_clear_bit(VIC_INVALIDATE_CPI, &vic_cpi_mailbox[cpu])) |
1190 | smp_invalidate_interrupt(); | 1195 | smp_invalidate_interrupt(); |
1191 | if(test_and_clear_bit(VIC_RESCHEDULE_CPI, &vic_cpi_mailbox[cpu])) | 1196 | if(test_and_clear_bit(VIC_RESCHEDULE_CPI, &vic_cpi_mailbox[cpu])) |
@@ -1194,6 +1199,7 @@ smp_vic_cpi_interrupt(struct pt_regs *regs) | |||
1194 | smp_enable_irq_interrupt(); | 1199 | smp_enable_irq_interrupt(); |
1195 | if(test_and_clear_bit(VIC_CALL_FUNCTION_CPI, &vic_cpi_mailbox[cpu])) | 1200 | if(test_and_clear_bit(VIC_CALL_FUNCTION_CPI, &vic_cpi_mailbox[cpu])) |
1196 | smp_call_function_interrupt(); | 1201 | smp_call_function_interrupt(); |
1202 | set_irq_regs(old_regs); | ||
1197 | } | 1203 | } |
1198 | 1204 | ||
1199 | static void | 1205 | static void |
@@ -1266,8 +1272,10 @@ smp_send_stop(void) | |||
1266 | void | 1272 | void |
1267 | smp_vic_timer_interrupt(struct pt_regs *regs) | 1273 | smp_vic_timer_interrupt(struct pt_regs *regs) |
1268 | { | 1274 | { |
1275 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
1269 | send_CPI_allbutself(VIC_TIMER_CPI); | 1276 | send_CPI_allbutself(VIC_TIMER_CPI); |
1270 | smp_local_timer_interrupt(regs); | 1277 | smp_local_timer_interrupt(); |
1278 | set_irq_regs(old_regs); | ||
1271 | } | 1279 | } |
1272 | 1280 | ||
1273 | /* local (per CPU) timer interrupt. It does both profiling and | 1281 | /* local (per CPU) timer interrupt. It does both profiling and |
@@ -1279,12 +1287,12 @@ smp_vic_timer_interrupt(struct pt_regs *regs) | |||
1279 | * value into /proc/profile. | 1287 | * value into /proc/profile. |
1280 | */ | 1288 | */ |
1281 | void | 1289 | void |
1282 | smp_local_timer_interrupt(struct pt_regs * regs) | 1290 | smp_local_timer_interrupt(void) |
1283 | { | 1291 | { |
1284 | int cpu = smp_processor_id(); | 1292 | int cpu = smp_processor_id(); |
1285 | long weight; | 1293 | long weight; |
1286 | 1294 | ||
1287 | profile_tick(CPU_PROFILING, regs); | 1295 | profile_tick(CPU_PROFILING); |
1288 | if (--per_cpu(prof_counter, cpu) <= 0) { | 1296 | if (--per_cpu(prof_counter, cpu) <= 0) { |
1289 | /* | 1297 | /* |
1290 | * The multiplier may have changed since the last time we got | 1298 | * The multiplier may have changed since the last time we got |
@@ -1302,7 +1310,7 @@ smp_local_timer_interrupt(struct pt_regs * regs) | |||
1302 | per_cpu(prof_counter, cpu); | 1310 | per_cpu(prof_counter, cpu); |
1303 | } | 1311 | } |
1304 | 1312 | ||
1305 | update_process_times(user_mode_vm(regs)); | 1313 | update_process_times(user_mode_vm(irq_regs)); |
1306 | } | 1314 | } |
1307 | 1315 | ||
1308 | if( ((1<<cpu) & voyager_extended_vic_processors) == 0) | 1316 | if( ((1<<cpu) & voyager_extended_vic_processors) == 0) |