From 88fddcebf84c6c57c6a789bddeb0aaf41c1c9427 Mon Sep 17 00:00:00 2001
From: Nitin A Kamble <nitin.a.kamble@intel.com>
Date: Tue, 30 Oct 2007 19:41:03 -0800
Subject: [PATCH] Implement emulation of instruction
  jb (conditional jump)
  opcodes: 0xe3

Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
---
 drivers/kvm/x86_emulate.c |   25 ++++++++++++++++++++++++-
 1 files changed, 24 insertions(+), 1 deletions(-)

diff --git a/drivers/kvm/x86_emulate.c b/drivers/kvm/x86_emulate.c
index 579cfcf..1357355 100644
--- a/drivers/kvm/x86_emulate.c
+++ b/drivers/kvm/x86_emulate.c
@@ -165,7 +165,7 @@ static u16 opcode_table[256] = {
 	/* 0xD8 - 0xDF */
 	0, 0, 0, 0, 0, 0, 0, 0,
 	/* 0xE0 - 0xE7 */
-	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, ImplicitOps, 0, 0, 0, 0,
 	/* 0xE8 - 0xEF */
 	ImplicitOps, SrcImm|ImplicitOps, 0, SrcImmByte|ImplicitOps, 0, 0, 0, 0,
 	/* 0xF0 - 0xF7 */
@@ -1446,6 +1446,29 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
 		c->src.val = c->regs[VCPU_REGS_RCX];
 		emulate_grp2(ctxt);
 		break;
+	case 0xe3 : /* jb */ {
+		int rel = insn_fetch(s8, 1, c->eip);
+		int condition = 0;
+		if (test_cc(c->b, ctxt->eflags)) {
+			switch (c->op_bytes) {
+			case 2:
+				condition =
+					(0 == *(u16 *) &c->regs[VCPU_REGS_RCX]);
+				break;
+			case 4:
+				condition =
+					(0 == *(u32 *) &c->regs[VCPU_REGS_RCX]);
+				break;
+			case 8:
+				condition =
+					(0 == *(u64 *) &c->regs[VCPU_REGS_RCX]);
+				break;
+			}
+		}
+		if (condition)
+			JMP_REL(rel);
+		break;
+	}
 	case 0xf6 ... 0xf7:	/* Grp3 */
 		rc = emulate_grp3(ctxt, ops);
 		if (rc != 0)
-- 
1.5.2.2

