On Wed, Jun 30, 2021 at 12:26 AM Ard Biesheuvel <a...@kernel.org> wrote:
>
> On Tue, 29 Jun 2021 at 21:13, Atish Patra <ati...@atishpatra.org> wrote:
> >
> > On Mon, Jun 28, 2021 at 2:24 PM Heinrich Schuchardt <xypron.g...@gmx.de> 
> > wrote:
> > >
> > >
> > > +cc Ard Biesheuvel <a...@kernel.org>
> > >
> > > Ard, please see question for you below.
> > >
> > > On 6/27/21 11:01 PM, Heinrich Schuchardt wrote:
> > > > 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
> >
> > The function comment header should be updated to reflect the correct usage. 
> > No ?
> >
>
> Agreed. The allocation limits are physical upper bounds, not sizes.
>

I will send the patch.

> > > > 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.
> > > >
> >
> > That should be fine. I think this bug was present during initial
> > porting but never got exposed because I never used
> > such a big initrd. Thanks for providing the fix.
> >
>
> I don't know about RISC-V in particular, but in general, there are
> limits to where the initrd can be loaded, depending on how the
> architecture organizes its linear mapping of DRAM. If no such
> limitation exists for RISC-V, the code should be updated accordingly.

I am not aware of any such limitation for RISC-V as long as the initrd
is placed somewhere that
doesn't overwrite fdt or kernel image. I believe the U-boot/EDK2 will
take care of that during allocation itself.

I will cross-check anyways in case I missed something.
-- 
Regards,
Atish

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to