From: Jan Kiszka <[email protected]>

This registers the amd_iommu or vtd a unit with the core, depending on
the hypervisor CPU-vendor variant. We do not use a shutdown hook but
rather continue to rely on the explicitly called iommu_prepare_shutdown
hook because the iommu need to close prior to other units.

Signed-off-by: Jan Kiszka <[email protected]>
---
 hypervisor/arch/x86/Kbuild              |  2 +-
 hypervisor/arch/x86/amd_iommu.c         | 22 +++++++++-------------
 hypervisor/arch/x86/control.c           |  9 ---------
 hypervisor/arch/x86/include/asm/iommu.h |  6 ------
 hypervisor/arch/x86/mmio.c              |  3 +--
 hypervisor/arch/x86/setup.c             |  3 +--
 hypervisor/arch/x86/vtd.c               | 18 ++++++++++++------
 7 files changed, 24 insertions(+), 39 deletions(-)

diff --git a/hypervisor/arch/x86/Kbuild b/hypervisor/arch/x86/Kbuild
index 95d210d17..829e8f870 100644
--- a/hypervisor/arch/x86/Kbuild
+++ b/hypervisor/arch/x86/Kbuild
@@ -26,7 +26,7 @@ COMMON_OBJECTS := apic.o dbg-write.o entry.o setup.o 
control.o mmio.o iommu.o \
                  paging.o pci.o i8042.o vcpu.o vga.o ivshmem.o
 
 # units initialization order as defined by linking order:
-# ioapic, [cat], <generic units>
+# iommu, ioapic, [cat], <generic units>
 
 COMMON_OBJECTS += ioapic.o
 
diff --git a/hypervisor/arch/x86/amd_iommu.c b/hypervisor/arch/x86/amd_iommu.c
index bb0be22c1..c5441a7d8 100644
--- a/hypervisor/arch/x86/amd_iommu.c
+++ b/hypervisor/arch/x86/amd_iommu.c
@@ -22,6 +22,7 @@
 #include <jailhouse/pci.h>
 #include <jailhouse/printk.h>
 #include <jailhouse/string.h>
+#include <jailhouse/unit.h>
 #include <asm/amd_iommu.h>
 #include <asm/apic.h>
 #include <asm/iommu.h>
@@ -148,21 +149,12 @@ static struct amd_iommu {
 
 static unsigned int iommu_units_count;
 
-/*
- * Interrupt remapping is not emulated on AMD,
- * thus we have no MMIO to intercept.
- */
-unsigned int iommu_mmio_count_regions(struct cell *cell)
-{
-       return 0;
-}
-
 bool iommu_cell_emulates_ir(struct cell *cell)
 {
        return false;
 }
 
-int iommu_cell_init(struct cell *cell)
+static int amd_iommu_cell_init(struct cell *cell)
 {
        // HACK for QEMU
        if (iommu_units_count == 0)
@@ -386,7 +378,7 @@ void iommu_remove_pci_device(struct pci_device *device)
        amd_iommu_inv_dte(iommu, bdf);
 }
 
-void iommu_cell_exit(struct cell *cell)
+static void amd_iommu_cell_exit(struct cell *cell)
 {
 }
 
@@ -782,7 +774,7 @@ static void amd_iommu_enable_command_processing(struct 
amd_iommu *iommu)
        mmio_write64(iommu->mmio_base + AMD_CONTROL_REG, ctrl_reg);
 }
 
-int iommu_init(void)
+static int amd_iommu_init(void)
 {
        struct jailhouse_iommu *iommu;
        struct amd_iommu *entry;
@@ -822,7 +814,7 @@ int iommu_init(void)
                iommu_units_count++;
        }
 
-       return iommu_cell_init(&root_cell);
+       return amd_iommu_cell_init(&root_cell);
 }
 
 void iommu_prepare_shutdown(void)
@@ -838,3 +830,7 @@ void iommu_prepare_shutdown(void)
                mmio_write64(iommu->mmio_base + AMD_CONTROL_REG, ctrl_reg);
        }
 }
+
+DEFINE_UNIT_SHUTDOWN_STUB(amd_iommu);
+DEFINE_UNIT_MMIO_COUNT_REGIONS_STUB(amd_iommu);
+DEFINE_UNIT(amd_iommu, "AMD IOMMU");
diff --git a/hypervisor/arch/x86/control.c b/hypervisor/arch/x86/control.c
index 7cc489f09..e51cf52cb 100644
--- a/hypervisor/arch/x86/control.c
+++ b/hypervisor/arch/x86/control.c
@@ -40,10 +40,6 @@ int arch_cell_create(struct cell *cell)
        if (err)
                return err;
 
-       err = iommu_cell_init(cell);
-       if (err)
-               goto error_vm_exit;
-
        comm_region->pm_timer_address =
                system_config->platform_info.x86.pm_timer_address;
        comm_region->pci_mmconfig_base =
@@ -55,10 +51,6 @@ int arch_cell_create(struct cell *cell)
        comm_region->apic_khz = system_config->platform_info.x86.apic_khz;
 
        return 0;
