[PATCH] common: relocate fdt_blob in global_data for FDTSRC_EMBED case

Evgeny Bachinin eabachinin at salutedevices.com
Wed Dec 11 00:06:27 CET 2024


Hello Simon,

On Thu, Dec 05, 2024 at 10:57:36AM -0700, Simon Glass wrote:
> Hi Evgeny,
> 
> On Wed, 4 Dec 2024 at 12:57, Evgeny Bachinin
> <eabachinin at salutedevices.com> wrote:
> >
> > Hello Simon,
> > please, see below
> >
> > On Tue, Dec 03, 2024 at 08:55:15AM -0700, Simon Glass wrote:
> > > Hi Evgeny,
> > >
> > > On Fri, 29 Nov 2024 at 03:03, Evgeny Bachinin
> > > <eabachinin at salutedevices.com> wrote:
> > > >
> > > > Hello, dear reviewers!
> > > >
> > > > It was my 1st attempt to use b4-tool and it did not list all relevant
> > > > reviewers.
> > > >
> > > > So, let me manually CC relevant stakeholders/maintainers.
> > > > Please, take a look on the fix of bug/vulnerability
> > > >
> > > > P.S. If you wish, advise me, please, whether I need to re-send with
> > > > updated CC list or just publish v2.
> > > >
> > > > On Mon, Nov 25, 2024 at 12:15:07PM +0300, Evgeny Bachinin wrote:
> > > > > Patch resolves two kind of bugs, one of which is vulnerability related
> > > > > to KASLR.
> > > > >
[...]
> > > > > +
> > > > > +     /*
> > > > > +      * For CONFIG_OF_EMBED case the FDT is embedded into ELF, available by
> > > > > +      * __dtb_dt_begin. After U-boot ELF self-relocation to RAM top address
> > >
> > > U-Boot


Fixed in follow up patch series [1]


> > >
> > > > > +      * it is worth to update fdt_blob in global_data
> > > > > +      */
> > > > > +     if (IS_ENABLED(CONFIG_OF_EMBED))
> > > > > +             gd->fdt_blob = dtb_dt_embedded();
> > > > > +
> > > > >  #ifdef CONFIG_EFI_LOADER
> > > > >       /*
> > > > >        * On the ARM architecture gd is mapped to a fixed register (r9 or x18).
> > > > >
> > > > > ---
> > > > > base-commit: cca05617a8f585f3a98a8fa82f75cc68a530d771
> > > > > change-id: 20241119-of_embed_fdt_blob_garbage-ea729a8236e1
> > > > >
> > > > > Best regards,
> > > > > --
> > > > > Evgeny Bachinin <EABachinin at salutedevices.com>
> > >
> > > Note that OF_EMBED is a development feature[1], for debugging with
> > > JTAG, etc.
> >
> >
> > Yes, that's right.
> >
> >   Due to the legacy, it's ok for us (for now) when dtb is inside U-Boot
> > ELF. We are migrating from Amlogic vendor source code base into
> > upstream one and chose more obvious and fast way (OF_EMBED), available
> > and workable both in vendor's (old) U-Boot and in upstream one.
> > One day, we will get rid of OF_EMBED, being fully on mainline
> > sources...
>
> I am surprised that OF_EMBED is faster. It really shouldn't make any difference.
>

Oh, sorry for misleading (I'm not about performance).

Under "faster" I meant the speed of adaptation the approach with
OF_EMBED both on Vendor and mainline U-Boots. We had to externally pass
the dtb into build system via EXT_DTB (in Vendor U-Boot), but,
unfortunately, the Vendor U-Boot (basing on 2015.01) can't use EXT_DTB
without OF_EMBED=y.


> >
> > Nevertheless, option exists and it is not prohibited for usage. And as
> > my patch reveals there were bugs, one of which led to KASLR disabled
> > on real production board.
> >
> >
> > > Which board is this?
> >
> > Our production device is based on Amlogic SoC A113X (AXG family) and
> > is not public. The closest board is S400 [1].
> >
> >
> > > Also, you should normally disable relocation (with gd->flags
> > > GD_FLG_SKIP_RELOC) when using OF_EMBED, since the code ends up
> > > elsewhere, which is a pain when debugging.
> >
> > Thank you for your advise! I'll take it into account.
> >
> >
> > > This macro is for use by fdtgrep...perhaps I should have added an
> > > underscore at the end to make that clear.
> >
> > Sorry, did not grasp your comment.
> > What macro?
> > P.S I tried to guess you talked about FDTSRC_EMBED or OF_EMBED, but
> > anyway I can't relate them with fdtgrep by seeking in repo.
> 
> Oh I mean fdtdec
> 
> >
> >
> > > So please add a function in
> > > fdtdec to handle this, calling it from initr_reloc_global_data(),
> > > perhaps.
> >
> > Have I understood you right?
> > You meant to move initialization of fdt_blob by dtb_dt_embedded() into
> > a separate function something like this:
> > ```
> > diff --git a/common/board_r.c b/common/board_r.c
> > index abe2395346..424954ea67 100644
> > --- a/common/board_r.c
> > +++ b/common/board_r.c
> > @@ -159,7 +159,7 @@ static int initr_reloc_global_data(void)
> >          * it is worth to update fdt_blob in global_data
> >          */
> >         if (IS_ENABLED(CONFIG_OF_EMBED))
> > -               gd->fdt_blob = dtb_dt_embedded();
> > +               fdtdec_setup_embed()
> >
> >  #ifdef CONFIG_EFI_LOADER
> >         /*
> > diff --git a/lib/fdtdec.c b/lib/fdtdec.c
> > index 6865f78c70..484954a262 100644
> > --- a/lib/fdtdec.c
> > +++ b/lib/fdtdec.c
> > @@ -1664,6 +1664,12 @@ static void setup_multi_dtb_fit(void)
> >         }
> >  }
> >
> > +void fdtdec_setup_embed(void)
> > +{
> > +       gd->fdt_blob = dtb_dt_embedded();
> > +       gd->fdt_src = FDTSRC_EMBED;
> > +}
> > +
> >  int fdtdec_setup(void)
> >  {
> >         int ret = -ENOENT;
> > @@ -1698,8 +1704,7 @@ int fdtdec_setup(void)
> >                         gd->fdt_blob = fdt_find_separate();
> >                         gd->fdt_src = FDTSRC_SEPARATE;
> >                 } else { /* embed dtb in ELF file for testing / development */
> > -                       gd->fdt_blob = dtb_dt_embedded();
> > -                       gd->fdt_src = FDTSRC_EMBED;
> > +                       fdtdec_setup_embed();
> >                 }
> >         }
> > ```
> 
> Yes that's right...it keeps the access to dtb_dt_embedded() within fdtdec
> 

Thank you for idea.
Have been done in the follow up patch-series [1]

Links:
[1] https://lore.kernel.org/u-boot/20241211-dtb_dt_embedded_within_fdtdec-v1-0-7840469f0084@salutedevices.com/T/#m7324a6dce4bc3804978073017617a4e9cf6843fa

-- 
Best Regards,
Evgeny Bachinin


More information about the U-Boot mailing list