Pārlūkot izejas kodu

KVM: x86: Avoid emulating instructions on #UD mistakenly

Commit d40a6898e5 mistakenly caused instructions which are not marked as
EmulateOnUD to be emulated upon #UD exception. The commit caused the check of
whether the instruction flags include EmulateOnUD to never be evaluated. As a
result instructions whose emulation is broken may be emulated.  This fix moves
the evaluation of EmulateOnUD so it would be evaluated.

Signed-off-by: Nadav Amit <namit@cs.technion.ac.il>
[Tweak operand order in &&, remove EmulateOnUD where it's now superfluous.
 - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Nadav Amit 11 gadi atpakaļ
vecāks
revīzija
3a6095a017
1 mainītis faili ar 4 papildinājumiem un 4 dzēšanām
  1. 4 4
      arch/x86/kvm/emulate.c

+ 4 - 4
arch/x86/kvm/emulate.c

@@ -4394,8 +4394,11 @@ done_prefixes:
 
 
 	ctxt->execute = opcode.u.execute;
 	ctxt->execute = opcode.u.execute;
 
 
+	if (unlikely(ctxt->ud) && likely(!(ctxt->d & EmulateOnUD)))
+		return EMULATION_FAILED;
+
 	if (unlikely(ctxt->d &
 	if (unlikely(ctxt->d &
-		     (NotImpl|EmulateOnUD|Stack|Op3264|Sse|Mmx|Intercept|CheckPerm))) {
+		     (NotImpl|Stack|Op3264|Sse|Mmx|Intercept|CheckPerm))) {
 		/*
 		/*
 		 * These are copied unconditionally here, and checked unconditionally
 		 * These are copied unconditionally here, and checked unconditionally
 		 * in x86_emulate_insn.
 		 * in x86_emulate_insn.
@@ -4406,9 +4409,6 @@ done_prefixes:
 		if (ctxt->d & NotImpl)
 		if (ctxt->d & NotImpl)
 			return EMULATION_FAILED;
 			return EMULATION_FAILED;
 
 
-		if (!(ctxt->d & EmulateOnUD) && ctxt->ud)
-			return EMULATION_FAILED;
-
 		if (mode == X86EMUL_MODE_PROT64 && (ctxt->d & Stack))
 		if (mode == X86EMUL_MODE_PROT64 && (ctxt->d & Stack))
 			ctxt->op_bytes = 8;
 			ctxt->op_bytes = 8;