• D
    x86/fpu: Correct and check XSAVE xstate size calculations · 65ac2e9b
    Dave Hansen 提交于
    Note: our xsaves support is currently broken and disabled.  This
    patch does not fix it, but it is an incremental improvement.
    
    This might be useful to someone backporting the entire set of
    XSAVES patches at some point, but it should not be backported
    alone.
    
    Ingo said he wanted something like this (bullets 2 and 3):
    
      http://lkml.kernel.org/r/20150808091508.GB32641@gmail.com
    
    There are currently two xsave buffer formats: standard and
    compacted.  The standard format is waht 'XSAVE' and 'XSAVEOPT'
    produce while 'XSAVES' and 'XSAVEC' produce a compacted-formet
    buffer.  (The kernel never uses XSAVEC)
    
    But, the XSAVES buffer *ALSO* contains "system state components"
    which are never saved by a plain XSAVE.  So, XSAVES has two
    things that might make its buffer differently-sized from an
    XSAVE-produced one.
    
    The current code assumes that an XSAVES buffer's size is simply
    the sum of the sizes of the (user) states which are supported.
    This seems to work in most cases, but it is not consistent with
    what the SDM says, and it breaks if we 'align' a component in
    the buffer.  The calculation is also unnecessary work since the
    CPU *tells* us the size of the buffer directly.
    
    This patch just reads the size of the buffer right out of the
    CPUID leaf instead of trying to derive it.
    
    But, blindly trusting the CPU like this is dangerous.  We add
    a verification pass in do_extra_xstate_size_checks() to ensure
    that the size we calculate matches with what we see from the
    hardware.  When it comes down to it, we trust but verify the
    CPU.
    Signed-off-by: NDave Hansen <dave.hansen@linux.intel.com>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: Fenghua Yu <fenghua.yu@intel.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Tim Chen <tim.c.chen@linux.intel.com>
    Cc: dave@sr71.net
    Cc: linux-kernel@vger.kernel.org
    Link: http://lkml.kernel.org/r/20150902233130.234FE1EC@viggo.jf.intel.comSigned-off-by: NIngo Molnar <mingo@kernel.org>
    65ac2e9b
xstate.c 18.2 KB