>From cb019c68bea9955d553c3ef6946e3abed357f1c2 Mon Sep 17 00:00:00 2001 From: Izik Eidus Date: Wed, 23 Jan 2008 15:16:26 +0200 Subject: [PATCH] KVM: x86 emulator: fix decoding of registers to dst and src in case of instructions that declared as SrcMem or DstMem, right now for instructions that declared as SrcMem or DstMem we dont decode the registers for dst and src. Signed-off-by: Izik Eidus --- drivers/kvm/x86_emulate.c | 31 ++++++++++++++++++++++++++++++- 1 files changed, 30 insertions(+), 1 deletions(-) diff --git a/drivers/kvm/x86_emulate.c b/drivers/kvm/x86_emulate.c index bd46de6..c5251f4 100644 --- a/drivers/kvm/x86_emulate.c +++ b/drivers/kvm/x86_emulate.c @@ -830,7 +830,21 @@ done_prefixes: */ if ((d & ModRM) && modrm_mod == 3) { src.type = OP_REG; - break; + src.ptr = decode_register(modrm_reg, _regs, 0); + switch ((src.bytes = op_bytes)) { + case 1: + src.val = src.orig_val = *(u8 *) src.ptr; + break; + case 2: + src.val = src.orig_val = *(u16 *) src.ptr; + break; + case 4: + src.val = src.orig_val = *(u32 *) src.ptr; + break; + case 8: + src.val = src.orig_val = *(u64 *) src.ptr; + break; + } } src.type = OP_MEM; src.ptr = (unsigned long *)cr2; @@ -906,6 +920,21 @@ done_prefixes: */ if ((d & ModRM) && modrm_mod == 3) { dst.type = OP_REG; + dst.ptr = decode_register(modrm_reg, _regs, 0); + switch ((dst.bytes = op_bytes)) { + case 1: + dst.val = *(u8 *)dst.ptr; + break; + case 2: + dst.val = *(u16 *)dst.ptr; + break; + case 4: + dst.val = *(u32 *)dst.ptr; + break; + case 8: + dst.val = *(u64 *)dst.ptr; + break; + } break; } if (d & BitOp) { -- 1.5.3.6