Commit ac08468867e99bc02b22baf4e58bc3537e9d852c

Authored by Grygorii Strashko
Committed by Russell King
1 parent cca547e9aa

ARM: 8253/1: mm: use phys_addr_t type in map_lowmem() for kernel mem region

Now local variables kernel_x_start and kernel_x_end defined using
'unsigned long' type which is wrong because they represent physical
memory range and will be calculated wrongly if LPAE is enabled.
As result, all following code in map_lowmem() will not work correctly.

For example, Keystone 2 boot is broken because
 kernel_x_start == 0x0000 0000
 kernel_x_end   == 0x0080 0000

instead of
 kernel_x_start == 0x0000 0008 0000 0000
 kernel_x_end   == 0x0000 0008 0080 0000
and as result whole low memory will be mapped with MT_MEMORY_RW
permissions by code (start > kernel_x_end):
		} else if (start >= kernel_x_end) {
			map.pfn = __phys_to_pfn(start);
			map.virtual = __phys_to_virt(start);
			map.length = end - start;
			map.type = MT_MEMORY_RW;

			create_mapping(&map);
		}

Hence, fix it by using phys_addr_t type for variables kernel_x_start
and kernel_x_end.

Tested-by: Murali Karicheri <m-karicheri2@ti.com>
Signed-off-by: Grygorii Strashko <grygorii.strashko@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>

Showing 1 changed file with 2 additions and 2 deletions Side-by-side Diff

... ... @@ -1329,8 +1329,8 @@
1329 1329 static void __init map_lowmem(void)
1330 1330 {
1331 1331 struct memblock_region *reg;
1332   - unsigned long kernel_x_start = round_down(__pa(_stext), SECTION_SIZE);
1333   - unsigned long kernel_x_end = round_up(__pa(__init_end), SECTION_SIZE);
  1332 + phys_addr_t kernel_x_start = round_down(__pa(_stext), SECTION_SIZE);
  1333 + phys_addr_t kernel_x_end = round_up(__pa(__init_end), SECTION_SIZE);
1334 1334  
1335 1335 /* Map all the lowmem memory banks. */
1336 1336 for_each_memblock(memory, reg) {