]> xenbits.xensource.com Git - people/dwmw2/xen.git/commitdiff
x86emul: don't read mask register on AVX512F-incapable platforms
authorJan Beulich <jbeulich@suse.com>
Wed, 15 May 2019 07:38:59 +0000 (09:38 +0200)
committerJan Beulich <jbeulich@suse.com>
Wed, 15 May 2019 07:38:59 +0000 (09:38 +0200)
Nor when register state isn't sufficiently enabled.

Reported-by: George Dunlap <george.dunlap@citrix.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
master commit: 6cb7e52edf823fd89fe14da94f9bf3e5cf99d1ff
master date: 2019-04-05 17:27:13 +0200

xen/arch/x86/x86_emulate/x86_emulate.c

index 651194a683dcf7476af4da92dd3dd99a587af1af..a617e09d08ec802ed7cd1cbc8dc51cd27b0499e5 100644 (file)
@@ -3511,7 +3511,8 @@ x86_emulate(
     }
 
     /* With a memory operand, fetch the mask register in use (if any). */
-    if ( ea.type == OP_MEM && evex.opmsk )
+    if ( ea.type == OP_MEM && evex.opmsk &&
+         _get_fpu(fpu_type = X86EMUL_FPU_opmask, ctxt, ops) == X86EMUL_OKAY )
     {
         uint8_t *stb = get_stub(stub);
 
@@ -3532,6 +3533,14 @@ x86_emulate(
         fault_suppression = true;
     }
 
+    if ( fpu_type == X86EMUL_FPU_opmask )
+    {
+        /* Squash (side) effects of the _get_fpu() above. */
+        x86_emul_reset_event(ctxt);
+        put_fpu(X86EMUL_FPU_opmask, false, state, ctxt, ops);
+        fpu_type = X86EMUL_FPU_none;
+    }
+
     /* Decode (but don't fetch) the destination operand: register or memory. */
     switch ( d & DstMask )
     {