diff options
author | David Woodhouse <David.Woodhouse@intel.com> | 2009-06-27 14:00:32 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2009-06-29 07:38:42 -0400 |
commit | 66eae8469e4e4ba6f4ca7ef82103c78f6d645583 (patch) | |
tree | adb12962ecead5e169265aaefdf7c4472609a504 /drivers/pci | |
parent | a75f7cf94f01717c5103138319b96752ee2a2be9 (diff) |
intel-iommu: Don't just mask out too-big physical addresses; BUG() instead
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/intel-iommu.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index 40eae2097aca..ad367f53a2bb 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c | |||
@@ -700,8 +700,7 @@ static struct dma_pte * addr_to_dma_pte(struct dmar_domain *domain, u64 addr) | |||
700 | unsigned long flags; | 700 | unsigned long flags; |
701 | 701 | ||
702 | BUG_ON(!domain->pgd); | 702 | BUG_ON(!domain->pgd); |
703 | 703 | BUG_ON(addr >> addr_width); | |
704 | addr &= (((u64)1) << addr_width) - 1; | ||
705 | parent = domain->pgd; | 704 | parent = domain->pgd; |
706 | 705 | ||
707 | spin_lock_irqsave(&domain->mapping_lock, flags); | 706 | spin_lock_irqsave(&domain->mapping_lock, flags); |
@@ -783,8 +782,9 @@ static void dma_pte_clear_range(struct dmar_domain *domain, u64 start, u64 end) | |||
783 | int addr_width = agaw_to_width(domain->agaw); | 782 | int addr_width = agaw_to_width(domain->agaw); |
784 | int npages; | 783 | int npages; |
785 | 784 | ||
786 | start &= (((u64)1) << addr_width) - 1; | 785 | BUG_ON(start >> addr_width); |
787 | end &= (((u64)1) << addr_width) - 1; | 786 | BUG_ON((end-1) >> addr_width); |
787 | |||
788 | /* in case it's partial page */ | 788 | /* in case it's partial page */ |
789 | start &= PAGE_MASK; | 789 | start &= PAGE_MASK; |
790 | end = PAGE_ALIGN(end); | 790 | end = PAGE_ALIGN(end); |
@@ -807,8 +807,8 @@ static void dma_pte_free_pagetable(struct dmar_domain *domain, | |||
807 | int level; | 807 | int level; |
808 | u64 tmp; | 808 | u64 tmp; |
809 | 809 | ||
810 | start &= (((u64)1) << addr_width) - 1; | 810 | BUG_ON(start >> addr_width); |
811 | end &= (((u64)1) << addr_width) - 1; | 811 | BUG_ON(end >> addr_width); |
812 | 812 | ||
813 | /* we don't need lock here, nobody else touches the iova range */ | 813 | /* we don't need lock here, nobody else touches the iova range */ |
814 | level = 2; | 814 | level = 2; |
@@ -1654,7 +1654,7 @@ domain_page_mapping(struct dmar_domain *domain, dma_addr_t iova, | |||
1654 | int index; | 1654 | int index; |
1655 | int addr_width = agaw_to_width(domain->agaw); | 1655 | int addr_width = agaw_to_width(domain->agaw); |
1656 | 1656 | ||
1657 | hpa &= (((u64)1) << addr_width) - 1; | 1657 | BUG_ON(hpa >> addr_width); |
1658 | 1658 | ||
1659 | if ((prot & (DMA_PTE_READ|DMA_PTE_WRITE)) == 0) | 1659 | if ((prot & (DMA_PTE_READ|DMA_PTE_WRITE)) == 0) |
1660 | return -EINVAL; | 1660 | return -EINVAL; |