aboutsummaryrefslogtreecommitdiffstats
path: root/mm/vmalloc.c
diff options
context:
space:
mode:
authorKenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>2010-06-17 23:22:40 -0400
committerH. Peter Anvin <hpa@linux.intel.com>2010-07-09 14:42:03 -0400
commitffa71f33a820d1ab3f2fc5723819ac60fb76080b (patch)
treefb7fb08c43a773f771a49ac765e9330e07d32eef /mm/vmalloc.c
parentd7a0380dc3e6607d30ccdfc3cfc2ccee0d966716 (diff)
x86, ioremap: Fix incorrect physical address handling in PAE mode
Current x86 ioremap() doesn't handle physical address higher than 32-bit properly in X86_32 PAE mode. When physical address higher than 32-bit is passed to ioremap(), higher 32-bits in physical address is cleared wrongly. Due to this bug, ioremap() can map wrong address to linear address space. In my case, 64-bit MMIO region was assigned to a PCI device (ioat device) on my system. Because of the ioremap()'s bug, wrong physical address (instead of MMIO region) was mapped to linear address space. Because of this, loading ioatdma driver caused unexpected behavior (kernel panic, kernel hangup, ...). Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> LKML-Reference: <4C1AE680.7090408@jp.fujitsu.com> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Diffstat (limited to 'mm/vmalloc.c')
-rw-r--r--mm/vmalloc.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index ae007462b7f6..b7e314b1009f 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -2403,7 +2403,7 @@ static int s_show(struct seq_file *m, void *p)
2403 seq_printf(m, " pages=%d", v->nr_pages); 2403 seq_printf(m, " pages=%d", v->nr_pages);
2404 2404
2405 if (v->phys_addr) 2405 if (v->phys_addr)
2406 seq_printf(m, " phys=%lx", v->phys_addr); 2406 seq_printf(m, " phys=%llx", (unsigned long long)v->phys_addr);
2407 2407
2408 if (v->flags & VM_IOREMAP) 2408 if (v->flags & VM_IOREMAP)
2409 seq_printf(m, " ioremap"); 2409 seq_printf(m, " ioremap");