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

Auer, Lukas lukas.auer at aisec.fraunhofer.de
Mon Sep 3 21:41:30 UTC 2018


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 *.

>  
>  	/*
>  	 * 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.

Thanks,
Lukas

>  	/* does not return */
>  





More information about the U-Boot mailing list