From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752962AbbC0Vwx (ORCPT ); Fri, 27 Mar 2015 17:52:53 -0400 Received: from mga02.intel.com ([134.134.136.20]:24942 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752777AbbC0Vwr (ORCPT ); Fri, 27 Mar 2015 17:52:47 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.11,481,1422950400"; d="scan'208";a="547457056" Subject: [PATCH 03/17] x86, mpx: trace #BR exceptions To: linux-kernel@vger.kernel.org Cc: x86@kernel.org, tglx@linutronix.de, Dave Hansen , dave.hansen@linux.intel.com From: Dave Hansen Date: Fri, 27 Mar 2015 14:52:59 -0700 References: <20150327215253.8583D538@viggo.jf.intel.com> In-Reply-To: <20150327215253.8583D538@viggo.jf.intel.com> Message-Id: <20150327215259.76E37BE5@viggo.jf.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Dave Hansen 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 --- b/arch/x86/include/asm/trace/mpx.h | 48 +++++++++++++++++++++++++++++++++++++ b/arch/x86/kernel/traps.c | 2 + b/arch/x86/mm/mpx.c | 3 ++ 3 files changed, 53 insertions(+) diff -puN /dev/null arch/x86/include/asm/trace/mpx.h --- /dev/null 2014-10-10 16:10:57.316716958 -0700 +++ b/arch/x86/include/asm/trace/mpx.h 2015-03-27 14:35:04.735760444 -0700 @@ -0,0 +1,48 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM mpx + +#if !defined(_TRACE_MPX_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_MPX_H + +#include + +#ifdef CONFIG_X86_INTEL_MPX + +TRACE_EVENT(bounds_exception_mpx, + + TP_PROTO(struct bndcsr *bndcsr), + TP_ARGS(bndcsr), + + TP_STRUCT__entry( + __field(u64, bndcfgu) + __field(u64, bndstatus) + ), + + TP_fast_assign( + __entry->bndcfgu = bndcsr->bndcfgu; + __entry->bndstatus = 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(struct bndcsr *bndcsr) +{ +} + +#endif /* CONFIG_X86_INTEL_MPX */ + +#undef TRACE_INCLUDE_PATH +#define TRACE_INCLUDE_PATH asm/trace/ +#define TRACE_INCLUDE_FILE mpx +#endif /* _TRACE_MPX_H */ + +/* This part must be outside protection */ +#include diff -puN arch/x86/kernel/traps.c~x86-br-exception-trace arch/x86/kernel/traps.c --- a/arch/x86/kernel/traps.c~x86-br-exception-trace 2015-03-27 14:35:04.731760263 -0700 +++ b/arch/x86/kernel/traps.c 2015-03-27 14:35:04.736760489 -0700 @@ -61,6 +61,7 @@ #include #include #include +#include #include #ifdef CONFIG_X86_64 @@ -401,6 +402,7 @@ dotraplinkage void do_bounds(struct pt_r 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 diff -puN arch/x86/mm/mpx.c~x86-br-exception-trace arch/x86/mm/mpx.c --- a/arch/x86/mm/mpx.c~x86-br-exception-trace 2015-03-27 14:35:04.732760308 -0700 +++ b/arch/x86/mm/mpx.c 2015-03-27 14:35:04.736760489 -0700 @@ -18,6 +18,9 @@ #include #include +#define CREATE_TRACE_POINTS +#include + static const char *mpx_mapping_name(struct vm_area_struct *vma) { return "[mpx]"; _