Revision 73aaec4a
b/kvm-all.c | ||
---|---|---|
815 | 815 |
} |
816 | 816 |
|
817 | 817 |
#ifdef KVM_CAP_INTERNAL_ERROR_DATA |
818 |
static void kvm_handle_internal_error(CPUState *env, struct kvm_run *run)
|
|
818 |
static int kvm_handle_internal_error(CPUState *env, struct kvm_run *run)
|
|
819 | 819 |
{ |
820 | 820 |
|
821 | 821 |
if (kvm_check_extension(kvm_state, KVM_CAP_INTERNAL_ERROR_DATA)) { |
... | ... | |
833 | 833 |
if (run->internal.suberror == KVM_INTERNAL_ERROR_EMULATION) { |
834 | 834 |
fprintf(stderr, "emulation failure\n"); |
835 | 835 |
if (!kvm_arch_stop_on_emulation_error(env)) { |
836 |
return; |
|
836 |
return 0;
|
|
837 | 837 |
} |
838 | 838 |
} |
839 | 839 |
/* FIXME: Should trigger a qmp message to let management know |
840 | 840 |
* something went wrong. |
841 | 841 |
*/ |
842 |
vm_stop(0);
|
|
842 |
return -1;
|
|
843 | 843 |
} |
844 | 844 |
#endif |
845 | 845 |
|
... | ... | |
967 | 967 |
break; |
968 | 968 |
case KVM_EXIT_UNKNOWN: |
969 | 969 |
DPRINTF("kvm_exit_unknown\n"); |
970 |
ret = -1; |
|
970 | 971 |
break; |
971 | 972 |
case KVM_EXIT_FAIL_ENTRY: |
972 | 973 |
DPRINTF("kvm_exit_fail_entry\n"); |
974 |
ret = -1; |
|
973 | 975 |
break; |
974 | 976 |
case KVM_EXIT_EXCEPTION: |
975 | 977 |
DPRINTF("kvm_exit_exception\n"); |
978 |
ret = -1; |
|
976 | 979 |
break; |
977 | 980 |
#ifdef KVM_CAP_INTERNAL_ERROR_DATA |
978 | 981 |
case KVM_EXIT_INTERNAL_ERROR: |
979 |
kvm_handle_internal_error(env, run); |
|
982 |
ret = kvm_handle_internal_error(env, run);
|
|
980 | 983 |
break; |
981 | 984 |
#endif |
982 | 985 |
case KVM_EXIT_DEBUG: |
... | ... | |
997 | 1000 |
} |
998 | 1001 |
} while (ret > 0); |
999 | 1002 |
|
1003 |
if (ret < 0) { |
|
1004 |
vm_stop(0); |
|
1005 |
env->exit_request = 1; |
|
1006 |
} |
|
1000 | 1007 |
if (env->exit_request) { |
1001 | 1008 |
env->exit_request = 0; |
1002 | 1009 |
env->exception_index = EXCP_INTERRUPT; |
b/target-i386/kvm.c | ||
---|---|---|
1537 | 1537 |
case KVM_EXIT_SET_TPR: |
1538 | 1538 |
ret = 1; |
1539 | 1539 |
break; |
1540 |
default: |
|
1541 |
fprintf(stderr, "KVM: unknown exit reason %d\n", run->exit_reason); |
|
1542 |
ret = -1; |
|
1543 |
break; |
|
1540 | 1544 |
} |
1541 | 1545 |
|
1542 | 1546 |
return ret; |
b/target-ppc/kvm.c | ||
---|---|---|
307 | 307 |
dprintf("handle halt\n"); |
308 | 308 |
ret = kvmppc_handle_halt(env); |
309 | 309 |
break; |
310 |
default: |
|
311 |
fprintf(stderr, "KVM: unknown exit reason %d\n", run->exit_reason); |
|
312 |
ret = -1; |
|
313 |
break; |
|
310 | 314 |
} |
311 | 315 |
|
312 | 316 |
return ret; |
Also available in: Unified diff