From: Joao Martins Date: Fri, 10 Aug 2018 19:20:54 +0000 (-0400) Subject: i386/xen: add monitor command to test upcall injection X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=48be5632de138720fa16436b60ea86a9f404cd4a;p=users%2Fdwmw2%2Fqemu.git i386/xen: add monitor command to test upcall injection Injects a spurious hypervisor callback into the guest at all vcpus or a specified vcpu. Signed-off-by: Joao Martins --- diff --git a/hmp-commands.hx b/hmp-commands.hx index ba71558c25..3cf1bb7f9a 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -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 diff --git a/monitor.c b/monitor.c index 33ccbf3957..1aaac1925a 100644 --- a/monitor.c +++ b/monitor.c @@ -90,6 +90,11 @@ #include "hw/s390x/storage-attributes.h" #endif +#if defined(TARGET_I386) +#include "target/i386/xen.h" +#endif + + /* * Supported types: * diff --git a/target/i386/xen.c b/target/i386/xen.c index 90a0a52e02..f9d309709c 100644 --- a/target/i386/xen.c +++ b/target/i386/xen.c @@ -17,6 +17,10 @@ #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); + } +} diff --git a/target/i386/xen.h b/target/i386/xen.h index 6e8129058a..86f610f7f7 100644 --- a/target/i386/xen.h +++ b/target/i386/xen.h @@ -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