From: Atsushi Nemoto Date: Sun, 8 Oct 2006 16:24:23 +0000 (+0900) Subject: [MIPS] ret_from_irq adjustment X-Git-Tag: v2.6.19-rc2~216 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f431baa55abf8adeed0c718b51deacbc151f58f1;p=linux-2.6 [MIPS] ret_from_irq adjustment Make sure that RA on top of interrupt stack is an address of ret_from_irq, so that dump_stack etc. can trace info interrupted context. Also this patch fixes except_vec_vi_handler and __smtc_ipi_vector which seems broken. Signed-off-by: Atsushi Nemoto Signed-off-by: Ralf Baechle --- diff --git a/arch/mips/dec/int-handler.S b/arch/mips/dec/int-handler.S index 55d60d5e0e..31dd47d100 100644 --- a/arch/mips/dec/int-handler.S +++ b/arch/mips/dec/int-handler.S @@ -266,10 +266,8 @@ handle_it: LONG_L s0, TI_REGS($28) LONG_S sp, TI_REGS($28) - jal do_IRQ - LONG_S s0, TI_REGS($28) - - j ret_from_irq + PTR_LA ra, ret_from_irq + j do_IRQ nop #ifdef CONFIG_32BIT @@ -279,9 +277,8 @@ fpu: #endif spurious: - jal spurious_interrupt - nop - j ret_from_irq + PTR_LA ra, _ret_from_irq + j spurious_interrupt nop END(plat_irq_dispatch) diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S index e93e43e1f4..417c08ac76 100644 --- a/arch/mips/kernel/entry.S +++ b/arch/mips/kernel/entry.S @@ -20,10 +20,7 @@ #include #endif -#ifdef CONFIG_PREEMPT - .macro preempt_stop - .endm -#else +#ifndef CONFIG_PREEMPT .macro preempt_stop local_irq_disable .endm @@ -32,9 +29,16 @@ .text .align 5 +FEXPORT(ret_from_irq) + LONG_S s0, TI_REGS($28) +#ifdef CONFIG_PREEMPT +FEXPORT(ret_from_exception) +#else + b _ret_from_irq FEXPORT(ret_from_exception) preempt_stop -FEXPORT(ret_from_irq) +#endif +FEXPORT(_ret_from_irq) LONG_L t0, PT_STATUS(sp) # returning to kernel mode? andi t0, t0, KU_USER beqz t0, resume_kernel diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S index 50ed772977..5baca16993 100644 --- a/arch/mips/kernel/genex.S +++ b/arch/mips/kernel/genex.S @@ -133,9 +133,8 @@ NESTED(handle_int, PT_SIZE, sp) LONG_L s0, TI_REGS($28) LONG_S sp, TI_REGS($28) - jal plat_irq_dispatch - LONG_S s0, TI_REGS($28) - j ret_from_irq + PTR_LA ra, ret_from_irq + j plat_irq_dispatch END(handle_int) __INIT @@ -224,9 +223,8 @@ NESTED(except_vec_vi_handler, 0, sp) LONG_L s0, TI_REGS($28) LONG_S sp, TI_REGS($28) - jalr v0 - LONG_S s0, TI_REGS($28) PTR_LA ra, ret_from_irq + jr v0 END(except_vec_vi_handler) /* diff --git a/arch/mips/kernel/smtc-asm.S b/arch/mips/kernel/smtc-asm.S index 76cb31d574..1cb9441f14 100644 --- a/arch/mips/kernel/smtc-asm.S +++ b/arch/mips/kernel/smtc-asm.S @@ -97,15 +97,12 @@ FEXPORT(__smtc_ipi_vector) SAVE_ALL CLI TRACE_IRQS_OFF - move a0,sp /* Function to be invoked passed stack pad slot 5 */ lw t0,PT_PADSLOT5(sp) /* Argument from sender passed in stack pad slot 4 */ - lw a1,PT_PADSLOT4(sp) - jalr t0 - nop - j ret_from_irq - nop + lw a0,PT_PADSLOT4(sp) + PTR_LA ra, _ret_from_irq + jr t0 /* * Called from idle loop to provoke processing of queued IPIs