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 <sea...@google.com>
---
 arch/x86/kvm/emulate.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 9641cff06722..2e6e6c39922f 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -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);
-- 
2.30.0.365.g02bc693789-goog

Reply via email to