From 9fd85dd9972d71f89447094fd9618b848a918c21 Mon Sep 17 00:00:00 2001 From: Avi Kivity Date: Fri, 5 Jan 2007 16:36:51 -0800 Subject: [PATCH] --- yaml --- r: 45279 b: refs/heads/master c: 32b35627355c3bf17e1903efd117efed7653a54e h: refs/heads/master i: 45277: d5832cbf904c855bb5d79d924f985018e5c96ac2 45275: d5fb481181143fdb4754377c9d0f28a0997df6a5 45271: f16267656d07f0debaa7a7692a85b3e8424324c1 45263: 13d95d30cf24c222bb7ef6e1ef3f1be7d7ee2d42 45247: 547849a28897a09824bd27b7d688123f27f3a7e9 v: v3 --- [refs] | 2 +- trunk/drivers/kvm/kvm_main.c | 27 +++++++++++++++++++++++++++ trunk/drivers/kvm/x86_emulate.c | 2 +- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 2ff9c4b17d72..8003bb310145 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3bb65a22a4502067f8cd3cb4c923ffa70be62091 +refs/heads/master: 32b35627355c3bf17e1903efd117efed7653a54e diff --git a/trunk/drivers/kvm/kvm_main.c b/trunk/drivers/kvm/kvm_main.c index cec10106ce77..2e6bc5659953 100644 --- a/trunk/drivers/kvm/kvm_main.c +++ b/trunk/drivers/kvm/kvm_main.c @@ -936,6 +936,30 @@ static int emulator_cmpxchg_emulated(unsigned long addr, return emulator_write_emulated(addr, new, bytes, ctxt); } +#ifdef CONFIG_X86_32 + +static int emulator_cmpxchg8b_emulated(unsigned long addr, + unsigned long old_lo, + unsigned long old_hi, + unsigned long new_lo, + unsigned long new_hi, + struct x86_emulate_ctxt *ctxt) +{ + static int reported; + int r; + + if (!reported) { + reported = 1; + printk(KERN_WARNING "kvm: emulating exchange8b as write\n"); + } + r = emulator_write_emulated(addr, new_lo, 4, ctxt); + if (r != X86EMUL_CONTINUE) + return r; + return emulator_write_emulated(addr+4, new_hi, 4, ctxt); +} + +#endif + static unsigned long get_segment_base(struct kvm_vcpu *vcpu, int seg) { return kvm_arch_ops->get_segment_base(vcpu, seg); @@ -1010,6 +1034,9 @@ struct x86_emulate_ops emulate_ops = { .read_emulated = emulator_read_emulated, .write_emulated = emulator_write_emulated, .cmpxchg_emulated = emulator_cmpxchg_emulated, +#ifdef CONFIG_X86_32 + .cmpxchg8b_emulated = emulator_cmpxchg8b_emulated, +#endif }; int emulate_instruction(struct kvm_vcpu *vcpu, diff --git a/trunk/drivers/kvm/x86_emulate.c b/trunk/drivers/kvm/x86_emulate.c index 1bff3e925fda..be70795b4822 100644 --- a/trunk/drivers/kvm/x86_emulate.c +++ b/trunk/drivers/kvm/x86_emulate.c @@ -1323,7 +1323,7 @@ x86_emulate_memop(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) ctxt)) != 0)) goto done; if ((old_lo != _regs[VCPU_REGS_RAX]) - || (old_hi != _regs[VCPU_REGS_RDI])) { + || (old_hi != _regs[VCPU_REGS_RDX])) { _regs[VCPU_REGS_RAX] = old_lo; _regs[VCPU_REGS_RDX] = old_hi; _eflags &= ~EFLG_ZF;