On Tue, 2017-01-24 at 09:09 +0100, Ingo Molnar wrote: > * Yu-cheng Yu <yu-cheng...@intel.com> wrote:
This needs to go to stable too, 4.8 and 4.9 Jocke > > > 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: b22cbe404a9cc3c7949e380fa1861e31934c8978, 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 <yu-cheng...@intel.com> > > Reported-by: Joakim Tjernlund <joakim.tjernl...@infinera.com> > > --- > > arch/x86/kernel/fpu/core.c | 4 +++- > > 1 file changed, 3 insertions(+), 1 deletion(-) > > > > diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c > > index c289e2f..e540dc1 100644 > > --- a/arch/x86/kernel/fpu/core.c > > +++ b/arch/x86/kernel/fpu/core.c > > @@ -9,6 +9,7 @@ > > #include <asm/fpu/regset.h> > > #include <asm/fpu/signal.h> > > #include <asm/fpu/types.h> > > +#include <asm/fpu/xstate.h> > > #include <asm/traps.h> > > > > #include <linux/hardirq.h> > > @@ -235,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; > > Ok, I have applied this - but it would be cleaner to go one step further and > add a > fpstate_init_xstate() method that does this in xstate.c and hides the details > from > arch/x86/kernel/fpu/core.c. > > Similar to how the FX-state initialization is done today: > > > if (static_cpu_has(X86_FEATURE_FXSR)) > > fpstate_init_fxstate(&state->fxsave); > > Thanks, > > Ingo