[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH v4 28/47] i386/xen: Add support for Xen event channel deliver
From: |
David Woodhouse |
Subject: |
[RFC PATCH v4 28/47] i386/xen: Add support for Xen event channel delivery to vCPU |
Date: |
Wed, 21 Dec 2022 01:06:04 +0000 |
From: David Woodhouse <dwmw@amazon.co.uk>
The kvm_xen_inject_vcpu_callback_vector() function will either deliver
the per-vCPU local APIC vector (as an MSI), or just kick the vCPU out
of the kernel to trigger KVM's automatic delivery of the global vector.
In either of those cases, it returns true to indicate that the work is
done. For other methods it returns false as those would need to be
handled by the caller.
Also add kvm_xen_get_vcpu_info_hva() which returns the vcpu_info of
a given vCPU.
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
---
include/sysemu/kvm_xen.h | 2 ++
target/i386/kvm/xen-emu.c | 71 +++++++++++++++++++++++++++++++++++++++
2 files changed, 73 insertions(+)
diff --git a/include/sysemu/kvm_xen.h b/include/sysemu/kvm_xen.h
index 3e43cd7843..d975416f2e 100644
--- a/include/sysemu/kvm_xen.h
+++ b/include/sysemu/kvm_xen.h
@@ -17,6 +17,8 @@
#define INVALID_GFN UINT64_MAX
uint32_t kvm_xen_get_caps(void);
+void *kvm_xen_get_vcpu_info_hva(uint32_t vcpu_id);
+bool kvm_xen_inject_vcpu_callback_vector(uint32_t vcpu_id, int type);
#define kvm_xen_has_cap(cap) (!!(kvm_xen_get_caps() & \
KVM_XEN_HVM_CONFIG_ ## cap))
diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c
index 5932400e61..b01570535e 100644
--- a/target/i386/kvm/xen-emu.c
+++ b/target/i386/kvm/xen-emu.c
@@ -22,6 +22,8 @@
#include "trace.h"
#include "sysemu/runstate.h"
+#include "hw/pci/msi.h"
+#include "hw/i386/apic-msidef.h"
#include "hw/i386/kvm/xen_overlay.h"
#include "hw/i386/kvm/xen_evtchn.h"
@@ -274,6 +276,75 @@ static void do_set_vcpu_info_gpa(CPUState *cs,
run_on_cpu_data data)
env->xen_vcpu_info_gpa);
}
+static void *gpa_to_hva(uint64_t gpa)
+{
+ MemoryRegionSection mrs;
+
+ mrs = memory_region_find(get_system_memory(), gpa, 1);
+ return !mrs.mr ? NULL : qemu_map_ram_ptr(mrs.mr->ram_block,
+ mrs.offset_within_region);
+}
+
+void *kvm_xen_get_vcpu_info_hva(uint32_t vcpu_id)
+{
+ CPUState *cs = qemu_get_cpu(vcpu_id);
+ CPUX86State *env;
+ uint64_t gpa;
+
+ if (!cs) {
+ return NULL;
+ }
+ env = &X86_CPU(cs)->env;
+
+ gpa = env->xen_vcpu_info_gpa;
+ if (gpa == INVALID_GPA) {
+ gpa = env->xen_vcpu_info_default_gpa;
+ }
+ if (gpa == INVALID_GPA) {
+ return NULL;
+ }
+
+ return gpa_to_hva(gpa);
+}
+
+bool kvm_xen_inject_vcpu_callback_vector(uint32_t vcpu_id, int type)
+{
+ CPUState *cs = qemu_get_cpu(vcpu_id);
+ uint8_t vector;
+
+ if (!cs) {
+ return false;
+ }
+
+ vector = X86_CPU(cs)->env.xen_vcpu_callback_vector;
+ if (vector) {
+ /*
+ * The per-vCPU callback vector injected via lapic. Just
+ * deliver it as an MSI.
+ */
+ MSIMessage msg = {
+ .address = APIC_DEFAULT_ADDRESS | X86_CPU(cs)->apic_id,
+ .data = vector | (1UL << MSI_DATA_LEVEL_SHIFT),
+ };
+ kvm_irqchip_send_msi(kvm_state, msg);
+ return true;
+ }
+
+ switch (type) {
+ case HVM_PARAM_CALLBACK_TYPE_VECTOR:
+ /*
+ * If the evtchn_upcall_pending field in the vcpu_info is set, then
+ * KVM will automatically deliver the vector on entering the vCPU
+ * so all we have to do is kick it out.
+ */
+ qemu_cpu_kick(cs);
+ return true;
+ }
+
+ /* Not handled here. */
+ return false;
+}
+
static void do_set_vcpu_time_info_gpa(CPUState *cs, run_on_cpu_data data)
{
X86CPU *cpu = X86_CPU(cs);
--
2.35.3
- [RFC PATCH v4 25/47] i386/xen: implement HVMOP_set_evtchn_upcall_vector, (continued)
- [RFC PATCH v4 25/47] i386/xen: implement HVMOP_set_evtchn_upcall_vector, David Woodhouse, 2022/12/20
- [RFC PATCH v4 47/47] i386/xen: handle PV timer hypercalls, David Woodhouse, 2022/12/20
- [RFC PATCH v4 39/47] i386/xen: add monitor commands to test event injection, David Woodhouse, 2022/12/20
- [RFC PATCH v4 30/47] hw/xen: Implement EVTCHNOP_close, David Woodhouse, 2022/12/20
- [RFC PATCH v4 43/47] hw/xen: Add xen_gnttab device for grant table emulation, David Woodhouse, 2022/12/20
- [RFC PATCH v4 06/47] i386/hvm: Set Xen vCPU ID in KVM, David Woodhouse, 2022/12/20
- [RFC PATCH v4 36/47] hw/xen: Implement EVTCHNOP_bind_interdomain, David Woodhouse, 2022/12/20
- [RFC PATCH v4 07/47] xen-platform: exclude vfio-pci from the PCI platform unplug, David Woodhouse, 2022/12/20
- [RFC PATCH v4 10/47] i386/xen: handle guest hypercalls, David Woodhouse, 2022/12/20
- [RFC PATCH v4 42/47] kvm/i386: Add xen-gnttab-max-frames property, David Woodhouse, 2022/12/20
- [RFC PATCH v4 28/47] i386/xen: Add support for Xen event channel delivery to vCPU,
David Woodhouse <=
- [RFC PATCH v4 18/47] i386/xen: implement XENMEM_add_to_physmap_batch, David Woodhouse, 2022/12/20
- [RFC PATCH v4 09/47] hw/xen_backend: refactor xen_be_init(), David Woodhouse, 2022/12/20
- [RFC PATCH v4 04/47] i386/kvm: Add xen-version KVM accelerator property and init KVM Xen support, David Woodhouse, 2022/12/20
- [RFC PATCH v4 23/47] i386/xen: handle VCPUOP_register_runstate_memory_area, David Woodhouse, 2022/12/20
- [RFC PATCH v4 16/47] i386/xen: manage and save/restore Xen guest long_mode setting, David Woodhouse, 2022/12/20
- [RFC PATCH v4 26/47] i386/xen: implement HVMOP_set_param, David Woodhouse, 2022/12/20
- [RFC PATCH v4 17/47] i386/xen: implement HYPERVISOR_memory_op, David Woodhouse, 2022/12/20
- [RFC PATCH v4 08/47] xen-platform: allow its creation with XEN_EMULATE mode, David Woodhouse, 2022/12/20
- [RFC PATCH v4 32/47] hw/xen: Implement EVTCHNOP_bind_virq, David Woodhouse, 2022/12/20
- [RFC PATCH v4 29/47] hw/xen: Implement EVTCHNOP_status, David Woodhouse, 2022/12/20