KVM: x86: Remove misleading DR6/DR7 adjustments from RSM emulation
authorSean Christopherson <seanjc@google.com>
Fri, 5 Feb 2021 01:24:57 +0000 (17:24 -0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 9 Feb 2021 13:17:05 +0000 (08:17 -0500)
Drop the DR6/7 volatile+fixed bits adjustments in RSM emulation, which
are redundant and misleading.  The necessary adjustments are made by
kvm_set_dr(), which properly sets the fixed bits that are conditional
on the vCPU model.

Note, KVM incorrectly reads only bits 31:0 of the DR6/7 fields when
emulating RSM on x86-64.  On the plus side for this change, that bug
makes removing "& DRx_VOLATILE" a nop.

No functional change intended.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20210205012458.3872687-2-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/emulate.c

index 612ee69..b5f433d 100644 (file)
@@ -2506,12 +2506,12 @@ static int rsm_load_state_32(struct x86_emulate_ctxt *ctxt,
 
        val = GET_SMSTATE(u32, smstate, 0x7fcc);
 
-       if (ctxt->ops->set_dr(ctxt, 6, (val & DR6_VOLATILE) | DR6_FIXED_1))
+       if (ctxt->ops->set_dr(ctxt, 6, val))
                return X86EMUL_UNHANDLEABLE;
 
        val = GET_SMSTATE(u32, smstate, 0x7fc8);
 
-       if (ctxt->ops->set_dr(ctxt, 7, (val & DR7_VOLATILE) | DR7_FIXED_1))
+       if (ctxt->ops->set_dr(ctxt, 7, val))
                return X86EMUL_UNHANDLEABLE;
 
        selector =                 GET_SMSTATE(u32, smstate, 0x7fc4);
@@ -2566,12 +2566,12 @@ static int rsm_load_state_64(struct x86_emulate_ctxt *ctxt,
 
        val = GET_SMSTATE(u32, smstate, 0x7f68);
 
-       if (ctxt->ops->set_dr(ctxt, 6, (val & DR6_VOLATILE) | DR6_FIXED_1))
+       if (ctxt->ops->set_dr(ctxt, 6, val))
                return X86EMUL_UNHANDLEABLE;
 
        val = GET_SMSTATE(u32, smstate, 0x7f60);
 
-       if (ctxt->ops->set_dr(ctxt, 7, (val & DR7_VOLATILE) | DR7_FIXED_1))
+       if (ctxt->ops->set_dr(ctxt, 7, val))
                return X86EMUL_UNHANDLEABLE;
 
        cr0 =                       GET_SMSTATE(u64, smstate, 0x7f58);