Patchwork [2/3] kvm: handle internal error

login
register
mail settings
Submitter Marcelo Tosatti
Date March 9, 2010, 1:53 a.m.
Message ID <20100309015644.207517219@redhat.com>
Download mbox | patch
Permalink /patch/47145/
State New
Headers show

Comments

Marcelo Tosatti - March 9, 2010, 1:53 a.m.
Port qemu-kvm's KVM_EXIT_INTERNAL_ERROR handling to upstream.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Avi Kivity - March 11, 2010, 8:42 a.m.
On 03/09/2010 03:53 AM, Marcelo Tosatti wrote:
> Port qemu-kvm's KVM_EXIT_INTERNAL_ERROR handling to upstream.
>
> Signed-off-by: Marcelo Tosatti<mtosatti@redhat.com>
>
> Index: qemu-kvm/kvm-all.c
> ===================================================================
> --- qemu-kvm.orig/kvm-all.c
> +++ qemu-kvm/kvm-all.c
> @@ -721,6 +721,28 @@ static int kvm_handle_io(uint16_t port,
>       return 1;
>   }
>
> +#ifdef KVM_CAP_INTERNAL_ERROR_DATA
> +static void kvm_handle_internal_error(CPUState *env, struct kvm_run *run)
> +{
> +
> +    if (kvm_check_extension(kvm_state, KVM_CAP_INTERNAL_ERROR_DATA)) {
> +        int i;
> +
> +        fprintf(stderr, "KVM internal error. Suberror: %d\n",
> +                run->internal.suberror);
> +
> +        for (i = 0; i<  run->internal.ndata; ++i) {
> +            fprintf(stderr, "extra data[%d]: %"PRIx64"\n",
> +                    i, (uint64_t)run->internal.data[i]);
> +        }
> +    }
> +    cpu_dump_state(env, stderr, fprintf, 0);
> +    if (run->internal.suberror == KVM_INTERNAL_ERROR_EMULATION)
> +        fprintf(stderr, "emulation failure\n");
>    

{ braces }

> +    vm_stop(0);
> +}
> +#endif
>    

Should trigger a qmp message to let management know something went wrong 
(can come later).

Patch

Index: qemu-kvm/kvm-all.c
===================================================================
--- qemu-kvm.orig/kvm-all.c
+++ qemu-kvm/kvm-all.c
@@ -721,6 +721,28 @@  static int kvm_handle_io(uint16_t port, 
     return 1;
 }
 
+#ifdef KVM_CAP_INTERNAL_ERROR_DATA
+static void kvm_handle_internal_error(CPUState *env, struct kvm_run *run)
+{
+
+    if (kvm_check_extension(kvm_state, KVM_CAP_INTERNAL_ERROR_DATA)) {
+        int i;
+
+        fprintf(stderr, "KVM internal error. Suberror: %d\n",
+                run->internal.suberror);
+
+        for (i = 0; i < run->internal.ndata; ++i) {
+            fprintf(stderr, "extra data[%d]: %"PRIx64"\n",
+                    i, (uint64_t)run->internal.data[i]);
+        }
+    }
+    cpu_dump_state(env, stderr, fprintf, 0);
+    if (run->internal.suberror == KVM_INTERNAL_ERROR_EMULATION)
+        fprintf(stderr, "emulation failure\n");
+    vm_stop(0);
+}
+#endif
+
 void kvm_flush_coalesced_mmio_buffer(void)
 {
 #ifdef KVM_CAP_COALESCED_MMIO
@@ -836,6 +858,11 @@  int kvm_cpu_exec(CPUState *env)
         case KVM_EXIT_EXCEPTION:
             dprintf("kvm_exit_exception\n");
             break;
+#ifdef KVM_CAP_INTERNAL_ERROR_DATA
+        case KVM_EXIT_INTERNAL_ERROR:
+            kvm_handle_internal_error(env, run);
+            break;
+#endif
         case KVM_EXIT_DEBUG:
             dprintf("kvm_exit_debug\n");
 #ifdef KVM_CAP_SET_GUEST_DEBUG