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

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

[MIPS] lockdep: fix TRACE_IRQFLAGS_SUPPORT



In handle_sys and its variants, we must reload some registers which
might be clobbered by trace_hardirqs_on().
Also we must make sure trace_hardirqs_on() called in kernel level (not
exception level).

Signed-off-by: default avatarAtsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent d834c165
Loading
Loading
Loading
Loading
+1 −12
Original line number Diff line number Diff line
@@ -28,18 +28,7 @@
NESTED(handle_sys, PT_SIZE, sp)
	.set	noat
	SAVE_SOME
#ifdef CONFIG_TRACE_IRQFLAGS
	TRACE_IRQS_ON
#ifdef CONFIG_64BIT
	LONG_L	$8, PT_R8(sp)
	LONG_L	$9, PT_R9(sp)
#endif
	LONG_L	$7, PT_R7(sp)
	LONG_L	$6, PT_R6(sp)
	LONG_L	$5, PT_R5(sp)
	LONG_L	$4, PT_R4(sp)
	LONG_L	$2, PT_R2(sp)
#endif
	TRACE_IRQS_ON_RELOAD
	STI
	.set	at

+1 −1
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ NESTED(handle_sys64, PT_SIZE, sp)
	 */
	.set	noat
	SAVE_SOME
	TRACE_IRQS_ON
	TRACE_IRQS_ON_RELOAD
	STI
	.set	at
#endif
+1 −1
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ NESTED(handle_sysn32, PT_SIZE, sp)
#ifndef CONFIG_MIPS32_O32
	.set	noat
	SAVE_SOME
	TRACE_IRQS_ON
	TRACE_IRQS_ON_RELOAD
	STI
	.set	at
#endif
+1 −1
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@
NESTED(handle_sys, PT_SIZE, sp)
	.set	noat
	SAVE_SOME
	TRACE_IRQS_ON
	TRACE_IRQS_ON_RELOAD
	STI
	.set	at
	ld	t1, PT_EPC(sp)		# skip syscall on return
+25 −0
Original line number Diff line number Diff line
@@ -213,12 +213,37 @@ static inline int raw_irqs_disabled_flags(unsigned long flags)
 * Do the CPU's IRQ-state tracing from assembly code.
 */
#ifdef CONFIG_TRACE_IRQFLAGS
/* Reload some registers clobbered by trace_hardirqs_on */
#ifdef CONFIG_64BIT
# define TRACE_IRQS_RELOAD_REGS						\
	LONG_L	$11, PT_R11(sp);					\
	LONG_L	$10, PT_R10(sp);					\
	LONG_L	$9, PT_R9(sp);						\
	LONG_L	$8, PT_R8(sp);						\
	LONG_L	$7, PT_R7(sp);						\
	LONG_L	$6, PT_R6(sp);						\
	LONG_L	$5, PT_R5(sp);						\
	LONG_L	$4, PT_R4(sp);						\
	LONG_L	$2, PT_R2(sp)
#else
# define TRACE_IRQS_RELOAD_REGS						\
	LONG_L	$7, PT_R7(sp);						\
	LONG_L	$6, PT_R6(sp);						\
	LONG_L	$5, PT_R5(sp);						\
	LONG_L	$4, PT_R4(sp);						\
	LONG_L	$2, PT_R2(sp)
#endif
# define TRACE_IRQS_ON							\
	CLI;	/* make sure trace_hardirqs_on() is called in kernel level */ \
	jal	trace_hardirqs_on
# define TRACE_IRQS_ON_RELOAD						\
	TRACE_IRQS_ON;							\
	TRACE_IRQS_RELOAD_REGS
# define TRACE_IRQS_OFF							\
	jal	trace_hardirqs_off
#else
# define TRACE_IRQS_ON
# define TRACE_IRQS_ON_RELOAD
# define TRACE_IRQS_OFF
#endif