Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[linux-block.git] / arch / x86 / kvm / emulate.c
index aacb28c83e437d83712ed029c47f59ffc7c6cde7..3b27622d46425b58c7285f11f60b346a550c8f84 100644 (file)
@@ -1137,9 +1137,11 @@ static int em_fnstsw(struct x86_emulate_ctxt *ctxt)
 static void decode_register_operand(struct x86_emulate_ctxt *ctxt,
                                    struct operand *op)
 {
-       unsigned reg = ctxt->modrm_reg;
+       unsigned int reg;
 
-       if (!(ctxt->d & ModRM))
+       if (ctxt->d & ModRM)
+               reg = ctxt->modrm_reg;
+       else
                reg = (ctxt->b & 7) | ((ctxt->rex_prefix & 1) << 3);
 
        if (ctxt->d & Sse) {
@@ -1953,7 +1955,7 @@ static int em_pop_sreg(struct x86_emulate_ctxt *ctxt)
        if (rc != X86EMUL_CONTINUE)
                return rc;
 
-       if (ctxt->modrm_reg == VCPU_SREG_SS)
+       if (seg == VCPU_SREG_SS)
                ctxt->interruptibility = KVM_X86_SHADOW_INT_MOV_SS;
        if (ctxt->op_bytes > 2)
                rsp_increment(ctxt, ctxt->op_bytes - 2);
@@ -3645,13 +3647,10 @@ static int em_wrmsr(struct x86_emulate_ctxt *ctxt)
                | ((u64)reg_read(ctxt, VCPU_REGS_RDX) << 32);
        r = ctxt->ops->set_msr_with_filter(ctxt, msr_index, msr_data);
 
-       if (r == X86EMUL_IO_NEEDED)
-               return r;
-
-       if (r > 0)
+       if (r == X86EMUL_PROPAGATE_FAULT)
                return emulate_gp(ctxt, 0);
 
-       return r < 0 ? X86EMUL_UNHANDLEABLE : X86EMUL_CONTINUE;
+       return r;
 }
 
 static int em_rdmsr(struct x86_emulate_ctxt *ctxt)
@@ -3662,15 +3661,14 @@ static int em_rdmsr(struct x86_emulate_ctxt *ctxt)
 
        r = ctxt->ops->get_msr_with_filter(ctxt, msr_index, &msr_data);
 
-       if (r == X86EMUL_IO_NEEDED)
-               return r;
-
-       if (r)
+       if (r == X86EMUL_PROPAGATE_FAULT)
                return emulate_gp(ctxt, 0);
 
-       *reg_write(ctxt, VCPU_REGS_RAX) = (u32)msr_data;
-       *reg_write(ctxt, VCPU_REGS_RDX) = msr_data >> 32;
-       return X86EMUL_CONTINUE;
+       if (r == X86EMUL_CONTINUE) {
+               *reg_write(ctxt, VCPU_REGS_RAX) = (u32)msr_data;
+               *reg_write(ctxt, VCPU_REGS_RDX) = msr_data >> 32;
+       }
+       return r;
 }
 
 static int em_store_sreg(struct x86_emulate_ctxt *ctxt, int segment)
@@ -4171,8 +4169,7 @@ static int check_dr7_gd(struct x86_emulate_ctxt *ctxt)
 
        ctxt->ops->get_dr(ctxt, 7, &dr7);
 
-       /* Check if DR7.Global_Enable is set */
-       return dr7 & (1 << 13);
+       return dr7 & DR7_GD;
 }
 
 static int check_dr_read(struct x86_emulate_ctxt *ctxt)