From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030486AbbEESeI (ORCPT ); Tue, 5 May 2015 14:34:08 -0400 Received: from mail-wi0-f182.google.com ([209.85.212.182]:38091 "EHLO mail-wi0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030370AbbEERwY (ORCPT ); Tue, 5 May 2015 13:52:24 -0400 From: Ingo Molnar To: linux-kernel@vger.kernel.org Cc: Andy Lutomirski , Borislav Petkov , Dave Hansen , Fenghua Yu , "H. Peter Anvin" , Linus Torvalds , Oleg Nesterov , Thomas Gleixner Subject: [PATCH 088/208] x86/fpu: Improve the __sanitize_i387_state() documentation Date: Tue, 5 May 2015 19:49:40 +0200 Message-Id: <1430848300-27877-10-git-send-email-mingo@kernel.org> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1430848300-27877-1-git-send-email-mingo@kernel.org> References: <1430848300-27877-1-git-send-email-mingo@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Improve the comments and add new ones, as this code isn't very obvious. Reviewed-by: Borislav Petkov Cc: Andy Lutomirski Cc: Dave Hansen Cc: Fenghua Yu Cc: H. Peter Anvin Cc: Linus Torvalds Cc: Oleg Nesterov Cc: Thomas Gleixner Signed-off-by: Ingo Molnar --- arch/x86/kernel/fpu/xsave.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/arch/x86/kernel/fpu/xsave.c b/arch/x86/kernel/fpu/xsave.c index 467e4635bd29..f3d30f0c50f9 100644 --- a/arch/x86/kernel/fpu/xsave.c +++ b/arch/x86/kernel/fpu/xsave.c @@ -30,19 +30,23 @@ static unsigned int xstate_comp_offsets[sizeof(xfeatures_mask)*8]; static unsigned int xfeatures_nr; /* - * If a processor implementation discern that a processor state component is - * in its initialized state it may modify the corresponding bit in the - * header.xfeatures as '0', with out modifying the corresponding memory - * layout in the case of xsaveopt. While presenting the xstate information to - * the user, we always ensure that the memory layout of a feature will be in - * the init state if the corresponding header bit is zero. This is to ensure - * that the user doesn't see some stale state in the memory layout during - * signal handling, debugging etc. + * When executing XSAVEOPT (optimized XSAVE), if a processor implementation + * detects that an FPU state component is still (or is again) in its + * initialized state, it may clear the corresponding bit in the header.xfeatures + * field, and can skip the writeout of registers to the corresponding memory layout. + * + * This means that when the bit is zero, the state component might still contain + * some previous - non-initialized register state. + * + * Before writing xstate information to user-space we sanitize those components, + * to always ensure that the memory layout of a feature will be in the init state + * if the corresponding header bit is zero. This is to ensure that user-space doesn't + * see some stale state in the memory layout during signal handling, debugging etc. */ void __sanitize_i387_state(struct task_struct *tsk) { struct i387_fxsave_struct *fx = &tsk->thread.fpu.state->fxsave; - int feature_bit = 0x2; + int feature_bit; u64 xfeatures; if (!fx) @@ -76,19 +80,25 @@ void __sanitize_i387_state(struct task_struct *tsk) if (!(xfeatures & XSTATE_SSE)) memset(&fx->xmm_space[0], 0, 256); + /* + * First two features are FPU and SSE, which above we handled + * in a special way already: + */ + feature_bit = 0x2; xfeatures = (xfeatures_mask & ~xfeatures) >> 2; /* - * Update all the other memory layouts for which the corresponding - * header bit is in the init state. + * Update all the remaining memory layouts according to their + * standard xstate layout, if their header bit is in the init + * state: */ while (xfeatures) { if (xfeatures & 0x1) { int offset = xstate_offsets[feature_bit]; int size = xstate_sizes[feature_bit]; - memcpy(((void *) fx) + offset, - ((void *) init_xstate_buf) + offset, + memcpy((void *)fx + offset, + (void *)init_xstate_buf + offset, size); } -- 2.1.0