Commit 098c937b authored by Nitin A Kamble's avatar Nitin A Kamble Committed by Avi Kivity

KVM: x86 emulator: implement 'jmp rel' instruction (opcode 0xe9)

Signed-off-by: default avatarNitin A Kamble <nitin.a.kamble@intel.com>
Signed-off-by: default avatarAvi Kivity <avi@qumranet.com>
parent 19eb938e
...@@ -145,8 +145,10 @@ static u8 opcode_table[256] = { ...@@ -145,8 +145,10 @@ static u8 opcode_table[256] = {
0, 0, 0, 0, 0, 0, 0, 0,
/* 0xD8 - 0xDF */ /* 0xD8 - 0xDF */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0xE0 - 0xEF */ /* 0xE0 - 0xE7 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0xE8 - 0xEF */
0, SrcImm|ImplicitOps, 0, 0, 0, 0, 0, 0,
/* 0xF0 - 0xF7 */ /* 0xF0 - 0xF7 */
0, 0, 0, 0, 0, 0, 0, 0,
ImplicitOps, 0, ImplicitOps, 0,
...@@ -447,6 +449,12 @@ struct operand { ...@@ -447,6 +449,12 @@ struct operand {
(((reg) + _inc) & ((1UL << (ad_bytes << 3)) - 1)); \ (((reg) + _inc) & ((1UL << (ad_bytes << 3)) - 1)); \
} while (0) } while (0)
#define JMP_REL(rel) \
do { \
_eip += (int)(rel); \
_eip = ((op_bytes == 2) ? (uint16_t)_eip : (uint32_t)_eip); \
} while (0)
/* /*
* Given the 'reg' portion of a ModRM byte, and a register block, return a * Given the 'reg' portion of a ModRM byte, and a register block, return a
* pointer into the block that addresses the relevant register. * pointer into the block that addresses the relevant register.
...@@ -1023,6 +1031,10 @@ done_prefixes: ...@@ -1023,6 +1031,10 @@ done_prefixes:
case 0xd2 ... 0xd3: /* Grp2 */ case 0xd2 ... 0xd3: /* Grp2 */
src.val = _regs[VCPU_REGS_RCX]; src.val = _regs[VCPU_REGS_RCX];
goto grp2; goto grp2;
case 0xe9: /* jmp rel */
JMP_REL(src.val);
no_wb = 1; /* Disable writeback. */
break;
case 0xf6 ... 0xf7: /* Grp3 */ case 0xf6 ... 0xf7: /* Grp3 */
switch (modrm_reg) { switch (modrm_reg) {
case 0 ... 1: /* test */ case 0 ... 1: /* test */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment