On Fri, Dec 6, 2019 at 2:50 PM Rick Chen <rickche...@gmail.com> wrote:
>
> > From: Lukas Auer [mailto:lukas.a...@aisec.fraunhofer.de]
> > Sent: Wednesday, December 04, 2019 5:40 AM
> > To: u-boot@lists.denx.de
> > Cc: Rick Jian-Zhi Chen(陳建志); Anup Patel; Bin Meng; Lukas Auer; Anup Patel
> > Subject: [PATCH 1/4] spl: opensbi: specify main hart as preferred boot hart
> >
> > OpenSBI uses a relocation lottery to determine the hart to relocate OpenSBI 
> > to its link address. In the U-Boot SPL boot flow, the main hart schedules 
> > the secondary harts to enter OpenSBI before doing so itself.
> > One of the secondary harts will therefore always be the winner of the 
> > relocation lottery. This is problematic if the link address ranges of 
> > OpenSBI and U-Boot SPL overlap. OpenSBI will be relocated and therefore 
> > overwrite U-Boot SPL while some harts may still run it, leading to code 
> > corruption.
> >
> > Avoid this problem by specifying the main hart as the preferred boot hart 
> > to perform the OpenSBI relocation. The main hart will be the last hart to 
> > enter OpenSBI, relocation can therefore occur safely.
> >
> > The boot hart field was added to version 2 of the OpenSBI FW_DYNAMIC info 
> > structure. The header file include/opensbi.h is synchronized with 
> > include/sbi/fw_dynamic.h from the OpenSBI project to update the info 
> > structure. The header file is recent as of commit
> > 7a13beb21326 ("firmware: Add preferred boot HART field in struct 
> > fw_dynamic_info").
> >
> > Reported-by: Rick Chen <r...@andestech.com>
> > Suggested-by: Anup Patel <anup.pa...@wdc.com>
> > Signed-off-by: Lukas Auer <lukas.a...@aisec.fraunhofer.de>
> > ---
> >
>
> Reviewed-by: Rick Chen <r...@andestech.com>
> Tested-by: Rick Chen <r...@andestech.com>
>
> >  common/spl/spl_opensbi.c |  1 +
> >  include/opensbi.h        | 18 +++++++++++++++++-
> >  2 files changed, 18 insertions(+), 1 deletion(-)
> >
> > diff --git a/common/spl/spl_opensbi.c b/common/spl/spl_opensbi.c index 
> > a6b4480ed2..79ee7edcf9 100644
> > --- a/common/spl/spl_opensbi.c
> > +++ b/common/spl/spl_opensbi.c
> > @@ -69,6 +69,7 @@ void spl_invoke_opensbi(struct spl_image_info *spl_image)
> >         opensbi_info.next_addr = uboot_entry;
> >         opensbi_info.next_mode = FW_DYNAMIC_INFO_NEXT_MODE_S;
> >         opensbi_info.options = SBI_SCRATCH_NO_BOOT_PRINTS;
> > +       opensbi_info.boot_hart = gd->arch.boot_hart;
> >
> >         opensbi_entry = (void (*)(ulong, ulong, 
> > ulong))spl_image->entry_point;
> >         invalidate_icache_all();
> > diff --git a/include/opensbi.h b/include/opensbi.h index 
> > 9f1d62e7dd..d812cc8ccd 100644
> > --- a/include/opensbi.h
> > +++ b/include/opensbi.h
> > @@ -11,7 +11,7 @@
> >  #define FW_DYNAMIC_INFO_MAGIC_VALUE            0x4942534f
> >
> >  /** Maximum supported info version */
> > -#define FW_DYNAMIC_INFO_VERSION                        0x1
> > +#define FW_DYNAMIC_INFO_VERSION                        0x2
> >
> >  /** Possible next mode values */
> >  #define FW_DYNAMIC_INFO_NEXT_MODE_U            0x0
> > @@ -35,6 +35,22 @@ struct fw_dynamic_info {
> >         unsigned long next_mode;
> >         /** Options for OpenSBI library */
> >         unsigned long options;
> > +       /**
> > +        * Preferred boot HART id
> > +        *
> > +        * It is possible that the previous booting stage uses same link
> > +        * address as the FW_DYNAMIC firmware. In this case, the relocation
> > +        * lottery mechanism can potentially overwrite the previous booting
> > +        * stage while other HARTs are still running in the previous booting
> > +        * stage leading to boot-time crash. To avoid this boot-time crash,
> > +        * the previous booting stage can specify last HART that will jump
> > +        * to the FW_DYNAMIC firmware as the preferred boot HART.
> > +        *
> > +        * To avoid specifying a preferred boot HART, the previous booting
> > +        * stage can set it to -1UL which will force the FW_DYNAMIC firmware
> > +        * to use the relocation lottery mechanism.
> > +        */
> > +       unsigned long boot_hart;
> >  } __packed;
> >
> >  #endif
> > --
> > 2.21.0
> >

Looks good to me.

Reviewed-by: Anup Patel <anup.pa...@wdc.com>

Regards,
Anup

Reply via email to