|
@@ -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,
|