Commit 4513d923 authored by Gleb Natapov's avatar Gleb Natapov Committed by Marcelo Tosatti
Browse files

Do not stop VM if emulation failed in userspace.



Continue vcpu execution in case emulation failure happened while vcpu
was in userspace. In this case #UD will be injected into the guest
allowing guest OS to kill offending process and continue.

Signed-off-by: default avatarGleb Natapov <gleb@redhat.com>
Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
parent 0af691d7
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -764,6 +764,8 @@ static void kvm_handle_internal_error(CPUState *env, struct kvm_run *run)
    cpu_dump_state(env, stderr, fprintf, 0);
    if (run->internal.suberror == KVM_INTERNAL_ERROR_EMULATION) {
        fprintf(stderr, "emulation failure\n");
        if (!kvm_arch_stop_on_emulation_error(env))
		return;
    }
    /* FIXME: Should trigger a qmp message to let management know
     * something went wrong.
+2 −0
Original line number Diff line number Diff line
@@ -140,6 +140,8 @@ void kvm_arch_remove_all_hw_breakpoints(void);

void kvm_arch_update_guest_debug(CPUState *env, struct kvm_guest_debug *dbg);

bool kvm_arch_stop_on_emulation_error(CPUState *env);

int kvm_check_extension(KVMState *s, unsigned int extension);

uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function,
+7 −0
Original line number Diff line number Diff line
@@ -1289,3 +1289,10 @@ void kvm_arch_update_guest_debug(CPUState *env, struct kvm_guest_debug *dbg)
    }
}
#endif /* KVM_CAP_SET_GUEST_DEBUG */

bool kvm_arch_stop_on_emulation_error(CPUState *env)
{
      return !(env->cr[0] & CR0_PE_MASK) ||
              ((env->segs[R_CS].selector  & 3) != 3);
}
+5 −0
Original line number Diff line number Diff line
@@ -326,3 +326,8 @@ uint32_t kvmppc_get_tbfreq(void)
    retval = atoi(ns);
    return retval;
}

bool kvm_arch_stop_on_emulation_error(CPUState *env)
{
    return true;
}
+5 −0
Original line number Diff line number Diff line
@@ -485,3 +485,8 @@ int kvm_arch_handle_exit(CPUState *env, struct kvm_run *run)

    return ret;
}

bool kvm_arch_stop_on_emulation_error(CPUState *env)
{
    return true;
}