[PATCH] arm: mm: fix lowmem virtual address range check

Wang Nan wangnan0 at huawei.com
Tue May 13 23:03:59 PDT 2014

This patch makes sure the argument of __phys_to_virt is a valid physical
address when clear lowmem memory maps.

The last few lines prepare_page_table() clear page mapping in the gap
between largest low physical memory and the upper bound of lowmem. It
uses __phys_to_virt(end) to calculate virtual address from where the
clearing start.

However, if the platform uses private nonliner __phys_to_virt(), 'end'
may goes into another mapping region.

This patch uses __phys_to_virt(end - 1) + 1 for insurance purposes.

Signed-off-by: Wang Nan <wangnan0 at huawei.com>
Cc: Geng Hui <hui.geng at huawei.com>
Cc: Will Deacon <will.deacon at arm.com>
 arch/arm/mm/mmu.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
index b68c6b2..87340ee 100644
--- a/arch/arm/mm/mmu.c
+++ b/arch/arm/mm/mmu.c
@@ -1217,7 +1217,7 @@ static inline void prepare_page_table(void)
 	 * Clear out all the kernel space mappings, except for the first
 	 * memory bank, up to the vmalloc region.
-	for (addr = __phys_to_virt(end);
+	for (addr = __phys_to_virt(end - 1) + 1;
 	     addr < VMALLOC_START; addr += PMD_SIZE)

More information about the linux-arm-kernel mailing list