summaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/emulate.c
diff options
context:
space:
mode:
authorNadav Amit2014-11-02 10:54:46 +0100
committerPaolo Bonzini2014-11-07 15:44:04 +0100
commitb5bbf10ee6b65b70c10c139822bc2dc077cefa76 (patch)
treea0a2290fb8abe5cf8feed46117a2876886bb4702 /arch/x86/kvm/emulate.c
parentKVM: x86: Breakpoints do not consider CS.base (diff)
downloadkernel-qcow2-linux-b5bbf10ee6b65b70c10c139822bc2dc077cefa76.tar.gz
kernel-qcow2-linux-b5bbf10ee6b65b70c10c139822bc2dc077cefa76.tar.xz
kernel-qcow2-linux-b5bbf10ee6b65b70c10c139822bc2dc077cefa76.zip
KVM: x86: Emulation of MOV-sreg to memory uses incorrect size
In x86, you can only MOV-sreg to memory with either 16-bits or 64-bits size. In contrast, KVM may write to 32-bits memory on MOV-sreg. This patch fixes KVM behavior, and sets the destination operand size to two, if the destination is memory. When destination is registers, and the operand size is 32-bits, the high 16-bits in modern CPUs is filled with zero. This is handled correctly. Signed-off-by: Nadav Amit <namit@cs.technion.ac.il> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'arch/x86/kvm/emulate.c')
-rw-r--r--arch/x86/kvm/emulate.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 736a49f218ff..713295d913fd 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -3207,6 +3207,8 @@ static int em_mov_rm_sreg(struct x86_emulate_ctxt *ctxt)
return emulate_ud(ctxt);
ctxt->dst.val = get_segment_selector(ctxt, ctxt->modrm_reg);
+ if (ctxt->dst.bytes == 4 && ctxt->dst.type == OP_MEM)
+ ctxt->dst.bytes = 2;
return X86EMUL_CONTINUE;
}