[U-Boot] [PATCH v2 28/29] riscv: qemu: detect and boot the kernel passed by QEMU

Auer, Lukas lukas.auer at aisec.fraunhofer.de
Tue Oct 30 15:02:06 UTC 2018


On Tue, 2018-10-30 at 13:55 +0100, Lukas Auer wrote:
> QEMU embeds the location of the kernel image in the device tree.
> Store
> this address in the environment as variable kernel_start and use it
> in
> CONFIG_BOOTCOMMAND to boot the kernel. Use the device tree passed by
> the
> prior boot stage to boot Linux.
> 
> Signed-off-by: Lukas Auer <lukas.auer at aisec.fraunhofer.de>
> ---
> 
> Changes in v2:
> - Rebase onto u-boot-dm/next
> - Boot Linux with the device tree provided by the prior boot stage
> 
>  board/emulation/qemu-riscv/Kconfig      |  1 +
>  board/emulation/qemu-riscv/qemu-riscv.c | 29
> +++++++++++++++++++++++++
>  configs/qemu-riscv32_defconfig          |  1 +
>  configs/qemu-riscv64_defconfig          |  1 +
>  include/configs/qemu-riscv.h            | 10 ++++++++-
>  5 files changed, 41 insertions(+), 1 deletion(-)
> 
> diff --git a/board/emulation/qemu-riscv/Kconfig
> b/board/emulation/qemu-riscv/Kconfig
> index 37a80db6a9..be5839b7db 100644
> --- a/board/emulation/qemu-riscv/Kconfig
> +++ b/board/emulation/qemu-riscv/Kconfig
> @@ -29,5 +29,6 @@ config BOARD_SPECIFIC_OPTIONS # dummy
>  	imply CMD_EXT2
>  	imply CMD_EXT4
>  	imply CMD_FAT
> +	imply BOARD_LATE_INIT
>  
>  endif
> diff --git a/board/emulation/qemu-riscv/qemu-riscv.c
> b/board/emulation/qemu-riscv/qemu-riscv.c
> index 2ce093e19a..ee20983095 100644
> --- a/board/emulation/qemu-riscv/qemu-riscv.c
> +++ b/board/emulation/qemu-riscv/qemu-riscv.c
> @@ -19,3 +19,32 @@ int board_init(void)
>  
>  	return 0;
>  }
> +
> +int board_late_init(void)
> +{
> +	ulong kernel_start;
> +	ofnode chosen_node;
> +	int ret;
> +
> +	chosen_node = ofnode_path("/chosen");
> +	if (!ofnode_valid(chosen_node)) {
> +		printf("No chosen node found\n");
> +		return 0;
> +	}
> +
> +#ifdef CONFIG_ARCH_RV64I
> +	ret = ofnode_read_u64(chosen_node, "riscv,kernel-start",
> +			      (u64 *)&kernel_start);
> +#else
> +	ret = ofnode_read_u32(chosen_node, "riscv,kernel-start",
> +			      (u32 *)&kernel_start);
> +#endif
> +	if (ret) {
> +		printf("Can't find kernel start address in device
> tree\n");
> +		return 0;
> +	}
> +
> +	env_set_hex("kernel_start", kernel_start);
> +
> +	return 0;
> +}
> diff --git a/configs/qemu-riscv32_defconfig b/configs/qemu-
> riscv32_defconfig
> index b55644378a..13dd53a550 100644
> --- a/configs/qemu-riscv32_defconfig
> +++ b/configs/qemu-riscv32_defconfig
> @@ -4,4 +4,5 @@ CONFIG_NR_DRAM_BANKS=1
>  CONFIG_FIT=y
>  CONFIG_DISPLAY_CPUINFO=y
>  CONFIG_DISPLAY_BOARDINFO=y
> +CONFIG_HUSH_PARSER=y
>  CONFIG_OF_PRIOR_STAGE=y
> diff --git a/configs/qemu-riscv64_defconfig b/configs/qemu-
> riscv64_defconfig
> index a542ac4893..06eb3042fa 100644
> --- a/configs/qemu-riscv64_defconfig
> +++ b/configs/qemu-riscv64_defconfig
> @@ -5,4 +5,5 @@ CONFIG_NR_DRAM_BANKS=1
>  CONFIG_FIT=y
>  CONFIG_DISPLAY_CPUINFO=y
>  CONFIG_DISPLAY_BOARDINFO=y
> +CONFIG_HUSH_PARSER=y
>  CONFIG_OF_PRIOR_STAGE=y
> diff --git a/include/configs/qemu-riscv.h b/include/configs/qemu-
> riscv.h
> index ba6a18f2e6..7c88ba300a 100644
> --- a/include/configs/qemu-riscv.h
> +++ b/include/configs/qemu-riscv.h
> @@ -21,7 +21,15 @@
>  #define CONFIG_ENV_SIZE			SZ_4K
>  
>  #define CONFIG_EXTRA_ENV_SETTINGS \
> -	"fdt_high=0xffffffffffffffff\0" \
> +	"fdt_high=0x82000000\0" \
> +	"bootm_size=0x10000000\0" \
>  	"initrd_high=0xffffffffffffffff\0"
>  
> +#define CONFIG_BOOTCOMMAND \
> +	"if env exists kernel_start; then " \
> +		"bootm ${kernel_start} - ${prior_stage_dtb};" \

As Alexander Graf pointed out in reply to patch 24, we don't need the
separate environment variable "prior_stage_dtb". I will replace it with
"fdtcontroladdr" here and drop patch 24 in the next version.

> +	"else " \
> +		"echo Kernel address not found in the device tree;" \
> +	"fi;"
> +
>  #endif /* __CONFIG_H */


More information about the U-Boot mailing list