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.
