[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [RFC PATCH 15/23] X86/vioapic: Hook interrupt delivery of vIOAPIC



From: Chao Gao <chao.gao@xxxxxxxxx>

When irq remapping enabled, IOAPIC Redirection Entry maybe is in remapping
format. If that, generate a irq_remapping_request and send it to domain.

Signed-off-by: Chao Gao <chao.gao@xxxxxxxxx>
Signed-off-by: Lan Tianyu <tianyu.lan@xxxxxxxxx>
---
 xen/arch/x86/Makefile                  |  1 +
 xen/arch/x86/hvm/vioapic.c             | 10 ++++++++++
 xen/arch/x86/viommu.c                  | 30 ++++++++++++++++++++++++++++++
 xen/include/asm-x86/viommu.h           |  3 +++
 xen/include/public/arch-x86/hvm/save.h |  1 +
 5 files changed, 45 insertions(+)
 create mode 100644 xen/arch/x86/viommu.c

diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile
index f75eca0..d49f8c8 100644
--- a/xen/arch/x86/Makefile
+++ b/xen/arch/x86/Makefile
@@ -66,6 +66,7 @@ obj-y += usercopy.o
 obj-y += x86_emulate.o
 obj-$(CONFIG_TBOOT) += tboot.o
 obj-y += hpet.o
+obj-y += viommu.o
 obj-y += vm_event.o
 obj-y += xstate.o
 
diff --git a/xen/arch/x86/hvm/vioapic.c b/xen/arch/x86/hvm/vioapic.c
index fdbb21f..6a00644 100644
--- a/xen/arch/x86/hvm/vioapic.c
+++ b/xen/arch/x86/hvm/vioapic.c
@@ -30,6 +30,7 @@
 #include <xen/lib.h>
 #include <xen/errno.h>
 #include <xen/sched.h>
+#include <xen/viommu.h>
 #include <public/hvm/ioreq.h>
 #include <asm/hvm/io.h>
 #include <asm/hvm/vpic.h>
@@ -285,9 +286,18 @@ static void vioapic_deliver(struct hvm_hw_vioapic 
*vioapic, int irq)
     struct domain *d = vioapic_domain(vioapic);
     struct vlapic *target;
     struct vcpu *v;
+    struct irq_remapping_request request;
 
     ASSERT(spin_is_locked(&d->arch.hvm_domain.irq_lock));
 
+    if ( vioapic->redirtbl[irq].ir.format )
+    {
+        irq_request_ioapic_fill(&request, vioapic->id,
+                                vioapic->redirtbl[irq].bits);
+        viommu_handle_irq_request(d, &request);
+        return;
+    }
+
     HVM_DBG_LOG(DBG_LEVEL_IOAPIC,
                 "dest=%x dest_mode=%x delivery_mode=%x "
                 "vector=%x trig_mode=%x",
diff --git a/xen/arch/x86/viommu.c b/xen/arch/x86/viommu.c
new file mode 100644
index 0000000..ef78d3b
--- /dev/null
+++ b/xen/arch/x86/viommu.c
@@ -0,0 +1,30 @@
+/*
+ * viommu.c
+ *
+ * virtualize IOMMU.
+ *
+ * Copyright (C) 2017 Chao Gao, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms and conditions of the GNU General Public
+ * License, version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <xen/viommu.h>
+
+void irq_request_ioapic_fill(struct irq_remapping_request *req,
+                             uint32_t ioapic_id, uint64_t rte)
+{
+    ASSERT(req);
+    req->type = VIOMMU_REQUEST_IRQ_APIC;
+    req->source_id = ioapic_id;
+    req->msg.rte = rte;
+}
diff --git a/xen/include/asm-x86/viommu.h b/xen/include/asm-x86/viommu.h
index 0b25f34..fcf3c24 100644
--- a/xen/include/asm-x86/viommu.h
+++ b/xen/include/asm-x86/viommu.h
@@ -49,6 +49,9 @@ struct irq_remapping_request
     } msg;
 };
 
+void irq_request_ioapic_fill(struct irq_remapping_request *req,
+                             uint32_t ioapic_id, uint64_t rte);
+
 static inline const struct viommu_ops *viommu_get_ops(void)
 {
     /*
diff --git a/xen/include/public/arch-x86/hvm/save.h 
b/xen/include/public/arch-x86/hvm/save.h
index 6127f89..06be4a5 100644
--- a/xen/include/public/arch-x86/hvm/save.h
+++ b/xen/include/public/arch-x86/hvm/save.h
@@ -401,6 +401,7 @@ struct hvm_hw_vioapic {
             uint8_t reserved[4];
             uint8_t dest_id;
         } fields;
+        struct ir_ioapic_rte ir;
     } redirtbl[VIOAPIC_NUM_PINS];
 };
 
-- 
1.8.3.1


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.