Skip to content

Commit ac08468

Browse files
Grygorii StrashkoRussell King
authored andcommitted
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>
1 parent cca547e commit ac08468

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

arch/arm/mm/mmu.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1329,8 +1329,8 @@ static void __init kmap_init(void)
13291329
static void __init map_lowmem(void)
13301330
{
13311331
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);
13341334

13351335
/* Map all the lowmem memory banks. */
13361336
for_each_memblock(memory, reg) {

0 commit comments

Comments
 (0)