diff options
Diffstat (limited to 'arch/powerpc/kernel')
-rw-r--r-- | arch/powerpc/kernel/irq.c | 6 | ||||
-rw-r--r-- | arch/powerpc/kernel/misc_64.S | 6 | ||||
-rw-r--r-- | arch/powerpc/kernel/smp.c | 6 | ||||
-rw-r--r-- | arch/powerpc/kernel/time.c | 6 |
4 files changed, 15 insertions, 9 deletions
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index c3f58f2f9f52..5deaab3090b4 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -187,6 +187,7 @@ void fixup_irqs(cpumask_t map) | |||
187 | 187 | ||
188 | void do_IRQ(struct pt_regs *regs) | 188 | void do_IRQ(struct pt_regs *regs) |
189 | { | 189 | { |
190 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
190 | unsigned int irq; | 191 | unsigned int irq; |
191 | #ifdef CONFIG_IRQSTACKS | 192 | #ifdef CONFIG_IRQSTACKS |
192 | struct thread_info *curtp, *irqtp; | 193 | struct thread_info *curtp, *irqtp; |
@@ -230,18 +231,19 @@ void do_IRQ(struct pt_regs *regs) | |||
230 | handler = &__do_IRQ; | 231 | handler = &__do_IRQ; |
231 | irqtp->task = curtp->task; | 232 | irqtp->task = curtp->task; |
232 | irqtp->flags = 0; | 233 | irqtp->flags = 0; |
233 | call_handle_irq(irq, desc, regs, irqtp, handler); | 234 | call_handle_irq(irq, desc, irqtp, handler); |
234 | irqtp->task = NULL; | 235 | irqtp->task = NULL; |
235 | if (irqtp->flags) | 236 | if (irqtp->flags) |
236 | set_bits(irqtp->flags, &curtp->flags); | 237 | set_bits(irqtp->flags, &curtp->flags); |
237 | } else | 238 | } else |
238 | #endif | 239 | #endif |
239 | generic_handle_irq(irq, regs); | 240 | generic_handle_irq(irq); |
240 | } else if (irq != NO_IRQ_IGNORE) | 241 | } else if (irq != NO_IRQ_IGNORE) |
241 | /* That's not SMP safe ... but who cares ? */ | 242 | /* That's not SMP safe ... but who cares ? */ |
242 | ppc_spurious_interrupts++; | 243 | ppc_spurious_interrupts++; |
243 | 244 | ||
244 | irq_exit(); | 245 | irq_exit(); |
246 | set_irq_regs(old_regs); | ||
245 | 247 | ||
246 | #ifdef CONFIG_PPC_ISERIES | 248 | #ifdef CONFIG_PPC_ISERIES |
247 | if (get_lppaca()->int_dword.fields.decr_int) { | 249 | if (get_lppaca()->int_dword.fields.decr_int) { |
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S index 41521b30c3cd..c70e20708a1f 100644 --- a/arch/powerpc/kernel/misc_64.S +++ b/arch/powerpc/kernel/misc_64.S | |||
@@ -52,12 +52,12 @@ _GLOBAL(call_do_softirq) | |||
52 | blr | 52 | blr |
53 | 53 | ||
54 | _GLOBAL(call_handle_irq) | 54 | _GLOBAL(call_handle_irq) |
55 | ld r8,0(r7) | 55 | ld r8,0(r6) |
56 | mflr r0 | 56 | mflr r0 |
57 | std r0,16(r1) | 57 | std r0,16(r1) |
58 | mtctr r8 | 58 | mtctr r8 |
59 | stdu r1,THREAD_SIZE-112(r6) | 59 | stdu r1,THREAD_SIZE-112(r5) |
60 | mr r1,r6 | 60 | mr r1,r5 |
61 | bctrl | 61 | bctrl |
62 | ld r1,0(r1) | 62 | ld r1,0(r1) |
63 | ld r0,16(r1) | 63 | ld r0,16(r1) |
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 6a9bc9ce54e0..35c6309bdb76 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
@@ -115,7 +115,7 @@ void __devinit smp_generic_kick_cpu(int nr) | |||
115 | } | 115 | } |
116 | #endif | 116 | #endif |
117 | 117 | ||
118 | void smp_message_recv(int msg, struct pt_regs *regs) | 118 | void smp_message_recv(int msg) |
119 | { | 119 | { |
120 | switch(msg) { | 120 | switch(msg) { |
121 | case PPC_MSG_CALL_FUNCTION: | 121 | case PPC_MSG_CALL_FUNCTION: |
@@ -127,11 +127,11 @@ void smp_message_recv(int msg, struct pt_regs *regs) | |||
127 | break; | 127 | break; |
128 | case PPC_MSG_DEBUGGER_BREAK: | 128 | case PPC_MSG_DEBUGGER_BREAK: |
129 | if (crash_ipi_function_ptr) { | 129 | if (crash_ipi_function_ptr) { |
130 | crash_ipi_function_ptr(regs); | 130 | crash_ipi_function_ptr(get_irq_regs()); |
131 | break; | 131 | break; |
132 | } | 132 | } |
133 | #ifdef CONFIG_DEBUGGER | 133 | #ifdef CONFIG_DEBUGGER |
134 | debugger_ipi(regs); | 134 | debugger_ipi(get_irq_regs()); |
135 | break; | 135 | break; |
136 | #endif /* CONFIG_DEBUGGER */ | 136 | #endif /* CONFIG_DEBUGGER */ |
137 | /* FALLTHROUGH */ | 137 | /* FALLTHROUGH */ |
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 85b9244a098c..d210d0a5006b 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
@@ -51,6 +51,7 @@ | |||
51 | #include <linux/rtc.h> | 51 | #include <linux/rtc.h> |
52 | #include <linux/jiffies.h> | 52 | #include <linux/jiffies.h> |
53 | #include <linux/posix-timers.h> | 53 | #include <linux/posix-timers.h> |
54 | #include <linux/irq.h> | ||
54 | 55 | ||
55 | #include <asm/io.h> | 56 | #include <asm/io.h> |
56 | #include <asm/processor.h> | 57 | #include <asm/processor.h> |
@@ -643,6 +644,7 @@ static void iSeries_tb_recal(void) | |||
643 | */ | 644 | */ |
644 | void timer_interrupt(struct pt_regs * regs) | 645 | void timer_interrupt(struct pt_regs * regs) |
645 | { | 646 | { |
647 | struct pt_regs *old_regs; | ||
646 | int next_dec; | 648 | int next_dec; |
647 | int cpu = smp_processor_id(); | 649 | int cpu = smp_processor_id(); |
648 | unsigned long ticks; | 650 | unsigned long ticks; |
@@ -653,9 +655,10 @@ void timer_interrupt(struct pt_regs * regs) | |||
653 | do_IRQ(regs); | 655 | do_IRQ(regs); |
654 | #endif | 656 | #endif |
655 | 657 | ||
658 | old_regs = set_irq_regs(regs); | ||
656 | irq_enter(); | 659 | irq_enter(); |
657 | 660 | ||
658 | profile_tick(CPU_PROFILING, regs); | 661 | profile_tick(CPU_PROFILING); |
659 | calculate_steal_time(); | 662 | calculate_steal_time(); |
660 | 663 | ||
661 | #ifdef CONFIG_PPC_ISERIES | 664 | #ifdef CONFIG_PPC_ISERIES |
@@ -715,6 +718,7 @@ void timer_interrupt(struct pt_regs * regs) | |||
715 | #endif | 718 | #endif |
716 | 719 | ||
717 | irq_exit(); | 720 | irq_exit(); |
721 | set_irq_regs(old_regs); | ||
718 | } | 722 | } |
719 | 723 | ||
720 | void wakeup_decrementer(void) | 724 | void wakeup_decrementer(void) |