• Nicolas Pitre's avatar
    ARM: 8590/1: sanity_check_meminfo(): avoid overflow on vmalloc_limit · b9a01989
    Nicolas Pitre authored
    To limit the amount of mapped low memory, we determine a physical address
    boundary based on the start of the vmalloc area using __pa().
    Strictly speaking, the vmalloc area location is arbitrary and does not
    necessarily corresponds to a valid physical address. For example, if
    
    	PAGE_OFFSET = 0x80000000
    	PHYS_OFFSET = 0x90000000
    	vmalloc_min = 0xf0000000
    
    then __pa(vmalloc_min) overflows and returns a wrapped 0 when phys_addr_t
    is a 32-bit type. Then the code that follows determines that the entire
    physical memory is above that boundary and no low memory gets mapped at
    all:
    
    |[...]
    |Machine model: Freescale i.MX51 NA04 Board
    |Ignoring RAM at 0x90000000-0xb0000000 (!CONFIG_HIGHMEM)
    |Consider using a HIGHMEM enabled kernel.
    
    To avoid this problem let's make vmalloc_limit a 64-bit value all the
    time and determine that boundary explicitly without using __pa().
    Reported-by: default avatarEmil Renner Berthing <kernel@esmil.dk>
    Signed-off-by: default avatarNicolas Pitre <nico@linaro.org>
    Tested-by: default avatarEmil Renner Berthing <kernel@esmil.dk>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    b9a01989
mmu.c 44.6 KB