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 @@
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)
......
......@@ -20,10 +20,7 @@
#include <asm/mipsmtregs.h>
#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
......
......@@ -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)
/*
......
......@@ -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
......
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