return gmfn & LEVEL_MASK;
}
-void print_vtd_entries(
- struct domain *d,
- struct iommu *iommu,
- int bus, int devfn,
- unsigned long gmfn)
+void print_vtd_entries(struct iommu *iommu, int bus, int devfn, u64 gmfn)
{
- struct hvm_iommu *hd = domain_hvm_iommu(d);
- struct acpi_drhd_unit *drhd;
struct context_entry *ctxt_entry;
struct root_entry *root_entry;
struct dma_pte pte;
u64 *l;
- u32 l_index;
- u32 i = 0;
- int level = agaw_to_level(hd->agaw);
+ u32 l_index, level;
- printk("print_vtd_entries: domain_id = %x bdf = %x:%x:%x gmfn = %lx\n",
- d->domain_id, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), gmfn);
+ printk("print_vtd_entries: iommu = %p bdf = %x:%x:%x gmfn = %"PRIx64"\n",
+ iommu, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), gmfn);
- if ( hd->pgd_maddr == 0 )
+ if ( iommu->root_maddr == 0 )
{
- printk(" hd->pgd_maddr == 0\n");
+ printk(" iommu->root_maddr = 0\n");
return;
}
- printk(" hd->pgd_maddr = %"PRIx64"\n", hd->pgd_maddr);
- for_each_drhd_unit ( drhd )
+ root_entry = (struct root_entry *)map_vtd_domain_page(iommu->root_maddr);
+
+ printk(" root_entry = %p\n", root_entry);
+ printk(" root_entry[%x] = %"PRIx64"\n", bus, root_entry[bus].val);
+ if ( !root_present(root_entry[bus]) )
{
- printk("---- print_vtd_entries %d ----\n", i++);
+ unmap_vtd_domain_page(root_entry);
+ printk(" root_entry[%x] not present\n", bus);
+ return;
+ }
- if ( iommu->root_maddr == 0 )
- {
- printk(" iommu->root_maddr = 0\n");
- continue;
- }
+ ctxt_entry =
+ (struct context_entry *)map_vtd_domain_page(root_entry[bus].val);
+ if ( ctxt_entry == NULL )
+ {
+ unmap_vtd_domain_page(root_entry);
+ printk(" ctxt_entry == NULL\n");
+ return;
+ }
- root_entry =
- (struct root_entry *)map_vtd_domain_page(iommu->root_maddr);
-
- printk(" root_entry = %p\n", root_entry);
- printk(" root_entry[%x] = %"PRIx64"\n", bus, root_entry[bus].val);
- if ( !root_present(root_entry[bus]) )
- {
- unmap_vtd_domain_page(root_entry);
- printk(" root_entry[%x] not present\n", bus);
- continue;
- }
+ printk(" context = %p\n", ctxt_entry);
+ printk(" context[%x] = %"PRIx64"_%"PRIx64"\n",
+ devfn, ctxt_entry[devfn].hi, ctxt_entry[devfn].lo);
+ if ( !context_present(ctxt_entry[devfn]) )
+ {
+ unmap_vtd_domain_page(ctxt_entry);
+ unmap_vtd_domain_page(root_entry);
+ printk(" ctxt_entry[%x] not present\n", devfn);
+ return;
+ }
- ctxt_entry =
- (struct context_entry *)map_vtd_domain_page(root_entry[bus].val);
- if ( ctxt_entry == NULL )
- {
- unmap_vtd_domain_page(root_entry);
- printk(" ctxt_entry == NULL\n");
- continue;
- }
+ level = agaw_to_level(context_address_width(ctxt_entry[devfn]));
+ if ( level != VTD_PAGE_TABLE_LEVEL_3 &&
+ level != VTD_PAGE_TABLE_LEVEL_4)
+ {
+ unmap_vtd_domain_page(ctxt_entry);
+ unmap_vtd_domain_page(root_entry);
+ printk("Unsupported VTD page table level (%d)!\n", level);
+ }
- printk(" context = %p\n", ctxt_entry);
- printk(" context[%x] = %"PRIx64" %"PRIx64"\n",
- devfn, ctxt_entry[devfn].hi, ctxt_entry[devfn].lo);
- if ( !context_present(ctxt_entry[devfn]) )
+ l = maddr_to_virt(ctxt_entry[devfn].lo);
+ do
+ {
+ l = (u64*)(((unsigned long)l >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K);
+ printk(" l%d = %p\n", level, l);
+ if ( l == NULL )
{
unmap_vtd_domain_page(ctxt_entry);
unmap_vtd_domain_page(root_entry);
- printk(" ctxt_entry[%x] not present\n", devfn);
- continue;
+ printk(" l%d == NULL\n", level);
+ break;
}
+ l_index = get_level_index(gmfn, level);
+ printk(" l%d_index = %x\n", level, l_index);
+ printk(" l%d[%x] = %"PRIx64"\n", level, l_index, l[l_index]);
- if ( level != VTD_PAGE_TABLE_LEVEL_3 &&
- level != VTD_PAGE_TABLE_LEVEL_4)
+ pte.val = l[l_index];
+ if ( !dma_pte_present(pte) )
{
unmap_vtd_domain_page(ctxt_entry);
unmap_vtd_domain_page(root_entry);
- printk("Unsupported VTD page table level (%d)!\n", level);
- continue;
+ printk(" l%d[%x] not present\n", level, l_index);
+ break;
}
- l = maddr_to_virt(ctxt_entry[devfn].lo);
- do
- {
- l = (u64*)(((unsigned long)l >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K);
- printk(" l%d = %p\n", level, l);
- if ( l == NULL )
- {
- unmap_vtd_domain_page(ctxt_entry);
- unmap_vtd_domain_page(root_entry);
- printk(" l%d == NULL\n", level);
- break;
- }
- l_index = get_level_index(gmfn, level);
- printk(" l%d_index = %x\n", level, l_index);
- printk(" l%d[%x] = %"PRIx64"\n", level, l_index, l[l_index]);
-
- pte.val = l[l_index];
- if ( !dma_pte_present(pte) )
- {
- unmap_vtd_domain_page(ctxt_entry);
- unmap_vtd_domain_page(root_entry);
- printk(" l%d[%x] not present\n", level, l_index);
- break;
- }
-
- l = maddr_to_virt(l[l_index]);
- } while ( --level );
- }
+ l = maddr_to_virt(l[l_index]);
+ } while ( --level );
}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */