From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754493AbbFKTd4 (ORCPT ); Thu, 11 Jun 2015 15:33:56 -0400 Received: from mga11.intel.com ([192.55.52.93]:9131 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752683AbbFKTdy (ORCPT ); Thu, 11 Jun 2015 15:33:54 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.13,596,1427785200"; d="scan'208";a="741686733" Subject: [PATCH] [URGENT] x86, fpu: fix double-increment in setup_xstate_features() To: dave@sr71.net Cc: dave.hansen@linux.intel.com, mingo@kernel.org, linux-kernel@vger.kernel.org, x86@kernel.org From: Dave Hansen Date: Thu, 11 Jun 2015 12:34:00 -0700 Message-Id: <20150611193400.2E0B00DB@viggo.jf.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Dave Hansen I noticed that my MPX tracepoints were producing garbage for the lower and upper bounds: mpx_bounds_register_exception: address referenced: 0x00007fffffffccb7 bounds: lower: 0x0 ~upper: 0xffffffffffffffff mpx_bounds_register_exception: address referenced: 0x00007fffffffccbf bounds: lower: 0x0 ~upper: 0xffffffffffffffff This is, of course, bogus because 0x00007fffffffccbf is *within* the bounds. I assumed that my instruction decoder was bad and went looking at it. But I eventually realized that I was getting a '0' offset back from xstate_offsets[BNDREGS]. It was being skipped in the initialization, which is obviously bogus, so remove the extra leaf++. This also goes an initializes xstate_offsets/sizes[] to -1 so so that bugs like this will oops instead of silently failing in interesting ways. Signed-off-by: Dave Hansen Cc: Ingo Molnar Cc: linux-kernel@vger.kernel.org Cc: x86@kernel.org -- Note: this applies on top of tip/x86/fpu, which is currently: 97ac46a x86/mpx: Allow 32-bit binaries on 64-bit kernels again This was introduced by: 39f1acd x86/fpu/xstate: Don't assume the first zero xfeatures zero bit means the end --- b/arch/x86/kernel/fpu/xstate.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff -puN arch/x86/kernel/fpu/xstate.c~x86-fpu-xstate-fix-double-leaf-increment arch/x86/kernel/fpu/xstate.c --- a/arch/x86/kernel/fpu/xstate.c~x86-fpu-xstate-fix-double-leaf-increment 2015-06-11 11:25:42.706604347 -0700 +++ b/arch/x86/kernel/fpu/xstate.c 2015-06-11 11:38:45.271899550 -0700 @@ -31,7 +31,8 @@ static const char *xfeature_names[] = */ u64 xfeatures_mask __read_mostly; -static unsigned int xstate_offsets[XFEATURES_NR_MAX], xstate_sizes[XFEATURES_NR_MAX]; +static unsigned int xstate_offsets[XFEATURES_NR_MAX] = { [ 0 ... XFEATURES_NR_MAX - 1] = -1}; +static unsigned int xstate_sizes[XFEATURES_NR_MAX] = { [ 0 ... XFEATURES_NR_MAX - 1] = -1}; static unsigned int xstate_comp_offsets[sizeof(xfeatures_mask)*8]; /* The number of supported xfeatures in xfeatures_mask: */ @@ -187,7 +188,6 @@ static void __init setup_xstate_features xstate_sizes[leaf] = eax; printk(KERN_INFO "x86/fpu: xstate_offset[%d]: %04x, xstate_sizes[%d]: %04x\n", leaf, ebx, leaf, eax); - leaf++; } } _