• Andre Przywara's avatar
    fdt/wrappers: Replace fdtw_read_cells() implementation · ff4e6c35
    Andre Przywara authored
    Our fdtw_read_cells() implementation goes to great lengths to
    sanity-check every parameter and result, but leaves a big hole open:
    The size of the storage the value pointer points at needs to match the
    number of cells given. This can't be easily checked at compile time,
    since we lose the size information by using a void pointer.
    Regardless the current usage of this function is somewhat wrong anyways,
    since we use it on single-element, fixed-length properties only, for
    which the DT binding specifies the size.
    Typically we use those functions dealing with a number of cells in DT
    context to deal with *dynamically* sized properties, which depend on
    other properties (#size-cells, #clock-cells, ...), to specify the number
    of cells needed.
    
    Another problem with the current implementation is the use of
    ambiguously sized types (uintptr_t, size_t) together with a certain
    expectation about their size. In general there is no relation between
    the length of a DT property and the bitness of the code that parses the
    DTB: AArch64 code could encounter 32-bit addresses (where the physical
    address space is limited to 4GB [1]), while AArch32 code could read
    64-bit sized properties (/memory nodes on LPAE systems, [2]).
    
    To make this more clear, fix the potential issues and also align more
    with other DT users (Linux and U-Boot), introduce functions to explicitly
    read uint32 and uint64 properties. As the other DT consumers, we do this
    based on the generic "read array" function.
    Convert all users to use either of those two new functions, and make
    sure we never use a pointer to anything other than uint32_t or uint64_t
    variables directly.
    
    This reveals (and fixes) a bug in plat_spmd_manifest.c, where we write
    4 bytes into a uint16_t variable (passed via a void pointer).
    
    Also we change the implementation of the function to better align with
    other libfdt users, by using the right types (fdt32_t) and common
    variable names (*prop, prop_names).
    
    [1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi#n874
    [2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm/boot/dts/ecx-2000.dts
    
    
    
    Change-Id: I718de960515117ac7a3331a1b177d2ec224a3890
    Signed-off-by: default avatarAndre Przywara <andre.przywara@arm.com>
    ff4e6c35
plat_spmd_manifest.c 3.49 KB