Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+4 −7
Original line number Diff line number Diff line
@@ -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)

+9 −5
Original line number Diff line number Diff line
@@ -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
+3 −5
Original line number Diff line number Diff line
@@ -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)

/*
+3 −6
Original line number Diff line number Diff line
@@ -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