From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933749AbdBPWUA (ORCPT ); Thu, 16 Feb 2017 17:20:00 -0500 Received: from mga05.intel.com ([192.55.52.43]:33617 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933558AbdBPWT6 (ORCPT ); Thu, 16 Feb 2017 17:19:58 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.35,169,1484035200"; d="scan'208";a="934806158" From: Yu-cheng Yu To: linux-kernel@vger.kernel.org, x86@kernel.org, "H. Peter Anvin" , Thomas Gleixner , Ingo Molnar , stable@vger.kernel.org, Borislav Petkov , Dave Hansen , , Fenghua Yu , "Ravi V. Shankar" , peterz@infradead.org, Andy Lutomirski , Joakim Tjernlund , torvalds@linux-foundation.org, Greg Kroah-Hartman Cc: Yu-cheng Yu Subject: [PATCH] x86/fpu/xstate: Fix xcomp_bv in XSAVES header Date: Thu, 16 Feb 2017 14:14:58 -0800 Message-Id: <1487283298-30518-1-git-send-email-yu-cheng.yu@intel.com> X-Mailer: git-send-email 1.9.1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is essentially the same patch as: commit dffba9a31c77 ("x86/fpu/xstate: Fix xcomp_bv in XSAVES header") in the upstream tree, rebased and tested for the stable tree. This can be applied to both linux-stable-rc/linux-4.9.y and linux-stable-rc/linux-4.8.y if desired. The compacted-format XSAVES area is determined at boot time and never changed after. The field xsave.header.xcomp_bv indicates which components are in the fixed XSAVES format. In fpstate_init() we did not set xcomp_bv to reflect the XSAVES format since at the time there is no valid data. However, after we do copy_init_fpstate_to_fpregs() in fpu__clear(), as in commit b22cbe404a9c ("x86/fpu: Fix invalid FPU ptrace state after execve()") and when __fpu_restore_sig() does fpu__restore() for a COMPAT-mode app, a #GP occurs. This can be easily triggered by doing valgrind on a COMPAT-mode "Hello World," as reported by Joakim Tjernlund and others: https://bugzilla.kernel.org/show_bug.cgi?id=190061 Fix it by setting xcomp_bv correctly. Signed-off-by: Yu-cheng Yu Reported-by: Joakim Tjernlund --- arch/x86/kernel/fpu/core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c index ebb4e95..96d80df 100644 --- a/arch/x86/kernel/fpu/core.c +++ b/arch/x86/kernel/fpu/core.c @@ -236,7 +236,8 @@ void fpstate_init(union fpregs_state *state) * it will #GP. Make sure it is replaced after the memset(). */ if (static_cpu_has(X86_FEATURE_XSAVES)) - state->xsave.header.xcomp_bv = XCOMP_BV_COMPACTED_FORMAT; + state->xsave.header.xcomp_bv = XCOMP_BV_COMPACTED_FORMAT | + xfeatures_mask; if (static_cpu_has(X86_FEATURE_FXSR)) fpstate_init_fxstate(&state->fxsave); -- 1.9.1