]> xenbits.xensource.com Git - people/dariof/xen.git/commitdiff
x86emul: adjust_bnd() should check XCR0
authorJan Beulich <jbeulich@suse.com>
Thu, 22 Mar 2018 09:36:55 +0000 (10:36 +0100)
committerJan Beulich <jbeulich@suse.com>
Thu, 22 Mar 2018 09:36:55 +0000 (10:36 +0100)
Experimentally MPX instructions have been confirmed to behave as NOPs
unless both related XCR0 bits are set to 1. By implication branches
then also don't clear BNDn.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
xen/arch/x86/x86_emulate/x86_emulate.c

index bad5af42546bd9a27cd99b915fc183dff0ba8a3a..c4f34ca95c0822ee5341a5d4e33c188118506e42 100644 (file)
@@ -2154,12 +2154,16 @@ static bool umip_active(struct x86_emulate_ctxt *ctxt,
 static void adjust_bnd(struct x86_emulate_ctxt *ctxt,
                        const struct x86_emulate_ops *ops, enum vex_pfx pfx)
 {
-    uint64_t bndcfg;
+    uint64_t xcr0, bndcfg;
     int rc;
 
     if ( pfx == vex_f2 || !cpu_has_mpx || !vcpu_has_mpx() )
         return;
 
+    if ( !ops->read_xcr || ops->read_xcr(0, &xcr0, ctxt) != X86EMUL_OKAY ||
+         !(xcr0 & X86_XCR0_BNDREGS) || !(xcr0 & X86_XCR0_BNDCSR) )
+        return;
+
     if ( !mode_ring0() )
         bndcfg = read_bndcfgu();
     else if ( !ops->read_msr ||