On Mon, Feb 22, 2016 at 10:58 AM, Yu-cheng Yu <yu-cheng...@intel.com> wrote: > XSAVES is a kernel instruction and uses a compacted format. When > working with user space, the kernel should provide standard-format, > non-supervisor state data. We cannot do __copy_to_user() from a compacted- > format kernel xstate area to a signal frame. > > Note that the path to copy_fpstate_to_sigframe() does currently check if > the thread has used FPU, but add a WARN_ONCE() there to detect any > potential mis-use. > > Dave Hansen proposes this method to simplify copy xstate directly to user. > > Signed-off-by: Fenghua Yu <fenghua...@intel.com> > Signed-off by: Yu-cheng Yu <yu-cheng...@intel.com> > --- > arch/x86/kernel/fpu/signal.c | 41 ++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 40 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/kernel/fpu/signal.c b/arch/x86/kernel/fpu/signal.c > index 0fbf60c..7676718 100644 > --- a/arch/x86/kernel/fpu/signal.c > +++ b/arch/x86/kernel/fpu/signal.c > @@ -130,6 +130,45 @@ static inline int copy_fpregs_to_sigframe(struct > xregs_state __user *buf) > return err; > } > > +static int should_save_registers_directly(void)
I don't like the name of this function because: > +{ > + /* > + * In signal handling path, the kernel already checks if > + * FPU instructions have been used before it calls > + * copy_fpstate_to_sigframe(). We check this here again > + * to detect any potential mis-use and saving invalid > + * register values directly to a signal frame. > + */ > + WARN_ONCE(!current->thread.fpu.fpstate_active, > + "direct FPU save with no math use\n"); ... Here "direct" seems to mean that we're asking whether to directly save ... > + > + /* > + * In the case that we are using a compacted kernel > + * xsave area, we can not copy the thread.fpu.state > + * directly to userspace and *must* save it from the > + * registers directly. > + */ ... and here "directly" means *both* copying directly to userspace and saving using xsave directly. So can you rename it to something with an obvious meaning like "may_memcpy_fpu_regs" or similar? --Andy