diff --git a/hypervisor/arch/x86/vtd.c b/hypervisor/arch/x86/vtd.c index c12d48dc1..edea42a70 100644 --- a/hypervisor/arch/x86/vtd.c +++ b/hypervisor/arch/x86/vtd.c @@ -662,9 +662,18 @@ static void dmar_set_root_table(struct dmar_drhd_rt *dmar_uint) { uint64_t address; uint32_t status; + void *root_table_vaddr = NULL; spinlock_obtain(&(dmar_uint->lock)); + root_table_vaddr = alloc_paging_struct(); + + if (root_table_vaddr != NULL) { + dmar_uint->root_table_addr = hva2hpa(root_table_vaddr); + } else { + ASSERT(false, "failed to allocate root table!"); + } + /* Currently don't support extended root table */ address = dmar_uint->root_table_addr; @@ -976,16 +985,7 @@ static int add_iommu_device(struct iommu_domain *domain, uint16_t segment, return 1; } - if (dmar_uint->root_table_addr == 0UL) { - void *root_table_vaddr = alloc_paging_struct(); - - if (root_table_vaddr != NULL) { - dmar_uint->root_table_addr = hva2hpa(root_table_vaddr); - } else { - ASSERT(false, "failed to allocate root table!"); - return 1; - } - } + ASSERT(dmar_uint->root_table_addr != 0UL, "root table is not setup"); root_table = (struct dmar_root_entry *)hpa2hva(dmar_uint->root_table_addr); @@ -1280,6 +1280,8 @@ void init_iommu(void) spinlock_init(&domain_lock); register_hrhd_units(); + + enable_iommu(); } void init_iommu_vm0_domain(struct vm *vm0) @@ -1299,5 +1301,4 @@ void init_iommu_vm0_domain(struct vm *vm0) } } cache_flush_invalidate_all(); - enable_iommu(); }