x86/mpx: Trace #BR exceptions
authorDave Hansen <dave.hansen@linux.intel.com>
Sun, 7 Jun 2015 18:37:03 +0000 (11:37 -0700)
committerIngo Molnar <mingo@kernel.org>
Tue, 9 Jun 2015 10:24:31 +0000 (12:24 +0200)
This is the first in a series of MPX tracing patches.
I've found these extremely useful in the process of
debugging applications and the kernel code itself.

This exception hooks in to the bounds (#BR) exception
very early and allows capturing the key registers which
would influence how the exception is handled.

Note that bndcfgu/bndstatus are technically still
64-bit registers even in 32-bit mode.

Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Dave Hansen <dave@sr71.net>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20150607183703.5FE2619A@viggo.jf.intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/include/asm/trace/mpx.h [new file with mode: 0644]
arch/x86/kernel/traps.c
arch/x86/mm/mpx.c

diff --git a/arch/x86/include/asm/trace/mpx.h b/arch/x86/include/asm/trace/mpx.h
new file mode 100644 (file)
index 0000000..5c03ec8
--- /dev/null
@@ -0,0 +1,50 @@
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM mpx
+
+#if !defined(_TRACE_MPX_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_MPX_H
+
+#include <linux/tracepoint.h>
+
+#ifdef CONFIG_X86_INTEL_MPX
+
+TRACE_EVENT(bounds_exception_mpx,
+
+       TP_PROTO(const struct bndcsr *bndcsr),
+       TP_ARGS(bndcsr),
+
+       TP_STRUCT__entry(
+               __field(u64, bndcfgu)
+               __field(u64, bndstatus)
+       ),
+
+       TP_fast_assign(
+               /* need to get rid of the 'const' on bndcsr */
+               __entry->bndcfgu   = (u64)bndcsr->bndcfgu;
+               __entry->bndstatus = (u64)bndcsr->bndstatus;
+       ),
+
+       TP_printk("bndcfgu:0x%llx bndstatus:0x%llx",
+               __entry->bndcfgu,
+               __entry->bndstatus)
+);
+
+#else
+
+/*
+ * This gets used outside of MPX-specific code, so we need a stub.
+ */
+static inline void trace_bounds_exception_mpx(const struct bndcsr *bndcsr)
+{
+}
+
+#endif /* CONFIG_X86_INTEL_MPX */
+
+#undef TRACE_INCLUDE_PATH
+#define TRACE_INCLUDE_PATH asm/trace/
+#undef TRACE_INCLUDE_FILE
+#define TRACE_INCLUDE_FILE mpx
+#endif /* _TRACE_MPX_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
index cffff669be3fe9d84be18eedc40519b1f5d6641b..36cb15b7b367e38937f8aefa65098e6863ce08c9 100644 (file)
@@ -60,6 +60,7 @@
 #include <asm/mach_traps.h>
 #include <asm/alternative.h>
 #include <asm/fpu/xstate.h>
+#include <asm/trace/mpx.h>
 #include <asm/mpx.h>
 
 #ifdef CONFIG_X86_64
@@ -399,6 +400,7 @@ dotraplinkage void do_bounds(struct pt_regs *regs, long error_code)
        if (!bndcsr)
                goto exit_trap;
 
+       trace_bounds_exception_mpx(bndcsr);
        /*
         * The error code field of the BNDSTATUS register communicates status
         * information of a bound range exception #BR or operation involving
index d6e02f3adee0911299189f9ff13fbf200a4aad51..1fef52c17fc890e144a26ec475b38fb5f6ed1484 100644 (file)
@@ -17,6 +17,9 @@
 #include <asm/processor.h>
 #include <asm/fpu/internal.h>
 
+#define CREATE_TRACE_POINTS
+#include <asm/trace/mpx.h>
+
 static const char *mpx_mapping_name(struct vm_area_struct *vma)
 {
        return "[mpx]";