On 6/26/21 8:07 PM, Andreas Schwab wrote:
On Jun 03 2021, Nikita Ermakov wrote:
This series contains patches to add support for LoadFile2 protocol to load
initrd on EFI systems. Also it contains patches to load Linux kernel with EFI
stub on riscv platforms and unites arm and riscv codes together into common
loader code for EFI systems.
That doesn't work with a CD image. When I try to run
http://download.opensuse.org/ports/riscv/tumbleweed/iso/openSUSE-Tumbleweed-NET-riscv64-Media.iso
with qemu, the initrd fails to load.
Please, indicate how you built u-boot.bin.
$ qemu-system-riscv64 -M virt -nographic -serial mon:stdio -smp 4 -m 8g -kernel
u-boot.bin -drive
format=raw,if=virtio,media=cdrom,file=openSUSE-Tumbleweed-NET-riscv64-Media.iso
This command results in an error
qemu-system-riscv64: warning:
No -bios option specified. Not loading a firmware.
Please, provide a repo with the GRUB code you have been compiling.
OpenSBI v0.9
____ _____ ____ _____
/ __ \ / ____| _ \_ _|
| | | |_ __ ___ _ __ | (___ | |_) || |
| | | | '_ \ / _ \ '_ \ \___ \| _ < | |
| |__| | |_) | __/ | | |____) | |_) || |_
\____/| .__/ \___|_| |_|_____/|____/_____|
| |
|_|
Platform Name : riscv-virtio,qemu
Platform Features : timer,mfdeleg
Platform HART Count : 4
Firmware Base : 0x80000000
Firmware Size : 124 KB
Runtime SBI Version : 0.2
Domain0 Name : root
Domain0 Boot HART : 1
Domain0 HARTs : 0*,1*,2*,3*
Domain0 Region00 : 0x0000000080000000-0x000000008001ffff ()
Domain0 Region01 : 0x0000000000000000-0xffffffffffffffff (R,W,X)
Domain0 Next Address : 0x0000000080200000
Domain0 Next Arg1 : 0x00000000bf000000
Domain0 Next Mode : S-mode
Domain0 SysReset : yes
Boot HART ID : 1
Boot HART Domain : root
Boot HART ISA : rv64imafdcsu
Boot HART Features : scounteren,mcounteren,time
Boot HART PMP Count : 16
Boot HART PMP Granularity : 4
Boot HART PMP Address Bits: 54
Boot HART MHPM Count : 0
Boot HART MHPM Count : 0
Boot HART MIDELEG : 0x0000000000000222
Boot HART MEDELEG : 0x000000000000b109
U-Boot 2021.04 (Jun 09 2021 - 00:00:00 +0000)
CPU: rv64imafdcsu
Model: riscv-virtio,qemu
DRAM: 8 GiB
In: uart@10000000
Out: uart@10000000
Err: uart@10000000
Net: No ethernet found.
Hit any key to stop autoboot: 0
Device 0: 1af4 VirtIO Block Device
Type: Hard Disk
Capacity: 225.7 MB = 0.2 GB (462376 x 512)
... is now current device
** Invalid partition 3 **
** Invalid partition 4 **
** Invalid partition 2 **
Scanning virtio 0:1...
** Unable to read file / **
Failed to load '/'
libfdt fdt_check_header(): FDT_ERR_BADMAGIC
Scanning disk virtio-blk#8...
Found 2 disks
No EFI system partition
BootOrder not defined
EFI boot manager: Cannot load any image
Found EFI removable media binary efi/boot/bootriscv64.efi
When I press 'e' in GRUB I see:
setparams 'Installation'
set gfxpayload=keep
echo 'Loading kernel ...'
linux /boot/riscv64/linux splash=silent
echo 'Loading
initial ramdisk ...'
initrd /boot/riscv64/initrd
With debug=all I get as output:
kern/verifiers.c:88: file: /boot/riscv64/initrd type: 131076
loader/efi/linux.c:368: LoadFile2 initrd loading protocol installed
With a bit of debugging enabled in U-Boot:
EFI: Call: image_obj->entry(image_handle, &systab)
EFI: Entry efi_open_protocol(00000000ff751310,
EFI_LOADED_IMAGE_PROTOCOL_GUID, 00000000ff73a6e0, 00000000ff750050,
0000000000000000, 0x1)
EFI: Exit: efi_open_protocol: 0
EFI stub: Booting Linux Kernel...
EFI: Entry efi_locate_handle_ext(2,
EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID, 0000000000000000, 00000000ff73a740,
0000000000000000)
EFI: Exit: efi_locate_handle_ext: 14
EFI: Entry efi_locate_protocol(EFI_TPM2_GUID, 0000000000000000,
00000000ff73a648)
EFI: Exit: efi_locate_protocol: 14
EFI stub: Using DTB from configuration table
EFI: Entry efi_locate_device_path(EFI_LOAD_FILE2_PROTOCOL_GUID,
00000000ff73a648, 00000000ff73a668)
EFI: Call: efi_locate_handle_buffer(BY_PROTOCOL, protocol,
NULL, &no_handles, &handles)
EFI: Entry efi_locate_handle_buffer(2,
EFI_LOAD_FILE2_PROTOCOL_GUID, 0000000000000000, 00000000ff73a5d8,
00000000ff73a5d0)
EFI: Exit: efi_locate_handle_buffer: 0
EFI: 0 returned by efi_locate_handle_buffer(BY_PROTOCOL,
protocol, NULL, &no_handles, &handles)
EFI: Exit: efi_locate_device_path: 0
EFI: Entry efi_open_protocol(00000000ff74c8b0,
EFI_LOAD_FILE2_PROTOCOL_GUID, 00000000ff73a650, 00000000ff750050,
0000000000000000, 0x1)
EFI: Exit: efi_open_protocol: 0
EFI: Exit: efi_open_protocol: 0
EFI: Entry efi_allocate_pages_ext(AllocateMaxAddress,
EfiLoaderData, 0xc024, 00000000ff73a618)
EFI: Exit: efi_allocate_pages_ext: 9 (EFI_OUT_OF_RESOURCES)
EFI stub: ERROR: Failed to load initrd!
The LOAD_FILE2 protocol was successfully opened on the handle ff74c8b0
where it was installed by GRUB.
*Allocating memory for the initrd fails.*
0xC024 pages are requested below 0x901fffff.
This is the memory map when the call is executed:
Type Start End Attributes
================ ================ ================ ==========
BOOT DATA 0000000100000000-0000000280000000 WB
LOADER DATA 00000000fff62000-0000000100000000 WB
RUNTIME CODE 00000000fff61000-00000000fff62000 WB|RT
LOADER DATA 00000000fe73f000-00000000fff61000 WB
BOOT DATA 00000000fe73d000-00000000fe73f000 WB
RESERVED 00000000fe73c000-00000000fe73d000 WB
BOOT DATA 00000000fe73a000-00000000fe73c000 WB
RESERVED 00000000fe739000-00000000fe73a000 WB
RUNTIME DATA 00000000fe735000-00000000fe739000 WB|RT
BOOT DATA 00000000fe734000-00000000fe735000 WB
RUNTIME DATA 00000000fe730000-00000000fe734000 WB|RT
BOOT DATA 00000000fe72f000-00000000fe730000 WB
RESERVED 00000000fe728000-00000000fe72f000 WB
LOADER CODE 00000000fe4aa000-00000000fe728000 WB
LOADER DATA 00000000fe4a9000-00000000fe4aa000 WB
BOOT DATA 00000000fe4a8000-00000000fe4a9000 WB
RESERVED 00000000fe4a6000-00000000fe4a8000 WB
LOADER DATA 00000000fe4a3000-00000000fe4a6000 WB
LOADER CODE 00000000deb8d000-00000000fe4a3000 WB
LOADER DATA 00000000dd620000-00000000deb8d000 WB
LOADER CODE 00000000dbfc3000-00000000dd620000 WB
BOOT DATA 00000000dbfc2000-00000000dbfc3000 WB
CONVENTIONAL 0000000087f05000-00000000dbfc2000 WB
ACPI RECLAIM MEM 0000000087efb000-0000000087f05000 WB
CONVENTIONAL 000000008185d000-0000000087efb000 WB
LOADER DATA 0000000080200000-000000008185d000 WB
CONVENTIONAL 0000000080040000-0000000080200000 WB
BOOT DATA 0000000080000000-0000000080040000 WB
0x901fffff - 0x1000 * 0xC024 = 0x841DBFFF
So U-Boot is correct in indicating that the memory is not available at
the required low address.
In Linux efi_load_initrd() is called with parameter hard_limit being the
'minimum size of allocated memory'. But this parameter is passed to
efi_load_initrd_dev_path() as 'upper limit for the initrd memory
allocation' and further to efi_allocate_pages() as 'the address that the
last allocated memory page shall not exceed'.
@Ard
Why does Linux require allocating the memory below 0x901fffff which is
the value of 'minimum size of allocated memory'? I think initrd can be
allocated anywhere in memory even above 4GiB.
Best regards
Heinrich
2584576 bytes read in 3 ms (821.6 MiB/s)
libfdt fdt_check_header(): FDT_ERR_BADMAGIC
Booting /efi\boot\bootriscv64.efi
Welcome to GRUB!
Please press 't' to show the boot menu on this console
error: ../../grub-core/video/video.c:761:no suitable video mode found.
openSUSE Tumbleweed
┌────────────────────────────────────────────────────────────────────────────┐
│ Boot from Hard Disk │
│*Installation │
│ Upgrade │
│ More ... │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└────────────────────────────────────────────────────────────────────────────┘
Use the ▲ and ▼ keys to select which entry is highlighted.
Press enter to boot the selected OS, `e' to edit the commands
before booting or `c' for a command-line.
Loading kernel ...
Loading initial ramdisk ...
EFI stub: Booting Linux Kernel...
EFI stub: Using DTB from configuration table
EFI stub: ERROR: Failed to load initrd!
EFI stub: Exiting boot services and installing virtual address map...
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel