diff -r 71d6d6f2ecd6 xen/drivers/passthrough/amd/iommu_map.c --- a/xen/drivers/passthrough/amd/iommu_map.c Fri Aug 07 09:54:43 2009 +0100 +++ b/xen/drivers/passthrough/amd/iommu_map.c Wed Aug 12 13:20:21 2009 +0200 @@ -426,7 +426,10 @@ static u64 iommu_l2e_from_pfn(struct pag { table = alloc_amd_iommu_pgtable(); if ( table == NULL ) + { + printk("AMD-Vi: Cannot allocate I/O page table\n"); return 0; + } next_table_maddr = page_to_maddr(table); amd_iommu_set_page_directory_entry( (u32 *)pde, next_table_maddr, level - 1); @@ -462,6 +465,7 @@ int amd_iommu_map_page(struct domain *d, { spin_unlock(&hd->mapping_lock); amd_iov_error("Invalid IO pagetable entry gfn = %lx\n", gfn); + domain_crash(d); return -EFAULT; } set_iommu_l1e_present(iommu_l2e, gfn, (u64)mfn << PAGE_SHIFT, iw, ir); @@ -494,6 +498,7 @@ int amd_iommu_unmap_page(struct domain * { spin_unlock(&hd->mapping_lock); amd_iov_error("Invalid IO pagetable entry gfn = %lx\n", gfn); + domain_crash(d); return -EFAULT; } @@ -535,6 +540,7 @@ int amd_iommu_reserve_domain_unity_map( spin_unlock(&hd->mapping_lock); amd_iov_error("Invalid IO pagetable entry phys_addr = %lx\n", phys_addr); + domain_crash(domain); return -EFAULT; } @@ -583,6 +589,7 @@ int amd_iommu_sync_p2m(struct domain *d) spin_unlock(&d->page_alloc_lock); spin_unlock(&hd->mapping_lock); amd_iov_error("Invalid IO pagetable entry gfn = %lx\n", gfn); + domain_crash(d); return -EFAULT; } diff -r 71d6d6f2ecd6 xen/include/asm-x86/hvm/svm/amd-iommu-proto.h --- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h Fri Aug 07 09:54:43 2009 +0100 +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h Wed Aug 12 13:20:21 2009 +0200 @@ -131,8 +131,10 @@ static inline struct page_info* alloc_am void *vaddr; pg = alloc_domheap_page(NULL, 0); + if ( pg == NULL ) + return 0; vaddr = map_domain_page(page_to_mfn(pg)); - if ( !vaddr ) + if ( vaddr == NULL ) return 0; memset(vaddr, 0, PAGE_SIZE); unmap_domain_page(vaddr);