• Nicolas Boichat's avatar
    of/fdt: Make sure no-map does not remove already reserved regions · 8a5a75e5
    Nicolas Boichat authored
    If the device tree is incorrectly configured, and attempts to
    define a "no-map" reserved memory that overlaps with the kernel
    data/code, the kernel would crash quickly after boot, with no
    obvious clue about the nature of the issue.
    
    For example, this would happen if we have the kernel mapped at
    these addresses (from /proc/iomem):
    40000000-41ffffff : System RAM
      40080000-40dfffff : Kernel code
      40e00000-411fffff : reserved
      41200000-413e0fff : Kernel data
    
    And we declare a no-map shared-dma-pool region at a fixed address
    within that range:
    mem_reserved: mem_region {
    	compatible = "shared-dma-pool";
    	reg = <0 0x40000000 0 0x01A00000>;
    	no-map;
    };
    
    To fix this, when removing memory regions at early boot (which is
    what "no-map" regions do), we need to make sure that the memory
    is not already reserved. If we do, __reserved_mem_reserve_reg
    will throw an error:
    [    0.000000] OF: fdt: Reserved memory: failed to reserve memory
       for node 'mem_region': base 0x0000000040000000, size 26 MiB
    and the code that will try to use the region should also fail,
    later on.
    
    We do not do anything for non-"no-map" regions, as memblock
    explicitly allows reserved regions to overlap, and the commit
    that this fixes removed the check for that precise reason.
    
    [ qperret: fixed conflicts caused by the usage of memblock_mark_nomap ]
    
    Fixes: 094cb981 ("of/fdt: memblock_reserve /memreserve/ regions in the case of partial overlap")
    Signed-off-by: default avatarNicolas Boichat <drinkcat@chromium.org>
    Reviewed-by: default avatarStephen Boyd <swboyd@chromium.org>
    Signed-off-by: default avatarQuentin Perret <qperret@google.com>
    Link: https://lore.kernel.org/r/20210115114544.1830068-3-qperret@google.comSigned-off-by: default avatarRob Herring <robh@kernel.org>
    8a5a75e5
fdt.c 31.7 KB