KVM: x86 emulator: switch LEA to use SrcMem decoding
authorAvi Kivity <avi@redhat.com>
Sun, 1 Aug 2010 12:13:22 +0000 (15:13 +0300)
committerAvi Kivity <avi@redhat.com>
Sun, 24 Oct 2010 08:50:38 +0000 (10:50 +0200)
The NoAccess flag will prevent memory from being accessed.

Signed-off-by: Avi Kivity <avi@redhat.com>
arch/x86/kvm/emulate.c

index 80efe76..b8aa667 100644 (file)
@@ -2153,7 +2153,7 @@ static struct opcode opcode_table[256] = {
        /* 0x88 - 0x8F */
        D(ByteOp | DstMem | SrcReg | ModRM | Mov), D(DstMem | SrcReg | ModRM | Mov),
        D(ByteOp | DstReg | SrcMem | ModRM | Mov), D(DstReg | SrcMem | ModRM | Mov),
-       D(DstMem | SrcNone | ModRM | Mov), D(ModRM | DstReg),
+       D(DstMem | SrcNone | ModRM | Mov), D(ModRM | SrcMem | NoAccess | DstReg),
        D(ImplicitOps | SrcMem16 | ModRM), G(0, group1A),
        /* 0x90 - 0x97 */
        X8(D(SrcAcc | DstReg)),
@@ -2895,7 +2895,7 @@ special_insn:
                c->dst.val = ops->get_segment_selector(c->modrm_reg, ctxt->vcpu);
                break;
        case 0x8d: /* lea r16/r32, m */
-               c->dst.val = c->modrm_ea;
+               c->dst.val = c->src.addr.mem;
                break;
        case 0x8e: { /* mov seg, r/m16 */
                uint16_t sel;