efi_loader: use efi_start_image() for bootefi
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Wed, 26 Dec 2018 12:28:09 +0000 (13:28 +0100)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 16 Feb 2019 14:42:20 +0000 (15:42 +0100)
Remove the duplicate code in efi_do_enter() and use efi_start_image() to
start the image invoked by the bootefi command.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
cmd/bootefi.c
include/efi_loader.h
lib/efi_loader/efi_boottime.c

index 7f9913c0ee03e55aa888dde34be919f8787f0626..a2d38256e9936a441ba335ebe2e24ec3cd12cb8c 100644 (file)
@@ -133,20 +133,6 @@ done:
        return ret;
 }
 
-static efi_status_t efi_do_enter(
-                       efi_handle_t image_handle, struct efi_system_table *st,
-                       EFIAPI efi_status_t (*entry)(
-                               efi_handle_t image_handle,
-                               struct efi_system_table *st))
-{
-       efi_status_t ret = EFI_LOAD_ERROR;
-
-       if (entry)
-               ret = entry(image_handle, st);
-       st->boottime->exit(image_handle, ret, 0, NULL);
-       return ret;
-}
-
 /*
  * efi_carve_out_dt_rsv() - Carve out DT reserved memory ranges
  *
@@ -315,13 +301,7 @@ static efi_status_t do_bootefi_exec(void *efi,
 
        /* Call our payload! */
        debug("%s: Jumping to 0x%p\n", __func__, image_obj->entry);
-
-       if (setjmp(&image_obj->exit_jmp)) {
-               ret = image_obj->exit_status;
-               goto err_prepare;
-       }
-
-       ret = efi_do_enter(&image_obj->header, &systab, image_obj->entry);
+       ret = EFI_CALL(efi_start_image(&image_obj->header, NULL, NULL));
 
 err_prepare:
        /* image has returned, loaded-image obj goes *poof*: */
index 3ce43f7a6f83241f268b579739aee16db0e44472..512880ab8fbf3df9dca2f3b030a1461cc020ee31 100644 (file)
@@ -320,6 +320,10 @@ efi_status_t efi_create_handle(efi_handle_t *handle);
 void efi_delete_handle(efi_handle_t obj);
 /* Call this to validate a handle and find the EFI object for it */
 struct efi_object *efi_search_obj(const efi_handle_t handle);
+/* Start image */
+efi_status_t EFIAPI efi_start_image(efi_handle_t image_handle,
+                                   efi_uintn_t *exit_data_size,
+                                   u16 **exit_data);
 /* Find a protocol on a handle */
 efi_status_t efi_search_protocol(const efi_handle_t handle,
                                 const efi_guid_t *protocol_guid,
index 155cdc5a239fba3154f3ad897bd91cc7f3026e87..45ed36755f878f7ed83067ba9bd27d2b8e2961d0 100644 (file)
@@ -1772,9 +1772,9 @@ error:
  *
  * Return: status code
  */
-static efi_status_t EFIAPI efi_start_image(efi_handle_t image_handle,
-                                          efi_uintn_t *exit_data_size,
-                                          u16 **exit_data)
+efi_status_t EFIAPI efi_start_image(efi_handle_t image_handle,
+                                   efi_uintn_t *exit_data_size,
+                                   u16 **exit_data)
 {
        struct efi_loaded_image_obj *image_obj =
                (struct efi_loaded_image_obj *)image_handle;