[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 <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
Atsushi Nemoto 2006-10-09 01:24:23 +09:00 committed by Ralf Baechle
parent 441ee341ad
commit f431baa55a
4 changed files with 19 additions and 23 deletions

View file

@ -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)

View file

@ -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

View file

@ -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)
/*

View file

@ -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