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

[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
...@@ -28,18 +28,7 @@ ...@@ -28,18 +28,7 @@
NESTED(handle_sys, PT_SIZE, sp) NESTED(handle_sys, PT_SIZE, sp)
.set noat .set noat
SAVE_SOME SAVE_SOME
#ifdef CONFIG_TRACE_IRQFLAGS TRACE_IRQS_ON_RELOAD
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
STI STI
.set at .set at
......
...@@ -34,7 +34,7 @@ NESTED(handle_sys64, PT_SIZE, sp) ...@@ -34,7 +34,7 @@ NESTED(handle_sys64, PT_SIZE, sp)
*/ */
.set noat .set noat
SAVE_SOME SAVE_SOME
TRACE_IRQS_ON TRACE_IRQS_ON_RELOAD
STI STI
.set at .set at
#endif #endif
......
...@@ -33,7 +33,7 @@ NESTED(handle_sysn32, PT_SIZE, sp) ...@@ -33,7 +33,7 @@ NESTED(handle_sysn32, PT_SIZE, sp)
#ifndef CONFIG_MIPS32_O32 #ifndef CONFIG_MIPS32_O32
.set noat .set noat
SAVE_SOME SAVE_SOME
TRACE_IRQS_ON TRACE_IRQS_ON_RELOAD
STI STI
.set at .set at
#endif #endif
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
NESTED(handle_sys, PT_SIZE, sp) NESTED(handle_sys, PT_SIZE, sp)
.set noat .set noat
SAVE_SOME SAVE_SOME
TRACE_IRQS_ON TRACE_IRQS_ON_RELOAD
STI STI
.set at .set at
ld t1, PT_EPC(sp) # skip syscall on return ld t1, PT_EPC(sp) # skip syscall on return
......
...@@ -213,12 +213,37 @@ static inline int raw_irqs_disabled_flags(unsigned long flags) ...@@ -213,12 +213,37 @@ static inline int raw_irqs_disabled_flags(unsigned long flags)
* Do the CPU's IRQ-state tracing from assembly code. * Do the CPU's IRQ-state tracing from assembly code.
*/ */
#ifdef CONFIG_TRACE_IRQFLAGS #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 \ # define TRACE_IRQS_ON \
CLI; /* make sure trace_hardirqs_on() is called in kernel level */ \
jal trace_hardirqs_on jal trace_hardirqs_on
# define TRACE_IRQS_ON_RELOAD \
TRACE_IRQS_ON; \
TRACE_IRQS_RELOAD_REGS
# define TRACE_IRQS_OFF \ # define TRACE_IRQS_OFF \
jal trace_hardirqs_off jal trace_hardirqs_off
#else #else
# define TRACE_IRQS_ON # define TRACE_IRQS_ON
# define TRACE_IRQS_ON_RELOAD
# define TRACE_IRQS_OFF # define TRACE_IRQS_OFF
#endif #endif
......
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