commit c481bc1108ebf293b7ea23c478378f360ef51758 Author: Izik Eidus Date: Wed Jan 23 15:16:26 2008 +0200 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 diff --git a/drivers/kvm/x86_emulate.c b/drivers/kvm/x86_emulate.c index bd46de6..1764afe 100644 --- a/drivers/kvm/x86_emulate.c +++ b/drivers/kvm/x86_emulate.c @@ -830,6 +830,21 @@ done_prefixes: */ if ((d & ModRM) && modrm_mod == 3) { src.type = OP_REG; + 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; + } break; } src.type = OP_MEM; @@ -906,6 +921,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) {