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

Alexander Graf agraf at suse.de
Sat Nov 3 19:33:06 UTC 2018



On 03.11.18 18:07, Auer, Lukas wrote:
> On Tue, 2018-10-30 at 16:27 +0100, Alexander Graf wrote:
>>
>> On 30.10.18 16:02, Auer, Lukas wrote:
>>> 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.
>>
>> Also, can you please enable distro boot? :)
>>
>>
>> Thanks,
>>
>> Alex
> 
> I just had a closer look at distro boot and it's actually quite easy to
> use. I will update this patch to enable it and will add a bootcmd for
> virtio block devices (virtio support is currently in u-boot-dm/next).
> 
> I was looking into testing bootefi on U-Boot and tried to run the hello
> world and selftest EFI binaries, however I could not get them running.
> After starting them I immediately get a load access fault. The faulting
> instruction is at 0xfe77c1fa, which is strange since the binary is
> loaded to 0x80200000. Do you know what this could be caused by?

I'm not quite sure yet what goes wrong. I tested and verified the riscv
uefi port on andes targets (where at least grub still works), but I can
confirm that the same code just falls apart for me on the qemu target.

Any help to debug it down a bit further is much appreciated.

> Also note that I completed the list of exception codes in this patch
> series. U-Boot master will not indicate this exception occurred.

Ah nice, that will definitely help to debug what's going wrong :).


Alex


More information about the U-Boot mailing list