Commit 1161624f authored by Gleb Natapov's avatar Gleb Natapov Committed by Avi Kivity
Browse files

KVM: inject #UD in 64bit mode from instruction that are not valid there



Some instruction are obsolete in a long mode. Inject #UD.

Signed-off-by: default avatarGleb Natapov <gleb@redhat.com>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent 89a27f4d
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -1015,11 +1015,6 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
		}
	}

	if (mode == X86EMUL_MODE_PROT64 && (c->d & No64)) {
		kvm_report_emulation_failure(ctxt->vcpu, "invalid x86/64 instruction");
		return -1;
	}

	if (c->d & Group) {
		group = c->d & GroupMask;
		c->modrm = insn_fetch(u8, 1, c->eip);
@@ -1828,6 +1823,11 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
	memcpy(c->regs, ctxt->vcpu->arch.regs, sizeof c->regs);
	saved_eip = c->eip;

	if (ctxt->mode == X86EMUL_MODE_PROT64 && (c->d & No64)) {
		kvm_queue_exception(ctxt->vcpu, UD_VECTOR);
		goto done;
	}

	/* LOCK prefix is allowed only with some instructions */
	if (c->lock_prefix && !(c->d & Lock)) {
		kvm_queue_exception(ctxt->vcpu, UD_VECTOR);