KVM: x86 emulator: implement 'jmp rel' instruction (opcode 0xe9)
Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
This commit is contained in:
parent
19eb938e01
commit
098c937ba3
1 changed files with 14 additions and 2 deletions
|
@ -145,8 +145,10 @@ static u8 opcode_table[256] = {
|
|||
0, 0, 0, 0,
|
||||
/* 0xD8 - 0xDF */
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
/* 0xE0 - 0xEF */
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
/* 0xE0 - 0xE7 */
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
/* 0xE8 - 0xEF */
|
||||
0, SrcImm|ImplicitOps, 0, 0, 0, 0, 0, 0,
|
||||
/* 0xF0 - 0xF7 */
|
||||
0, 0, 0, 0,
|
||||
ImplicitOps, 0,
|
||||
|
@ -447,6 +449,12 @@ struct operand {
|
|||
(((reg) + _inc) & ((1UL << (ad_bytes << 3)) - 1)); \
|
||||
} 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
|
||||
* pointer into the block that addresses the relevant register.
|
||||
|
@ -1023,6 +1031,10 @@ x86_emulate_memop(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
|
|||
case 0xd2 ... 0xd3: /* Grp2 */
|
||||
src.val = _regs[VCPU_REGS_RCX];
|
||||
goto grp2;
|
||||
case 0xe9: /* jmp rel */
|
||||
JMP_REL(src.val);
|
||||
no_wb = 1; /* Disable writeback. */
|
||||
break;
|
||||
case 0xf6 ... 0xf7: /* Grp3 */
|
||||
switch (modrm_reg) {
|
||||
case 0 ... 1: /* test */
|
||||
|
|
Loading…
Reference in a new issue