On Mon, Feb 24, 2025 at 04:54:09PM +0100, Heinrich Schuchardt wrote:
> On 24.02.25 15:56, Tom Rini wrote:
> > On Mon, Feb 24, 2025 at 09:59:42AM +0100, Heinrich Schuchardt wrote:
> > > On 2/24/25 06:55, Sam Edwards wrote:
> > > > While the image size is generally a multiple of 8 bytes, this is not
> > > > actually guaranteed; some linkers (like LLD) may shave a few bytes off
> > > > of the end of output sections if there are no content bytes there. Since
> > > > libfdt imposes a hard rule of 8-byte alignment, make the SPL also be
> > > > explicit about the alignment when loading the FDT.
> > > > 
> > > > Signed-off-by: Sam Edwards <cfswo...@gmail.com>
> > > > ---
> > > >    common/spl/spl_fit.c | 2 +-
> > > >    1 file changed, 1 insertion(+), 1 deletion(-)
> > > > 
> > > > diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
> > > > index 49b4df60560..86506d6905c 100644
> > > > --- a/common/spl/spl_fit.c
> > > > +++ b/common/spl/spl_fit.c
> > > > @@ -397,7 +397,7 @@ static int spl_fit_append_fdt(struct spl_image_info 
> > > > *spl_image,
> > > >          * Use the address following the image as target address for the
> > > >          * device tree.
> > > >          */
> > > > -       image_info.load_addr = spl_image->load_addr + spl_image->size;
> > > > +       image_info.load_addr = ALIGN(spl_image->load_addr + 
> > > > spl_image->size, 8);
> > > 
> > > We want to keep the SPL code size as small as possible as on many
> > > platforms it is restricted to the cache size.
> > > 
> > > Can't we fix this linker issue in the linker script by properly aligning
> > > the SPL image end address?
> > 
> > Size growth is always something to watch for, but not at the expense of
> > correctness and saving a few bytes. We really do need to fix the places
> > where U-Boot could but doesn't ensure the device tree is correctly
> > aligned in memory.
> > 
> 
> Hello Tom,
> 
> spl_image->load_addr is always a multiple of 8.
> 
> Adding
> 
>    . = ALIGN(8)"
> 
> in arch/riscv/cpu/u-boot-spl.lds before
> 
>     _end = .;
>     _image_binary_end = .;
> 
> is all it takes.

But this is generic code and I don't see how we know that in every case
every way we could be reading the device tree that it will be at an 8
byte aligned location. There's a number of ways today where it's not,
which is what Patrice found as part of updating our own libfdt to one
that enforces the alignment check.

-- 
Tom

Attachment: signature.asc
Description: PGP signature

Reply via email to