[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:
parent
441ee341ad
commit
f431baa55a
@ -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:
|
|||||||
#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 @@
|
|||||||
#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 @@
|
|||||||
|
|
||||||
.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)
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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
|
||||||
|
Loading…
Reference in New Issue
Block a user