diff options
Diffstat (limited to 'drivers/kvm/kvm_main.c')
-rw-r--r-- | drivers/kvm/kvm_main.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c index cec10106ce77..2e6bc5659953 100644 --- a/drivers/kvm/kvm_main.c +++ b/drivers/kvm/kvm_main.c | |||
@@ -936,6 +936,30 @@ static int emulator_cmpxchg_emulated(unsigned long addr, | |||
936 | return emulator_write_emulated(addr, new, bytes, ctxt); | 936 | return emulator_write_emulated(addr, new, bytes, ctxt); |
937 | } | 937 | } |
938 | 938 | ||
939 | #ifdef CONFIG_X86_32 | ||
940 | |||
941 | static int emulator_cmpxchg8b_emulated(unsigned long addr, | ||
942 | unsigned long old_lo, | ||
943 | unsigned long old_hi, | ||
944 | unsigned long new_lo, | ||
945 | unsigned long new_hi, | ||
946 | struct x86_emulate_ctxt *ctxt) | ||
947 | { | ||
948 | static int reported; | ||
949 | int r; | ||
950 | |||
951 | if (!reported) { | ||
952 | reported = 1; | ||
953 | printk(KERN_WARNING "kvm: emulating exchange8b as write\n"); | ||
954 | } | ||
955 | r = emulator_write_emulated(addr, new_lo, 4, ctxt); | ||
956 | if (r != X86EMUL_CONTINUE) | ||
957 | return r; | ||
958 | return emulator_write_emulated(addr+4, new_hi, 4, ctxt); | ||
959 | } | ||
960 | |||
961 | #endif | ||
962 | |||
939 | static unsigned long get_segment_base(struct kvm_vcpu *vcpu, int seg) | 963 | static unsigned long get_segment_base(struct kvm_vcpu *vcpu, int seg) |
940 | { | 964 | { |
941 | return kvm_arch_ops->get_segment_base(vcpu, seg); | 965 | return kvm_arch_ops->get_segment_base(vcpu, seg); |
@@ -1010,6 +1034,9 @@ struct x86_emulate_ops emulate_ops = { | |||
1010 | .read_emulated = emulator_read_emulated, | 1034 | .read_emulated = emulator_read_emulated, |
1011 | .write_emulated = emulator_write_emulated, | 1035 | .write_emulated = emulator_write_emulated, |
1012 | .cmpxchg_emulated = emulator_cmpxchg_emulated, | 1036 | .cmpxchg_emulated = emulator_cmpxchg_emulated, |
1037 | #ifdef CONFIG_X86_32 | ||
1038 | .cmpxchg8b_emulated = emulator_cmpxchg8b_emulated, | ||
1039 | #endif | ||
1013 | }; | 1040 | }; |
1014 | 1041 | ||
1015 | int emulate_instruction(struct kvm_vcpu *vcpu, | 1042 | int emulate_instruction(struct kvm_vcpu *vcpu, |