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

Rick Chen rickchen36 at gmail.com
Mon Sep 3 07:03:54 UTC 2018


 > From: Bin Meng [mailto:bmeng.cn at gmail.com]
 > Sent: Thursday, August 30, 2018 3:54 PM
 > To: Rick Jian-Zhi Chen(陳建志); U-Boot Mailing List
 > Subject: [PATCH 03/12] riscv: bootm: Correct the 1st kernel
argument to hart id
 >
 > 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);
 >
 >       /*
 >        * 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");

Hi Bin

Actually I have check this earlier.
It was changed to hartid and pass to kernel when execute
enter_supervisor_mode( ) by bbl
    enter_supervisor_mode(entry, hartid, dtb_output());
But I have no time to solve it.
I was trapped and busy about linux drivers porting currently.
And planed to fix it when I switch back to u-boot jobs later.

Thank you for fix it.

Rick

 > -     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);
 >
 >       /* does not return */
 >
 > --
 > 2.7.4


More information about the U-Boot mailing list