Commit f431baa5 authored by Atsushi Nemoto's avatar Atsushi Nemoto Committed by Ralf Baechle

[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: default avatarAtsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 441ee341
...@@ -266,10 +266,8 @@ ...@@ -266,10 +266,8 @@
handle_it: handle_it:
LONG_L s0, TI_REGS($28) LONG_L s0, TI_REGS($28)
LONG_S sp, TI_REGS($28) LONG_S sp, TI_REGS($28)
jal do_IRQ PTR_LA ra, ret_from_irq
LONG_S s0, TI_REGS($28) j do_IRQ
j ret_from_irq
nop nop
#ifdef CONFIG_32BIT #ifdef CONFIG_32BIT
...@@ -279,9 +277,8 @@ fpu: ...@@ -279,9 +277,8 @@ fpu:
#endif #endif
spurious: spurious:
jal spurious_interrupt PTR_LA ra, _ret_from_irq
nop j spurious_interrupt
j ret_from_irq
nop nop
END(plat_irq_dispatch) END(plat_irq_dispatch)
......
...@@ -20,10 +20,7 @@ ...@@ -20,10 +20,7 @@
#include <asm/mipsmtregs.h> #include <asm/mipsmtregs.h>
#endif #endif
#ifdef CONFIG_PREEMPT #ifndef CONFIG_PREEMPT
.macro preempt_stop
.endm
#else
.macro preempt_stop .macro preempt_stop
local_irq_disable local_irq_disable
.endm .endm
...@@ -32,9 +29,16 @@ ...@@ -32,9 +29,16 @@
.text .text
.align 5 .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) FEXPORT(ret_from_exception)
preempt_stop preempt_stop
FEXPORT(ret_from_irq) #endif
FEXPORT(_ret_from_irq)
LONG_L t0, PT_STATUS(sp) # returning to kernel mode? LONG_L t0, PT_STATUS(sp) # returning to kernel mode?
andi t0, t0, KU_USER andi t0, t0, KU_USER
beqz t0, resume_kernel beqz t0, resume_kernel
......
...@@ -133,9 +133,8 @@ NESTED(handle_int, PT_SIZE, sp) ...@@ -133,9 +133,8 @@ NESTED(handle_int, PT_SIZE, sp)
LONG_L s0, TI_REGS($28) LONG_L s0, TI_REGS($28)
LONG_S sp, TI_REGS($28) LONG_S sp, TI_REGS($28)
jal plat_irq_dispatch PTR_LA ra, ret_from_irq
LONG_S s0, TI_REGS($28) j plat_irq_dispatch
j ret_from_irq
END(handle_int) END(handle_int)
__INIT __INIT
...@@ -224,9 +223,8 @@ NESTED(except_vec_vi_handler, 0, sp) ...@@ -224,9 +223,8 @@ NESTED(except_vec_vi_handler, 0, sp)
LONG_L s0, TI_REGS($28) LONG_L s0, TI_REGS($28)
LONG_S sp, TI_REGS($28) LONG_S sp, TI_REGS($28)
jalr v0
LONG_S s0, TI_REGS($28)
PTR_LA ra, ret_from_irq PTR_LA ra, ret_from_irq
jr v0
END(except_vec_vi_handler) END(except_vec_vi_handler)
/* /*
......
...@@ -97,15 +97,12 @@ FEXPORT(__smtc_ipi_vector) ...@@ -97,15 +97,12 @@ FEXPORT(__smtc_ipi_vector)
SAVE_ALL SAVE_ALL
CLI CLI
TRACE_IRQS_OFF TRACE_IRQS_OFF
move a0,sp
/* Function to be invoked passed stack pad slot 5 */ /* Function to be invoked passed stack pad slot 5 */
lw t0,PT_PADSLOT5(sp) lw t0,PT_PADSLOT5(sp)
/* Argument from sender passed in stack pad slot 4 */ /* Argument from sender passed in stack pad slot 4 */
lw a1,PT_PADSLOT4(sp) lw a0,PT_PADSLOT4(sp)
jalr t0 PTR_LA ra, _ret_from_irq
nop jr t0
j ret_from_irq
nop
/* /*
* Called from idle loop to provoke processing of queued IPIs * Called from idle loop to provoke processing of queued IPIs
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment