KVM: x86 emulator: Add decoding of 16bit second in memory argument
authorGleb Natapov <gleb@redhat.com>
Thu, 25 Feb 2010 14:36:42 +0000 (16:36 +0200)
committerAvi Kivity <avi@redhat.com>
Sun, 25 Apr 2010 10:53:42 +0000 (13:53 +0300)
Add decoding of Ep type of argument used by callf/jmpf.

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

index c9f604b0819cc3d87e19a4db2bf7d6c6b5d5f830..97a740368b307d2916c5064e12f06e5cbfcfde8d 100644 (file)
@@ -85,6 +85,9 @@
 #define Src2ImmByte (2<<29)
 #define Src2One     (3<<29)
 #define Src2Imm16   (4<<29)
+#define Src2Mem16   (5<<29) /* Used for Ep encoding. First argument has to be
+                              in memory and second argument is located
+                              immediately after the first one in memory. */
 #define Src2Mask    (7<<29)
 
 enum {
@@ -1163,6 +1166,10 @@ done_prefixes:
                c->src2.bytes = 1;
                c->src2.val = 1;
                break;
+       case Src2Mem16:
+               c->src2.bytes = 2;
+               c->src2.type = OP_MEM;
+               break;
        }
 
        /* Decode and fetch the destination operand: register or memory. */
@@ -1881,6 +1888,17 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
                c->src.orig_val = c->src.val;
        }
 
+       if (c->src2.type == OP_MEM) {
+               c->src2.ptr = (unsigned long *)(memop + c->src.bytes);
+               c->src2.val = 0;
+               rc = ops->read_emulated((unsigned long)c->src2.ptr,
+                                       &c->src2.val,
+                                       c->src2.bytes,
+                                       ctxt->vcpu);
+               if (rc != X86EMUL_CONTINUE)
+                       goto done;
+       }
+
        if ((c->d & DstMask) == ImplicitOps)
                goto special_insn;