Merge remote-tracking branch 'lsk/v3.10/topic/arm64-insn' into linux-linaro-lsk
[firefly-linux-kernel-4.4.55.git] / drivers / iommu / intel-iommu.c
index fa004b112a89941509cfe855a0f55d7a44c963a3..6771e3c94801881520929b965a0bb897688819db 100644 (file)
@@ -782,7 +782,11 @@ static struct dma_pte *pfn_to_dma_pte(struct dmar_domain *domain,
        int offset;
 
        BUG_ON(!domain->pgd);
-       BUG_ON(addr_width < BITS_PER_LONG && pfn >> addr_width);
+
+       if (addr_width < BITS_PER_LONG && pfn >> addr_width)
+               /* Address beyond IOMMU's addressing capabilities. */
+               return NULL;
+
        parent = domain->pgd;
 
        while (level > 0) {
@@ -913,7 +917,7 @@ static void dma_pte_free_level(struct dmar_domain *domain, int level,
 
                /* If range covers entire pagetable, free it */
                if (!(start_pfn > level_pfn ||
-                     last_pfn < level_pfn + level_size(level))) {
+                     last_pfn < level_pfn + level_size(level) - 1)) {
                        dma_clear_pte(pte);
                        domain_flush_cache(domain, pte, sizeof(*pte));
                        free_pgtable_page(level_pte);