-
-error_vm_exit:
-       vcpu_cell_exit(cell);
-       return err;
 }
 
 int arch_map_memory_region(struct cell *cell,
@@ -106,7 +98,6 @@ void arch_flush_cell_vcpu_caches(struct cell *cell)
 
 void arch_cell_destroy(struct cell *cell)
 {
-       iommu_cell_exit(cell);
        vcpu_cell_exit(cell);
 }
 
diff --git a/hypervisor/arch/x86/include/asm/iommu.h 
b/hypervisor/arch/x86/include/asm/iommu.h
index 24b3fceb2..523f8624f 100644
--- a/hypervisor/arch/x86/include/asm/iommu.h
+++ b/hypervisor/arch/x86/include/asm/iommu.h
@@ -24,11 +24,7 @@
 extern unsigned int fault_reporting_cpu_id;
 
 unsigned int iommu_count_units(void);
-unsigned int iommu_mmio_count_regions(struct cell *cell);
 
-int iommu_init(void);
-
-int iommu_cell_init(struct cell *cell);
 int iommu_map_memory_region(struct cell *cell,
                            const struct jailhouse_memory *mem);
 int iommu_unmap_memory_region(struct cell *cell,
@@ -45,8 +41,6 @@ int iommu_map_interrupt(struct cell *cell,
                        unsigned int vector,
                        struct apic_irq_message irq_msg);
 
-void iommu_cell_exit(struct cell *cell);
-
 void iommu_config_commit(struct cell *cell_added_removed);
 
 void iommu_prepare_shutdown(void);
diff --git a/hypervisor/arch/x86/mmio.c b/hypervisor/arch/x86/mmio.c
index c2c69be7a..2eccd2bfc 100644
--- a/hypervisor/arch/x86/mmio.c
+++ b/hypervisor/arch/x86/mmio.c
@@ -15,7 +15,6 @@
 #include <jailhouse/mmio.h>
 #include <jailhouse/paging.h>
 #include <jailhouse/printk.h>
-#include <asm/iommu.h>
 #include <asm/vcpu.h>
 
 #define X86_MAX_INST_LEN       15
@@ -223,5 +222,5 @@ error:
 
 unsigned int arch_mmio_count_regions(struct cell *cell)
 {
-       return iommu_mmio_count_regions(cell);
+       return 0;
 }
diff --git a/hypervisor/arch/x86/setup.c b/hypervisor/arch/x86/setup.c
index 1c3e6ca01..39328c405 100644
--- a/hypervisor/arch/x86/setup.c
+++ b/hypervisor/arch/x86/setup.c
@@ -18,7 +18,6 @@
 #include <jailhouse/processor.h>
 #include <asm/apic.h>
 #include <asm/bitops.h>
-#include <asm/iommu.h>
 #include <asm/vcpu.h>
 
 #define IDT_PRESENT_INT                0x00008e00
@@ -217,7 +216,7 @@ error_out:
 
 int arch_init_late(void)
 {
-       return iommu_init();
+       return 0;
 }
 
 void __attribute__((noreturn)) arch_cpu_activate_vmm(struct per_cpu *cpu_data)
diff --git a/hypervisor/arch/x86/vtd.c b/hypervisor/arch/x86/vtd.c
index cf9cb52b0..08e83e31e 100644
--- a/hypervisor/arch/x86/vtd.c
+++ b/hypervisor/arch/x86/vtd.c
@@ -19,6 +19,7 @@
 #include <jailhouse/pci.h>
 #include <jailhouse/printk.h>
 #include <jailhouse/string.h>
+#include <jailhouse/unit.h>
 #include <asm/apic.h>
 #include <asm/iommu.h>
 #include <asm/bitops.h>
@@ -204,7 +205,7 @@ static DEFINE_SPINLOCK(inv_queue_lock);
 static struct vtd_emulation root_cell_units[JAILHOUSE_MAX_IOMMU_UNITS];
 static bool dmar_units_initialized;
 
-unsigned int iommu_mmio_count_regions(struct cell *cell)
+static unsigned int vtd_mmio_count_regions(struct cell *cell)
 {
        return cell == &root_cell ? iommu_count_units() : 0;
 }
@@ -707,7 +708,9 @@ void iommu_remove_pci_device(struct pci_device *device)
        page_free(&mem_pool, context_entry_table, 1);
 }
 
-int iommu_cell_init(struct cell *cell)
+static void vtd_cell_exit(struct cell *cell);
+
+static int vtd_cell_init(struct cell *cell)
 {
        const struct jailhouse_irqchip *irqchip =
                jailhouse_cell_irqchips(cell->config);
@@ -730,7 +733,7 @@ int iommu_cell_init(struct cell *cell)
                        result = vtd_reserve_int_remap_region(irqchip->id,
                                                              ioapic->pins);
                if (result < 0) {
-                       iommu_cell_exit(cell);
+                       vtd_cell_exit(cell);
                        return result;
                }
        }
@@ -870,7 +873,7 @@ update_irte:
        return base_index + vector;
 }
 
-void iommu_cell_exit(struct cell *cell)
+static void vtd_cell_exit(struct cell *cell)
 {
        page_free(&mem_pool, cell->arch.vtd.pg_structs.root_table, 1);
 
@@ -981,7 +984,7 @@ static int vtd_init_ir_emulation(unsigned int unit_no, void 
*reg_base)
        return 0;
 }
 
-int iommu_init(void)
+static int vtd_init(void)
 {
        unsigned long version, caps, ecaps, ctrls, sllps_caps = ~0UL;
        unsigned int units, pt_levels, num_did, n;
@@ -1083,7 +1086,7 @@ int iommu_init(void)
        if (!(sllps_caps & VTD_CAP_SLLPS2M))
                vtd_paging[dmar_pt_levels - 2].page_size = 0;
 
-       return iommu_cell_init(&root_cell);
+       return vtd_cell_init(&root_cell);
 }
 
 void iommu_prepare_shutdown(void)
@@ -1106,3 +1109,6 @@ bool iommu_cell_emulates_ir(struct cell *cell)
 {
        return cell->arch.vtd.ir_emulation;
 }
+
+DEFINE_UNIT_SHUTDOWN_STUB(vtd);
+DEFINE_UNIT(vtd, "VT-d");
-- 
2.13.6

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to