diff options
author | Michael Jones <michael.jones@matrix-vision.de> | 2011-03-09 04:17:32 -0500 |
---|---|---|
committer | Tony Lindgren <tony@atomide.com> | 2011-03-14 12:17:07 -0400 |
commit | 4359d38d518c0dd72c03a3bc9918607ba8f2648a (patch) | |
tree | c201e8c56eaf003bc6c25f041c1e734d711d9e68 | |
parent | 42924355204bd83d799bd151211ae6e014982849 (diff) |
omap: iovmm: disallow mapping NULL address when IOVMF_DA_ANON is set
commit c7f4ab26e3bcdaeb3e19ec658e3ad9092f1a6ceb allowed mapping the NULL
address if da_start==0, which would then not get unmapped. Disallow
this again if IOVMF_DA_ANON is set. And spell variable 'alignment'
correctly.
Signed-off-by: Michael Jones <michael.jones@matrix-vision.de>
Signed-off-by: Tony Lindgren <tony@atomide.com>
-rw-r--r-- | arch/arm/plat-omap/iovmm.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/arch/arm/plat-omap/iovmm.c b/arch/arm/plat-omap/iovmm.c index 6dc1296c8c77..ea7eab98a736 100644 --- a/arch/arm/plat-omap/iovmm.c +++ b/arch/arm/plat-omap/iovmm.c | |||
@@ -271,20 +271,21 @@ static struct iovm_struct *alloc_iovm_area(struct iommu *obj, u32 da, | |||
271 | size_t bytes, u32 flags) | 271 | size_t bytes, u32 flags) |
272 | { | 272 | { |
273 | struct iovm_struct *new, *tmp; | 273 | struct iovm_struct *new, *tmp; |
274 | u32 start, prev_end, alignement; | 274 | u32 start, prev_end, alignment; |
275 | 275 | ||
276 | if (!obj || !bytes) | 276 | if (!obj || !bytes) |
277 | return ERR_PTR(-EINVAL); | 277 | return ERR_PTR(-EINVAL); |
278 | 278 | ||
279 | start = da; | 279 | start = da; |
280 | alignement = PAGE_SIZE; | 280 | alignment = PAGE_SIZE; |
281 | 281 | ||
282 | if (flags & IOVMF_DA_ANON) { | 282 | if (flags & IOVMF_DA_ANON) { |
283 | start = obj->da_start; | 283 | /* Don't map address 0 */ |
284 | start = obj->da_start ? obj->da_start : alignment; | ||
284 | 285 | ||
285 | if (flags & IOVMF_LINEAR) | 286 | if (flags & IOVMF_LINEAR) |
286 | alignement = iopgsz_max(bytes); | 287 | alignment = iopgsz_max(bytes); |
287 | start = roundup(start, alignement); | 288 | start = roundup(start, alignment); |
288 | } else if (start < obj->da_start || start > obj->da_end || | 289 | } else if (start < obj->da_start || start > obj->da_end || |
289 | obj->da_end - start < bytes) { | 290 | obj->da_end - start < bytes) { |
290 | return ERR_PTR(-EINVAL); | 291 | return ERR_PTR(-EINVAL); |
@@ -304,7 +305,7 @@ static struct iovm_struct *alloc_iovm_area(struct iommu *obj, u32 da, | |||
304 | goto found; | 305 | goto found; |
305 | 306 | ||
306 | if (tmp->da_end >= start && flags & IOVMF_DA_ANON) | 307 | if (tmp->da_end >= start && flags & IOVMF_DA_ANON) |
307 | start = roundup(tmp->da_end + 1, alignement); | 308 | start = roundup(tmp->da_end + 1, alignment); |
308 | 309 | ||
309 | prev_end = tmp->da_end; | 310 | prev_end = tmp->da_end; |
310 | } | 311 | } |