Re: [PATCH] libfdt: Add FDT alignment check to fdt_check_header()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



Hi Rob,

On Wed, 7 Apr 2021 at 07:07, Rob Herring <robh@xxxxxxxxxx> wrote:
>
> Only checking the FDT alignment in fdt_ro_probe_() means that
> fdt_check_header() can pass, but then subsequent API calls fail on
> alignment checks. Let's add an alignment check to fdt_check_header() so
> alignment errors are found up front.
>
> Cc: Tom Rini <trini@xxxxxxxxxxxx>
> Cc: Frank Rowand <frowand.list@xxxxxxxxx>
> Signed-off-by: Rob Herring <robh@xxxxxxxxxx>
> ---
> For background, the new alignment check triggered a crash in the
> linux kernel. Yes, we should fix the error handling, but
> fdt_check_header() shouldn't tell us the FDT is valid only to fail
> later on.
>
> Maybe we should move the check instead, but fdt_ro_probe_() and
> fdt_check_header() already have a lot of the same checks.
>
>  libfdt/fdt.c | 4 ++++
>  1 file changed, 4 insertions(+)

At present U-Boot uses a 4-byte alignment, so far as I know, so this
will break things.

Is this because of the need to align the memory-reservation block?

>
> diff --git a/libfdt/fdt.c b/libfdt/fdt.c
> index 3e893073da05..9fe7cf4b747d 100644
> --- a/libfdt/fdt.c
> +++ b/libfdt/fdt.c
> @@ -90,6 +90,10 @@ int fdt_check_header(const void *fdt)
>  {
>         size_t hdrsize;
>
> +       /* The device tree must be at an 8-byte aligned address */
> +       if ((uintptr_t)fdt & 7)
> +               return -FDT_ERR_ALIGNMENT;
> +
>         if (fdt_magic(fdt) != FDT_MAGIC)
>                 return -FDT_ERR_BADMAGIC;
>         if (!can_assume(LATEST)) {
> --
> 2.27.0
>

Regards,
Simon



[Index of Archives]     [Device Tree]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux