mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-15 09:34:17 +00:00
[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: Atsushi Nemoto <anemo@mba.ocn.ne.jp> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
d834c16516
commit
eae6c0da9d
@ -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)
|
|||||||
*/
|
*/
|
||||||
.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)
|
|||||||
#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 @@
|
|||||||
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)
|
|||||||
* 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
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user