x86: fix information leak on AMD CPUs

The fix for XSA-52 was wrong, and so was the change synchronizing that
new behavior to the FXRSTOR logic: AMD's manuals explictly state that
writes to the ES bit are ignored, and it instead gets calculated from
the exception and mask bits (it gets set whenever there is an unmasked
exception, and cleared otherwise). Hence we need to follow that model
in our workaround.

This is CVE-2016-3158 / CVE-2016-3159 / XSA-172.
[xen/arch/x86/xstate.c:xrstor: CVE-2016-3158]
[xen/arch/x86/i387.c:fpu_fxrstor: CVE-2016-3159]

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
Jan Beulich committed 2016-03-29 14:24:26 +02:00
1 parent 04119085f5
commit 7bd9dc3adf
2 files changed
+2 -2

No files matched your search

+1 -1
View File
@@ -49,7 +49,7 @@ static inline void fpu_fxrstor(struct vcpu *v)
* sometimes new user value. Both should be ok. Use the FPU saved
* data block as a safe address because it should be in L1.
*/
if ( !(fpu_ctxt->fsw & 0x0080) &&
if ( !(fpu_ctxt->fsw & ~fpu_ctxt->fcw & 0x003f) &&
boot_cpu_data.x86_vendor == X86_VENDOR_AMD )
{
asm volatile ( "fnclex\n\t"
+1 -1
View File
@@ -333,7 +333,7 @@ void xrstor(struct vcpu *v, uint64_t mask)
* data block as a safe address because it should be in L1.
*/
if ( (mask & ptr->xsave_hdr.xstate_bv & XSTATE_FP) &&
!(ptr->fpu_sse.fsw & 0x0080) &&
!(ptr->fpu_sse.fsw & ~ptr->fpu_sse.fcw & 0x003f) &&
boot_cpu_data.x86_vendor == X86_VENDOR_AMD )
asm volatile ( "fnclex\n\t" /* clear exceptions */
"ffree %%st(7)\n\t" /* clear stack tag */
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.