KVM: x86 emulator: Implement zero-extended immediate decoding
Absolute jumps use zero extended immediate operands. Cc: stable@kernel.org Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
@@ -60,6 +60,7 @@
|
|||||||
#define SrcImmByte (6<<4) /* 8-bit sign-extended immediate operand. */
|
#define SrcImmByte (6<<4) /* 8-bit sign-extended immediate operand. */
|
||||||
#define SrcOne (7<<4) /* Implied '1' */
|
#define SrcOne (7<<4) /* Implied '1' */
|
||||||
#define SrcImmUByte (8<<4) /* 8-bit unsigned immediate operand. */
|
#define SrcImmUByte (8<<4) /* 8-bit unsigned immediate operand. */
|
||||||
|
#define SrcImmU (9<<4) /* Immediate operand, unsigned */
|
||||||
#define SrcMask (0xf<<4)
|
#define SrcMask (0xf<<4)
|
||||||
/* Generic ModRM decode. */
|
/* Generic ModRM decode. */
|
||||||
#define ModRM (1<<8)
|
#define ModRM (1<<8)
|
||||||
@@ -1027,6 +1028,7 @@ done_prefixes:
|
|||||||
c->src.type = OP_MEM;
|
c->src.type = OP_MEM;
|
||||||
break;
|
break;
|
||||||
case SrcImm:
|
case SrcImm:
|
||||||
|
case SrcImmU:
|
||||||
c->src.type = OP_IMM;
|
c->src.type = OP_IMM;
|
||||||
c->src.ptr = (unsigned long *)c->eip;
|
c->src.ptr = (unsigned long *)c->eip;
|
||||||
c->src.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
|
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);
|
c->src.val = insn_fetch(s32, 4, c->eip);
|
||||||
break;
|
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;
|
break;
|
||||||
case SrcImmByte:
|
case SrcImmByte:
|
||||||
case SrcImmUByte:
|
case SrcImmUByte:
|
||||||
|
Reference in New Issue
Block a user