Browse Source

KVM: x86 emulator: Add call near absolute instruction (opcode 0xff/2)

Add call near absolute instruction.

Signed-off-by: Mohammed Gamal <m.gamal005@gmail.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
Mohammed Gamal 16 years ago
parent
commit
d19292e457
1 changed files with 10 additions and 1 deletions
  1. 10 1
      arch/x86/kvm/x86_emulate.c

+ 10 - 1
arch/x86/kvm/x86_emulate.c

@@ -286,7 +286,8 @@ static u16 group_table[] = {
 	ByteOp | DstMem | SrcNone | ModRM, ByteOp | DstMem | SrcNone | ModRM,
 	ByteOp | DstMem | SrcNone | ModRM, ByteOp | DstMem | SrcNone | ModRM,
 	0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0,
 	[Group5*8] =
 	[Group5*8] =
-	DstMem | SrcNone | ModRM, DstMem | SrcNone | ModRM, 0, 0,
+	DstMem | SrcNone | ModRM, DstMem | SrcNone | ModRM,
+	SrcMem | ModRM | Stack, 0,
 	SrcMem | ModRM, 0, SrcMem | ModRM | Stack, 0,
 	SrcMem | ModRM, 0, SrcMem | ModRM | Stack, 0,
 	[Group7*8] =
 	[Group7*8] =
 	0, 0, ModRM | SrcMem, ModRM | SrcMem,
 	0, 0, ModRM | SrcMem, ModRM | SrcMem,
@@ -1162,6 +1163,14 @@ static inline int emulate_grp45(struct x86_emulate_ctxt *ctxt,
 	case 1:	/* dec */
 	case 1:	/* dec */
 		emulate_1op("dec", c->dst, ctxt->eflags);
 		emulate_1op("dec", c->dst, ctxt->eflags);
 		break;
 		break;
+	case 2: /* call near abs */ {
+		long int old_eip;
+		old_eip = c->eip;
+		c->eip = c->src.val;
+		c->src.val = old_eip;
+		emulate_push(ctxt);
+		break;
+	}
 	case 4: /* jmp abs */
 	case 4: /* jmp abs */
 		c->eip = c->src.val;
 		c->eip = c->src.val;
 		break;
 		break;