On Sat, Feb 22, 2025 at 04:05:55PM +0530, Anshul Dalal wrote:
> On Sat Feb 22, 2025 at 1:34 AM IST, Tom Rini wrote:
> > On Fri, Feb 21, 2025 at 08:47:51PM +0530, Anshul Dalal wrote:
> >
> > > During kernel build process the header size is computed including the
> > > BSS whereas it's removed when creating the uncompressed image. Therefore
> > > the size of the uncompressed image on filesystem will be smaller than
> > > the size specifiedin the header.
> > > 
> > > Therefore it makes sense to return the header size back instead of the
> > > file size in falcon boot.
> > > 
> > > More info:
> > > https://lore.kernel.org/u-boot/20250214111656.2358748-1-ansh...@ti.com/
> > > 
> > > Signed-off-by: Anshul Dalal <ansh...@ti.com>
> > > ---
> > >  common/spl/spl_ext.c | 4 ++++
> > >  common/spl/spl_fat.c | 3 +++
> > >  2 files changed, 7 insertions(+)
> > > 
> > > diff --git a/common/spl/spl_ext.c b/common/spl/spl_ext.c
> > > index c5478820a9b..6d8d6544092 100644
> > > --- a/common/spl/spl_ext.c
> > > +++ b/common/spl/spl_ext.c
> > > @@ -17,6 +17,10 @@ static ulong spl_fit_read(struct spl_load_info *load, 
> > > ulong file_offset,
> > >   ret = ext4fs_read(buf, file_offset, size, &actlen);
> > >   if (ret)
> > >           return ret;
> > > +
> > > + if (IS_ENABLED(CONFIG_SPL_OS_BOOT) && IS_ENABLED(CONFIG_CMD_BOOTI))
> > > +         return size;
> > > +
> > >   return actlen;
> > >  }
> > >  
> > > diff --git a/common/spl/spl_fat.c b/common/spl/spl_fat.c
> > > index fce451b7664..ddf85e2cece 100644
> > > --- a/common/spl/spl_fat.c
> > > +++ b/common/spl/spl_fat.c
> > > @@ -55,6 +55,9 @@ static ulong spl_fit_read(struct spl_load_info *load, 
> > > ulong file_offset,
> > >   if (ret)
> > >           return ret;
> > >  
> > > + if (IS_ENABLED(CONFIG_SPL_OS_BOOT) && IS_ENABLED(CONFIG_CMD_BOOTI))
> > > +         return size;
> > > +
> > >   return actread;
> > >  }
> >
> > Some image formats include information about the BSS as well, and others
> > do not. But this is just having some parts of SPL return the filesize
> > and not doing some deeper probing. Given that usually problems like this
> > arise from loading contents in to memory too close together and then
> > getting wiped out by the kernel BSS, what's the problem situation you've
> > run in to, where, and with what loaded where in memory?
> 
> The problem is not about the allocation of BSS section but when loading
> an uncompressed kernel image with the check in _spl_load at
> `include/spl_load.h:95` which fails to -EIO even when the image is loaded
> properly because it compares the size form the header to the size of the
> file read from the FS:
> 
>       return read < spl_image->size ? -EIO : 0;
> 
> This doesn't work for uncompressed kernel image because the size from
> the header (the parameter ulong size for spl_fit_read) includes BSS
> which is not part of the final image file. And there is no way of
> knowing the file size based on the header. Hence why we check for
> CONFIG_CMD_BOOTI for returning the header size directly.
> 
> Although it might be better to have a different function altogether for
> reading uncompressed image that can be passed to spl_load_init so we are
> not using spl_**fit**_read to read non fit images.
> 
> You can find the bug report here:
> https://lore.kernel.org/u-boot/20250214111656.2358748-1-ansh...@ti.com/

Thanks for explaining. You should include a fixes tag and explain a bit
more about the problem being fixed in spl_load, thanks.

-- 
Tom

Attachment: signature.asc
Description: PGP signature

Reply via email to