[PATCH 2/2] iommu/rockchip: Reject unsupported physical addresses
Simon Xue <[email protected]>
| Newsgroups | org.infradead.lists.linux-arm-kernel,dev.linux.lists.iommu,org.infradead.lists.linux-rockchip,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
A paddr with bits above the range the hardware can address is silently truncated, pointing the device at the wrong page. Reject it using paddr_mask before writing any PTE. Signed-off-by: Simon Xue <[email protected]> --- drivers/iommu/rockchip-iommu.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c index 9a5aabb2b9c8..93dde18ce33d 100644 --- a/drivers/iommu/rockchip-iommu.c +++ b/drivers/iommu/rockchip-iommu.c @@ -794,6 +794,10 @@ static int rk_iommu_map_iova(struct rk_iommu_domain *rk_domain, u32 *pte_addr, assert_spin_locked(&rk_domain->dt_lock); + /* Reject addresses the hardware cannot support */ + if ((paddr + size - 1) & ~rk_domain->rk_ops->paddr_mask) + return -ERANGE; + for (pte_count = 0; pte_count < pte_total; pte_count++) { u32 pte = pte_addr[pte_count]; -- 2.34.1