On 03.07.17 22:41, Heinrich Schuchardt wrote:
The Unified Extensible Firmware Interface Specification, version 2.7,
defines in chapter 2.1.2 - UEFI Application that an EFI application may
either directly return or call EFI_BOOT_SERVICES.Exit().

Unfortunately U-Boot makes the incorrect assumption that
EFI_BOOT_SERVICES.Exit() is always called.

So the following application leads to a memory exception on the aarch64
architecture when returning:

EFI_STATUS efi_main(
   EFI_HANDLE handle,
   EFI_SYSTEM_TABlE systable) {
        return EFI_SUCCESS;
}

With this patch the entry point is stored in the image handle.

The new wrapper function do_enter is used to call the EFI entry point.

Cc: Alexander Graf <[email protected]>
Signed-off-by: Heinrich Schuchardt <[email protected]>
---
v2:
         do not store entry in loaded_image_info but use additonal
         function parameter as suggested by Alexander
---
  cmd/bootefi.c | 22 +++++++++++++++++-----
  1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index 771300ee94..f52da205c9 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -147,15 +147,27 @@ static void *copy_fdt(void *fdt)
        return new_fdt;
  }
+static asmlinkage ulong efi_do_enter(asmlinkage ulong (*entry)(
+                       void *image_handle, struct efi_system_table *st),
+                       void *image_handle, struct efi_system_table *st)

Please put entry as the last argument. That way we don't waste any cycles on shuffling around registers between this parameter ordering and the eventual call to entry().

If you're interested in what difference it makes, compile both versions - one with entry as first and one with entry as last argument and compare the objdump -d output.

Otherwise looks good to me. I suppose this is not a critical bug fix, so it can wait for U-Boot 2017.09?


Alex
_______________________________________________
U-Boot mailing list
[email protected]
https://lists.denx.de/listinfo/u-boot

Reply via email to