|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] dump_p2m_table: For IOMMU
>>> On 07.08.12 at 16:49, Santosh Jodh <santosh.jodh@xxxxxxxxxx> wrote:
> --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c Thu Aug 02 11:49:37
> 2012 +0200
> +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c Tue Aug 07 07:46:14
> 2012 -0700
> @@ -22,6 +22,7 @@
> #include <xen/pci.h>
> #include <xen/pci_regs.h>
> #include <xen/paging.h>
> +#include <xen/softirq.h>
> #include <asm/hvm/iommu.h>
> #include <asm/amd-iommu.h>
> #include <asm/hvm/svm/amd-iommu-proto.h>
> @@ -512,6 +513,69 @@ static int amd_iommu_group_id(u16 seg, u
>
> #include <asm/io_apic.h>
>
> +static void amd_dump_p2m_table_level(struct page_info* pg, int level, u64
> gpa)
> +{
> + u64 address;
> + void *table_vaddr, *pde;
> + u64 next_table_maddr;
> + int index, next_level, present;
> + u32 *entry;
> +
> + table_vaddr = __map_domain_page(pg);
> + if ( table_vaddr == NULL )
> + {
> + printk("Failed to map IOMMU domain page %-16lx\n",
> page_to_maddr(pg));
> + return;
> + }
> +
> + if ( level > 1 )
As long as the top level call below can never pass <= 1 here and
the recursive call gets gated accordingly, I don't see why you do
it differently here than for VT-d, resulting in both unnecessarily
deep indentation and a pointless map/unmap pair around the
conditional.
Jan
> + {
> + for ( index = 0; index < PTE_PER_TABLE_SIZE; index++ )
> + {
> + if ( !(index % 2) )
> + process_pending_softirqs();
> +
> + pde = table_vaddr + (index * IOMMU_PAGE_TABLE_ENTRY_SIZE);
> + next_table_maddr = amd_iommu_get_next_table_from_pte(pde);
> + entry = (u32*)pde;
> +
> + next_level = get_field_from_reg_u32(entry[0],
> + IOMMU_PDE_NEXT_LEVEL_MASK,
> + IOMMU_PDE_NEXT_LEVEL_SHIFT);
> +
> + present = get_field_from_reg_u32(entry[0],
> + IOMMU_PDE_PRESENT_MASK,
> + IOMMU_PDE_PRESENT_SHIFT);
> +
> + address = gpa + amd_offset_level_address(index, level);
> + if ( (next_table_maddr != 0) && (next_level != 0)
> + && present )
> + {
> + amd_dump_p2m_table_level(
> + maddr_to_page(next_table_maddr), level - 1, address);
> + }
> +
> + if ( present )
> + {
> + printk("gfn: %-16lx mfn: %-16lx\n",
> + address, next_table_maddr);
> + }
> + }
> + }
> +
> + unmap_domain_page(table_vaddr);
> +}
> +
> +static void amd_dump_p2m_table(struct domain *d)
> +{
> + struct hvm_iommu *hd = domain_hvm_iommu(d);
> +
> + if ( !hd->root_table )
> + return;
> +
> + amd_dump_p2m_table_level(hd->root_table, hd->paging_mode, 0);
> +}
> +
> const struct iommu_ops amd_iommu_ops = {
> .init = amd_iommu_domain_init,
> .dom0_init = amd_iommu_dom0_init,
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |