Do not stop VM if emulation failed in userspace.
PATCH 1/1 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 Gleb Natapov <[email protected]>
kvm-all.c +2 -0
@@ -786,6 +786,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.
kvm.h +1 -0
@@ -187,4 +187,5 @@ int kvm_set_irqfd(int gsi, int fd, bool assigned)#endif int kvm_set_ioeventfd_pio_word (int fd,uint16_t adr,uint16_t val,bool assign); +bool kvm_arch_stop_on_emulation_error (CPUState *env);#endif
target-i386/kvm.c +6 -0
@@ -1287,4 +1287,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 ); +} +#include "qemu-kvm-x86.c"
target-ppc/kvm.c +5 -0
@@ -321,3 +321,8 @@ uint32_t kvmppc_get_tbfreq(void) retval =atoi (ns);return retval; } + +bool kvm_arch_stop_on_emulation_error (CPUState *env) +{ +return true; +}
target-s390x/kvm.c +5 -0
@@ -480,3 +480,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; +}
--
Gleb.
Marcelo Tosatti
AppliedQuoted 5 lines · Gleb Natapov
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 Gleb Natapov <[email protected]>
Applied to uq/master, thanks.