KVM: x86 emulator: Implement zero-extended immediate decoding
authorAvi Kivity <avi@redhat.com>
Mon, 18 May 2009 13:13:45 +0000 (16:13 +0300)
committerAvi Kivity <avi@redhat.com>
Thu, 10 Sep 2009 05:32:39 +0000 (08:32 +0300)
Absolute jumps use zero extended immediate operands.

Cc: stable@kernel.org
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/x86/kvm/x86_emulate.c

index 616de4628d60d4e8aea197284a637ceced25dd73..a30d5fc17eefd405fdea69d71dcc59fff692ab33 100644 (file)
@@ -60,6 +60,7 @@
 #define SrcImmByte  (6<<4)     /* 8-bit sign-extended immediate operand. */
 #define SrcOne      (7<<4)     /* Implied '1' */
 #define SrcImmUByte (8<<4)      /* 8-bit unsigned immediate operand. */
+#define SrcImmU     (9<<4)      /* Immediate operand, unsigned */
 #define SrcMask     (0xf<<4)
 /* Generic ModRM decode. */
 #define ModRM       (1<<8)
@@ -1027,6 +1028,7 @@ done_prefixes:
                c->src.type = OP_MEM;
                break;
        case SrcImm:
+       case SrcImmU:
                c->src.type = OP_IMM;
                c->src.ptr = (unsigned long *)c->eip;
                c->src.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
@@ -1044,6 +1046,19 @@ done_prefixes:
                        c->src.val = insn_fetch(s32, 4, c->eip);
                        break;
                }
+               if ((c->d & SrcMask) == SrcImmU) {
+                       switch (c->src.bytes) {
+                       case 1:
+                               c->src.val &= 0xff;
+                               break;
+                       case 2:
+                               c->src.val &= 0xffff;
+                               break;
+                       case 4:
+                               c->src.val &= 0xffffffff;
+                               break;
+                       }
+               }
                break;
        case SrcImmByte:
        case SrcImmUByte: