.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
#include "hw/s390x/storage-attributes.h"
#endif
+#if defined(TARGET_I386)
+#include "target/i386/xen.h"
+#endif
+
+
/*
* Supported types:
*
#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
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);
+ }
+}