Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d2f62766 authored by Takuya Yoshikawa's avatar Takuya Yoshikawa Committed by Avi Kivity
Browse files

KVM: x86 emulator: Make jmp far emulation into a separate function



We introduce em_jmp_far().

We also call this from em_grp45() to stop treating modrm_reg == 5 case
separately in the group 5 emulation.

Signed-off-by: default avatarTakuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent 51187683
Loading
Loading
Loading
Loading
+22 −14
Original line number Original line Diff line number Diff line
@@ -1687,6 +1687,23 @@ static inline int emulate_iret(struct x86_emulate_ctxt *ctxt,
	}
	}
}
}


static int em_jmp_far(struct x86_emulate_ctxt *ctxt)
{
	struct decode_cache *c = &ctxt->decode;
	int rc;
	unsigned short sel;

	memcpy(&sel, c->src.valptr + c->op_bytes, 2);

	rc = load_segment_descriptor(ctxt, ctxt->ops, sel, VCPU_SREG_CS);
	if (rc != X86EMUL_CONTINUE)
		return rc;

	c->eip = 0;
	memcpy(&c->eip, c->src.valptr, c->op_bytes);
	return X86EMUL_CONTINUE;
}

static int em_grp1a(struct x86_emulate_ctxt *ctxt)
static int em_grp1a(struct x86_emulate_ctxt *ctxt)
{
{
	struct decode_cache *c = &ctxt->decode;
	struct decode_cache *c = &ctxt->decode;
@@ -1786,6 +1803,9 @@ static int em_grp45(struct x86_emulate_ctxt *ctxt)
	case 4: /* jmp abs */
	case 4: /* jmp abs */
		c->eip = c->src.val;
		c->eip = c->src.val;
		break;
		break;
	case 5: /* jmp far */
		rc = em_jmp_far(ctxt);
		break;
	case 6:	/* push */
	case 6:	/* push */
		rc = em_push(ctxt);
		rc = em_push(ctxt);
		break;
		break;
@@ -3997,19 +4017,9 @@ special_insn:
	}
	}
	case 0xe9: /* jmp rel */
	case 0xe9: /* jmp rel */
		goto jmp;
		goto jmp;
	case 0xea: { /* jmp far */
	case 0xea: /* jmp far */
		unsigned short sel;
		rc = em_jmp_far(ctxt);
	jump_far:
		memcpy(&sel, c->src.valptr + c->op_bytes, 2);

		rc = load_segment_descriptor(ctxt, ops, sel, VCPU_SREG_CS);
		if (rc != X86EMUL_CONTINUE)
			goto done;

		c->eip = 0;
		memcpy(&c->eip, c->src.valptr, c->op_bytes);
		break;
		break;
	}
	case 0xeb:
	case 0xeb:
	      jmp:		/* jmp rel short */
	      jmp:		/* jmp rel short */
		jmp_rel(c, c->src.val);
		jmp_rel(c, c->src.val);
@@ -4073,8 +4083,6 @@ special_insn:
		rc = em_grp45(ctxt);
		rc = em_grp45(ctxt);
		break;
		break;
	case 0xff: /* Grp5 */
	case 0xff: /* Grp5 */
		if (c->modrm_reg == 5)
			goto jump_far;
		rc = em_grp45(ctxt);
		rc = em_grp45(ctxt);
		break;
		break;
	default:
	default: