]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
KVM: x86 emulator: commit rflags as part of registers commit
authorGleb Natapov <gleb@redhat.com>
Sun, 21 Mar 2010 11:08:20 +0000 (13:08 +0200)
committerAvi Kivity <avi@redhat.com>
Mon, 17 May 2010 09:16:35 +0000 (12:16 +0300)
Make sure that rflags is committed only after successful instruction
emulation.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/x86/include/asm/kvm_emulate.h
arch/x86/kvm/emulate.c
arch/x86/kvm/x86.c

index b5e12c58386055c496c59c30882021b30ec42b2f..a1319c82050e83bd2787b962dff241c4332bfec4 100644 (file)
@@ -136,6 +136,7 @@ struct x86_emulate_ops {
        ulong (*get_cr)(int cr, struct kvm_vcpu *vcpu);
        void (*set_cr)(int cr, ulong val, struct kvm_vcpu *vcpu);
        int (*cpl)(struct kvm_vcpu *vcpu);
+       void (*set_rflags)(struct kvm_vcpu *vcpu, unsigned long rflags);
 };
 
 /* Type, address-of, and value of an instruction's operand. */
index ab3fff5bf7c467637bf53c34eac874d1ba627389..48de4b890055c2d0a353932c6f7715d7ec3c44d6 100644 (file)
@@ -2972,6 +2972,7 @@ writeback:
        /* Commit shadow register state. */
        memcpy(ctxt->vcpu->arch.regs, c->regs, sizeof c->regs);
        kvm_rip_write(ctxt->vcpu, c->eip);
+       ops->set_rflags(ctxt->vcpu, ctxt->eflags);
 
 done:
        return (rc == X86EMUL_UNHANDLEABLE) ? -1 : 0;
index b4d3363b78e63d3a021e16ecdc74b29a59386731..247e805a041e041b8f6e678ce9d7de4b6cdddec8 100644 (file)
@@ -3649,6 +3649,11 @@ static void emulator_set_segment_selector(u16 sel, int seg,
        kvm_set_segment(vcpu, &kvm_seg, seg);
 }
 
+static void emulator_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags)
+{
+       kvm_x86_ops->set_rflags(vcpu, rflags);
+}
+
 static struct x86_emulate_ops emulate_ops = {
        .read_std            = kvm_read_guest_virt_system,
        .write_std           = kvm_write_guest_virt_system,
@@ -3666,6 +3671,7 @@ static struct x86_emulate_ops emulate_ops = {
        .get_cr              = emulator_get_cr,
        .set_cr              = emulator_set_cr,
        .cpl                 = emulator_get_cpl,
+       .set_rflags          = emulator_set_rflags,
 };
 
 static void cache_all_regs(struct kvm_vcpu *vcpu)
@@ -3786,8 +3792,6 @@ restart:
                return EMULATE_DO_MMIO;
        }
 
-       kvm_x86_ops->set_rflags(vcpu, vcpu->arch.emulate_ctxt.eflags);
-
        if (vcpu->mmio_is_write) {
                vcpu->mmio_needed = 0;
                return EMULATE_DO_MMIO;