diff options
author | Nadav Amit <namit@cs.technion.ac.il> | 2014-06-18 17:19:26 +0300 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2014-06-19 12:52:15 +0200 |
commit | 27e6fb5dae2819d17f38dc9224692b771e989981 (patch) | |
tree | a70eb57477af54459b6d97f9e34156eaf01ed6b2 /arch/x86/kvm/x86.h | |
parent | 1e32c07955b43e7f827174bf320ed35971117275 (diff) | |
download | linux-stable-27e6fb5dae2819d17f38dc9224692b771e989981.tar.gz linux-stable-27e6fb5dae2819d17f38dc9224692b771e989981.tar.bz2 linux-stable-27e6fb5dae2819d17f38dc9224692b771e989981.zip |
KVM: vmx: vmx instructions handling does not consider cs.l
VMX instructions use 32-bit operands in 32-bit mode, and 64-bit operands in
64-bit mode. The current implementation is broken since it does not use the
register operands correctly, and always uses 64-bit for reads and writes.
Moreover, write to memory in vmwrite only considers long-mode, so it ignores
cs.l. This patch fixes this behavior.
Signed-off-by: Nadav Amit <namit@cs.technion.ac.il>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'arch/x86/kvm/x86.h')
-rw-r--r-- | arch/x86/kvm/x86.h | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h index c5b61a7eb144..306a1b77581f 100644 --- a/arch/x86/kvm/x86.h +++ b/arch/x86/kvm/x86.h @@ -126,6 +126,15 @@ static inline unsigned long kvm_register_readl(struct kvm_vcpu *vcpu, return is_64_bit_mode(vcpu) ? val : (u32)val; } +static inline void kvm_register_writel(struct kvm_vcpu *vcpu, + enum kvm_reg reg, + unsigned long val) +{ + if (!is_64_bit_mode(vcpu)) + val = (u32)val; + return kvm_register_write(vcpu, reg, val); +} + void kvm_before_handle_nmi(struct kvm_vcpu *vcpu); void kvm_after_handle_nmi(struct kvm_vcpu *vcpu); int kvm_inject_realmode_interrupt(struct kvm_vcpu *vcpu, int irq, int inc_eip); |