[U-Boot] [PATCH 03/12] riscv: bootm: Correct the 1st kernel argument to hart id

Bin Meng bmeng.cn at gmail.com
Thu Sep 6 02:57:59 UTC 2018


Hi Lukas,

On Tue, Sep 4, 2018 at 5:41 AM Auer, Lukas
<lukas.auer at aisec.fraunhofer.de> wrote:
>
> On Thu, 2018-08-30 at 00:54 -0700, Bin Meng wrote:
> > The first argument of Linux kernel is the risc-v core hart id,
> > from which the kernel is booted from. It is not the mach_id,
> > which seems to be copied from arm.
> >
> > Signed-off-by: Bin Meng <bmeng.cn at gmail.com>
> > ---
> >
> >  arch/riscv/lib/bootm.c | 18 +++++-------------
> >  1 file changed, 5 insertions(+), 13 deletions(-)
> >
> > diff --git a/arch/riscv/lib/bootm.c b/arch/riscv/lib/bootm.c
> > index 6662aff..754bbff 100644
> > --- a/arch/riscv/lib/bootm.c
> > +++ b/arch/riscv/lib/bootm.c
> > @@ -25,10 +25,7 @@ int arch_fixup_fdt(void *blob)
> >
> >  int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t
> > *images)
> >  {
> > -     bd_t    *bd = gd->bd;
> > -     char    *s;
> > -     int     machid = bd->bi_arch_number;
> > -     void    (*theKernel)(int arch, uint params);
> > +     void    (*kernel)(int hart, uint dtb);
>
> This probably does not cause any issues in u-boot, but the second
> parameter should be 32 bit or 64 bit depending on the architecture.
> Since you are already changing the kernel arguments it would make sense
> to also change dtb from uint to ulong or void *.
>

Yes. Will address this in v2.

> >
> >       /*
> >        * allow the PREP bootm subcommand, it is required for bootm to
> > work
> > @@ -39,18 +36,12 @@ int do_bootm_linux(int flag, int argc, char
> > *argv[], bootm_headers_t *images)
> >       if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
> >               return 1;
> >
> > -     theKernel = (void (*)(int, uint))images->ep;
> > -
> > -     s = env_get("machid");
> > -     if (s) {
> > -             machid = simple_strtoul(s, NULL, 16);
> > -             printf("Using machid 0x%x from environment\n", machid);
> > -     }
> > +     kernel = (void (*)(int, uint))images->ep;
> >
> >       bootstage_mark(BOOTSTAGE_ID_RUN_OS);
> >
> >       debug("## Transferring control to Linux (at address %08lx)
> > ...\n",
> > -            (ulong)theKernel);
> > +            (ulong)kernel);
> >
> >       if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len) {
> >  #ifdef CONFIG_OF_LIBFDT
> > @@ -66,8 +57,9 @@ int do_bootm_linux(int flag, int argc, char
> > *argv[], bootm_headers_t *images)
> >       printf("\nStarting kernel ...\n\n");
> >
> >       cleanup_before_linux();
> > +     /* TODO: hardcode the hart id to zero for now */
> >       if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len)
> > -             theKernel(machid, (unsigned long)images->ft_addr);
> > +             kernel(0, (unsigned long)images->ft_addr);
> >
>
> You can use the mhartid CSR to get the hart id. This will limit u-boot
> to running in machine mode however. Alternatively you can also use the
> hart id, which is passed in a0 by the bootloader.
>

If the goal is to use U-Boot to directly boot Linux, I think we need
more changes. I believe we should allow only one hart to execute this
function. For other harts, they should be waked up and jump to kernel
directly.

Regards,
Bin


More information about the U-Boot mailing list