]> www.infradead.org Git - users/dwmw2/qemu.git/commitdiff
i386/xen: add monitor command to test upcall injection
authorJoao Martins <joao.m.martins@oracle.com>
Fri, 10 Aug 2018 19:20:54 +0000 (15:20 -0400)
committerJoao Martins <joao.m.martins@oracle.com>
Tue, 19 Feb 2019 14:00:57 +0000 (09:00 -0500)
Injects a spurious hypervisor callback into the guest at
all vcpus or a specified vcpu.

Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
hmp-commands.hx
monitor.c
target/i386/xen.c
target/i386/xen.h

index ba71558c25642fe627221bf7b141d58f03bcb155..3cf1bb7f9a7623f52bbea72ddebeda3ac7e35831 100644 (file)
@@ -1899,6 +1899,19 @@ ETEXI
         .flags      = "p",
     },
 
+STEXI
+@item xen-callback-inject
+Inject hypervisor callback interrupt
+ETEXI
+
+    {
+        .name       = "xen-callback-inject",
+        .args_type  = "vcpu:i?",
+        .params     = "[vcpu]",
+        .help       = "inject hypervisor callback",
+        .cmd        = hmp_xen_inject_callback,
+    },
+
 STEXI
 @end table
 ETEXI
index 33ccbf3957aa2f0856a0a57afee9bf477ae2b5c2..1aaac1925ad8cc1f66f0ab0c9fe44f591dfb92ee 100644 (file)
--- a/monitor.c
+++ b/monitor.c
 #include "hw/s390x/storage-attributes.h"
 #endif
 
+#if defined(TARGET_I386)
+#include "target/i386/xen.h"
+#endif
+
+
 /*
  * Supported types:
  *
index 90a0a52e029084c88b32ba24caecd2e7b48d74ea..f9d309709cc2e6073036b55820ae76e4d39a2e50 100644 (file)
 #include "xen.h"
 #include "trace.h"
 #include "sysemu/sysemu.h"
+#include "monitor/monitor.h"
+#include "qapi/qmp/qdict.h"
+#include "qom/cpu.h"
+
 
 #define __XEN_INTERFACE_VERSION__ 0x00040400
 
@@ -621,3 +625,28 @@ int kvm_xen_handle_exit(X86CPU *cpu, struct kvm_xen_exit *exit)
         return ret;
     }
 }
+
+static int kvm_xen_vcpu_inject_upcall(X86CPU *cpu)
+{
+    XenCPUState *xcpu = &cpu->env.xen_vcpu;
+    CPUState *cs = CPU(cpu);
+
+    return kvm_set_irq(cs->kvm_state, xcpu->cb.virq, 0);
+}
+
+void hmp_xen_inject_callback(Monitor *mon, const QDict *qdict)
+{
+    int injected = 0, idx = qdict_get_try_int(qdict, "vcpu", -1);
+    CPUState *cpu;
+
+    CPU_FOREACH(cpu) {
+        if (idx == -1 || cpu->cpu_index == idx) {
+            kvm_xen_vcpu_inject_upcall(X86_CPU(cpu));
+            injected++;
+        }
+    }
+
+    if (!injected) {
+        monitor_printf(mon, "failed to inject events to vcpu %d\n", idx);
+    }
+}
index 6e8129058ae56d1a530f189a284b99ac1e040b49..86f610f7f7d69f8b9dece75b7074a07f1df15826 100644 (file)
@@ -26,4 +26,5 @@ int kvm_xen_handle_exit(X86CPU *cpu, struct kvm_xen_exit *exit);
 
 void kvm_xen_init(XenState *xen);
 
+void hmp_xen_inject_callback(Monitor *mon, const QDict *qdict);
 #endif