[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH v5 28/52] i386/xen: Add support for Xen event channel deliver
From: |
David Woodhouse |
Subject: |
[RFC PATCH v5 28/52] i386/xen: Add support for Xen event channel delivery to vCPU |
Date: |
Fri, 30 Dec 2022 12:12:11 +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.
Support for asserting the GSI/PCI_INTX callbacks will come later.
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 | 68 +++++++++++++++++++++++++++++++++++++++
2 files changed, 70 insertions(+)
diff --git a/include/sysemu/kvm_xen.h b/include/sysemu/kvm_xen.h
index 3e43cd7843..ee53294deb 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);
+void 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 87fcfc636c..11a6fe4164 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,72 @@ 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);
+}
+
+void 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;
+ }
+
+ 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;
+ }
+
+ 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);
+ break;
+ }
+}
+
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 v5 51/52] hw/xen: Add xen_xenstore device for xenstore emulation, (continued)
- [RFC PATCH v5 51/52] hw/xen: Add xen_xenstore device for xenstore emulation, David Woodhouse, 2022/12/30
- [RFC PATCH v5 03/52] xen: Add XEN_DISABLED mode and make it default, David Woodhouse, 2022/12/30
- [RFC PATCH v5 38/52] hw/xen: Implement EVTCHNOP_reset, David Woodhouse, 2022/12/30
- [RFC PATCH v5 29/52] hw/xen: Implement EVTCHNOP_status, David Woodhouse, 2022/12/30
- [RFC PATCH v5 30/52] hw/xen: Implement EVTCHNOP_close, David Woodhouse, 2022/12/30
- [RFC PATCH v5 15/52] i386/xen: add pc_machine_kvm_type to initialize XEN_EMULATE mode, David Woodhouse, 2022/12/30
- [RFC PATCH v5 12/52] i386/xen: implement HYPERVISOR_sched_op, SCHEDOP_shutdown, David Woodhouse, 2022/12/30
- [RFC PATCH v5 20/52] i386/xen: implement HYPERVISOR_vcpu_op, David Woodhouse, 2022/12/30
- [RFC PATCH v5 10/52] i386/xen: handle guest hypercalls, David Woodhouse, 2022/12/30
- [RFC PATCH v5 32/52] hw/xen: Implement EVTCHNOP_bind_virq, David Woodhouse, 2022/12/30
- [RFC PATCH v5 28/52] i386/xen: Add support for Xen event channel delivery to vCPU,
David Woodhouse <=
- [RFC PATCH v5 14/52] hw/xen: Add xen_overlay device for emulating shared xenheap pages, David Woodhouse, 2022/12/30
- [RFC PATCH v5 17/52] i386/xen: implement HYPERVISOR_memory_op, David Woodhouse, 2022/12/30
- [RFC PATCH v5 23/52] i386/xen: handle VCPUOP_register_runstate_memory_area, David Woodhouse, 2022/12/30
- [RFC PATCH v5 24/52] i386/xen: implement HYPERVISOR_event_channel_op, David Woodhouse, 2022/12/30
- [RFC PATCH v5 35/52] hw/xen: Implement EVTCHNOP_alloc_unbound, David Woodhouse, 2022/12/30
- [RFC PATCH v5 16/52] i386/xen: manage and save/restore Xen guest long_mode setting, David Woodhouse, 2022/12/30
- [RFC PATCH v5 26/52] i386/xen: implement HVMOP_set_param, David Woodhouse, 2022/12/30
- [RFC PATCH v5 41/52] hw/xen: Support HVM_PARAM_CALLBACK_TYPE_PCI_INTX callback, David Woodhouse, 2022/12/30
- [RFC PATCH v5 49/52] i386/xen: handle HVMOP_get_param, David Woodhouse, 2022/12/30
- [RFC PATCH v5 09/52] hw/xen_backend: refactor xen_be_init(), David Woodhouse, 2022/12/30