On Fri, Dec 6, 2019 at 2:50 PM Rick Chen <rickche...@gmail.com> wrote: > > Hi Lukas, > > > 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 4/4] spl: opensbi: wait for ack from secondary harts before > > entering OpenSBI > > > > At the start, OpenSBI relocates itself to its link address. If the link > > address ranges of U-Boot SPL and OpenSBI overlap, the relocation can lead > > to code corruption if a hart is still running U-Boot SPL during relocation. > > To avoid this problem, the main hart is specified as the preferred boot > > hart to perform the relocation. This fixes the code corruption problems > > based on the assumption that since the main hart schedules the secondary > > harts to enter OpenSBI, it will be the last to enter OpenSBI. However it > > was reported that this assumption is not always correct. > > > > To make sure the assumption always holds true, wait for all secondary harts > > to acknowledge the call-function request before entering OpenSBI on the > > main hart. > > > > Reported-by: Rick Chen <r...@andestech.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>
Looks good to me. Reviewed-by: Anup Patel <anup.pa...@wdc.com> Regards, Anup > > > > > common/spl/spl_opensbi.c | 12 +++++++++++- > > 1 file changed, 11 insertions(+), 1 deletion(-) > > > > diff --git a/common/spl/spl_opensbi.c b/common/spl/spl_opensbi.c index > > 91a411a3db..5ea59d423f 100644 > > --- a/common/spl/spl_opensbi.c > > +++ b/common/spl/spl_opensbi.c > > @@ -75,9 +75,19 @@ void spl_invoke_opensbi(struct spl_image_info *spl_image) > > invalidate_icache_all(); > > > > #ifdef CONFIG_SMP > > + /* > > + * Start OpenSBI on all secondary harts and wait for acknowledgment. > > + * > > + * OpenSBI first relocates itself to its link address. This is done > > by > > + * the main hart. To make sure no hart is still running U-Boot SPL > > + * during relocation, we wait for all secondary harts to acknowledge > > + * the call-function request before entering OpenSBI on the main > > hart. > > + * Otherwise, code corruption can occur if the link address ranges > > of > > + * U-Boot SPL and OpenSBI overlap. > > + */ > > ret = smp_call_function((ulong)spl_image->entry_point, > > (ulong)spl_image->fdt_addr, > > - (ulong)&opensbi_info, 0); > > + (ulong)&opensbi_info, 1); > > if (ret) > > hang(); > > #endif > > -- > > 2.21.0 > >