x86: Fix ioremap off by one BUG
authorAndi Kleen <ak@linux.intel.com>
Fri, 15 Aug 2008 16:12:47 +0000 (18:12 +0200)
committerAndi Kleen <ak@linux.intel.com>
Fri, 15 Aug 2008 16:18:38 +0000 (18:18 +0200)
commite213e87785559eaf3107897226817aea9291b06f
tree078999e27fd76b858b2e96f930e828913afe00f3
parentb635acec48bcaa9183fcbf4e3955616b0d4119b5
x86: Fix ioremap off by one BUG

Jean Delvare's machine triggered this BUG

acpi_os_map_memory phys ffff0000 size 65535
------------[ cut here ]------------
kernel BUG at arch/x86/mm/pat.c:233!

with ACPI in the backtrace.

Adding some debugging output showed that ACPI calls

acpi_os_map_memory phys ffff0000 size 65535

And ioremap/PAT does this check in 32bit, so addr+size wraps and the BUG
in reserve_memtype() triggers incorrectly.

        BUG_ON(start >= end); /* end is exclusive */

But reserve_memtype already uses u64:

int reserve_memtype(u64 start, u64 end,

so the 32bit truncation must happen in the caller. Presumably in ioremap
when it passes this information to reserve_memtype().

This patch does this computation in 64bit.

http://bugzilla.kernel.org/show_bug.cgi?id=11346

Signed-off-by: Andi Kleen <ak@linux.intel.com>
arch/x86/mm/ioremap.c