On Mon, Sep 18, 2017 at 9:18 AM, Rob Clark <robdcl...@gmail.com> wrote: > On Sun, Sep 17, 2017 at 11:48 PM, Heinrich Schuchardt > <xypron.g...@gmx.de> wrote: >> On 09/18/2017 12:59 AM, Simon Glass wrote: >>> A limitation of the EFI loader at present is that it does not build with >>> sandbox. This makes it hard to write tests, since sandbox is used for most >>> testing in U-Boot. >>> >>> This series enables the EFI loader feature. It allows sandbox to build and >>> run a trivial function which calls the EFI API to output a message. >>> >>> Much work remains but this should serve as a basis for adding tests more >>> easily for EFI loader. >>> >>> This series sits on top of Heinrich's recent EFI test series. It is >>> available at u-boot-dm/efi-working >>> >>> >>> Simon Glass (16): >>> efi: Update efi_smbios_register() to return error code >>> efi: Move the init check inside efi_init_obj_list() >>> efi: Add error checking for efi_init_obj_list() >>> efi: Add a TODO to efi_init_obj_list() >>> efi: Correct header order in efi_memory >>> efi: sandbox: Adjust memory setup for sandbox >>> sandbox: smbios: Update to support sandbox >>> sandbox: Add a setjmp() implementation >>> efi: sandbox: Add required linker sections >>> efi: sandbox: Add distroboot support >>> Define board_quiesce_devices() in a shared location >>> Add a comment for board_quiesce_devices() >>> efi: sandbox: Add relocation constants >>> efi: Add a comment about duplicated ELF constants >>> efi: sandbox: Enable EFI loader builder for sandbox >>> efi: sandbox: Add a simple 'bootefi test' command >>> >>> arch/arm/include/asm/u-boot-arm.h | 1 - >>> arch/sandbox/cpu/cpu.c | 13 ++++++++++ >>> arch/sandbox/cpu/os.c | 17 ++++++++++++ >>> arch/sandbox/cpu/u-boot.lds | 29 +++++++++++++++++++++ >>> arch/sandbox/include/asm/setjmp.h | 21 +++++++++++++++ >>> arch/sandbox/lib/Makefile | 2 +- >>> arch/sandbox/lib/sections.c | 12 +++++++++ >>> arch/x86/include/asm/u-boot-x86.h | 1 - >>> arch/x86/lib/bootm.c | 4 --- >>> cmd/bootefi.c | 54 >>> ++++++++++++++++++++++++++++++++++----- >>> common/bootm.c | 4 +++ >>> configs/sandbox_defconfig | 1 + >>> include/bootm.h | 8 ++++++ >>> include/config_distro_bootcmd.h | 2 +- >>> include/efi_loader.h | 13 ++++++++-- >>> include/os.h | 21 +++++++++++++++ >>> lib/efi_loader/Kconfig | 12 ++++++++- >>> lib/efi_loader/Makefile | 1 + >>> lib/efi_loader/efi_boottime.c | 4 +++ >>> lib/efi_loader/efi_memory.c | 33 +++++++++++++----------- >>> lib/efi_loader/efi_runtime.c | 7 +++++ >>> lib/efi_loader/efi_smbios.c | 6 +++-- >>> lib/efi_loader/efi_test.c | 17 ++++++++++++ >>> lib/smbios.c | 38 ++++++++++++++++++++------- >>> 24 files changed, 277 insertions(+), 44 deletions(-) >>> create mode 100644 arch/sandbox/include/asm/setjmp.h >>> create mode 100644 arch/sandbox/lib/sections.c >>> create mode 100644 lib/efi_loader/efi_test.c >>> >> Thanks for enabling efi_loader on sandbox. That will make many things >> easier. >> >> Unfortunately >> efi_status_t EFIAPI efi_selftest(efi_handle_t image_handle, >> struct efi_system_table *systab) >> { >> ... >> boottime = systable->boottime; >> ... >> ret = boottime->allocate_pool(EFI_BOOT_SERVICES_DATA, map_size, >> (void **)&memory_map); >> leads to a segmentation fault: > > I'm seeing something similar, because: > > (gdb) print gd->bd->bi_dram[0] > $2 = {start = 0, size = 134217728} > > u-boot expects 1:1 phys:virt mapping, so that probably won't work.
The following quick hack works.. something similar could probably be smashed in to "" -------- diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c index cddafe2d43..da2079a4b1 100644 --- a/lib/efi_loader/efi_memory.c +++ b/lib/efi_loader/efi_memory.c @@ -459,9 +459,10 @@ int efi_memory_init(void) unsigned long uboot_start, uboot_pages; unsigned long uboot_stack_size = 16 * 1024 * 1024; - efi_add_known_memory(); if (!IS_ENABLED(CONFIG_SANDBOX)) { + efi_add_known_memory(); + /* Add U-Boot */ uboot_start = (gd->start_addr_sp - uboot_stack_size) & ~EFI_PAGE_MASK; @@ -476,6 +477,12 @@ int efi_memory_init(void) runtime_pages = (runtime_end - runtime_start) >> EFI_PAGE_SHIFT; efi_add_memory_map(runtime_start, runtime_pages, EFI_RUNTIME_SERVICES_CODE, false); + } else { +#define SZ_256M 0x10000000 + size_t sz = SZ_256M; + void *ram = os_malloc(sz); + efi_add_memory_map((uintptr_t)ram, sz >> EFI_PAGE_SHIFT, + EFI_CONVENTIONAL_MEMORY, false); } #ifdef CONFIG_EFI_LOADER_BOUNCE_BUFFER -------- With that I'm at least getting further.. efi_allocate_pool() eventually fails, possibly making every small memory allocation page aligned means that 256m isn't enough.. BR, -R >> => bootefi selftest >> >> Testing EFI API implementation >> >> Number of tests to execute: 3 >> <snip> >> Setting up 'ExitBootServices' >> Setting up 'ExitBootServices' succeeded >> Segmentation fault >> user@workstation:~/workspace/u-boot-odroid-c2/denx$ >> >> The problem does not exist with qemu-x86_defconfig without your patches. > > fwiw, qemu-x86 still works for me (I can still load Shell.efi) with > these patches.. > > BR, > -R > >> qemu-x86_defconfig cannot be built with you patches: >> >> UPD include/generated/asm-offsets.h >> sh: echo: I/O error >> Kbuild:47: recipe for target 'include/generated/generic-asm-offsets.h' >> failed >> make[1]: *** [include/generated/generic-asm-offsets.h] Error 1 >> make[1]: *** Waiting for unfinished jobs.... >> Makefile:1332: recipe for target 'prepare0' failed >> make: *** [prepare0] Error 2 >> >> Best regards >> >> Heinrich _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot