omap iommu: fix incorrect address for largepage 1st entry
authorHiroshi DOYU <Hiroshi.DOYU@nokia.com>
Mon, 15 Feb 2010 18:03:32 +0000 (10:03 -0800)
committerTony Lindgren <tony@atomide.com>
Mon, 15 Feb 2010 18:03:32 +0000 (10:03 -0800)
There was a potential risk that the following "memset" could override
its range if a given address was not the 1st entry of a
largepage. This is not the case for "iovmm".

Reported-by: Hari Nagalla <hnagalla@ti.com>
Signed-off-by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
Signed-off-by: Hari Nagalla <hnagalla@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/plat-omap/iommu.c

index e748119206682e70bcef49a96b99dea407bb099f..905ed832df569ad3c33a0fc7f482707def80e9b9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * omap iommu: tlb and pagetable primitives
  *
- * Copyright (C) 2008-2009 Nokia Corporation
+ * Copyright (C) 2008-2010 Nokia Corporation
  *
  * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com>,
  *             Paul Mundt and Toshihiro Kobayashi
@@ -646,7 +646,7 @@ static size_t iopgtable_clear_entry_core(struct iommu *obj, u32 da)
                if (*iopte & IOPTE_LARGE) {
                        nent *= 16;
                        /* rewind to the 1st entry */
-                       iopte = (u32 *)((u32)iopte & IOLARGE_MASK);
+                       iopte = iopte_offset(iopgd, (da & IOLARGE_MASK));
                }
                bytes *= nent;
                memset(iopte, 0, nent * sizeof(*iopte));