summaryrefslogtreecommitdiffstats
path: root/lib/efi_loader
diff options
context:
space:
mode:
Diffstat (limited to 'lib/efi_loader')
-rw-r--r--lib/efi_loader/efi_boottime.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
index 9daca50a72..15a1b90d65 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
@@ -458,19 +458,30 @@ static efi_status_t EFIAPI efi_start_image(efi_handle_t image_handle,
efi_is_direct_boot = false;
/* call the image! */
+ if (setjmp(&info->exit_jmp)) {
+ /* We returned from the child image */
+ return EFI_EXIT(info->exit_status);
+ }
+
entry(image_handle, &systab);
/* Should usually never get here */
return EFI_EXIT(EFI_SUCCESS);
}
-static efi_status_t EFIAPI efi_exit(void *image_handle, long exit_status,
- unsigned long exit_data_size,
- uint16_t *exit_data)
+static efi_status_t EFIAPI efi_exit(efi_handle_t image_handle,
+ efi_status_t exit_status, unsigned long exit_data_size,
+ int16_t *exit_data)
{
+ struct efi_loaded_image *loaded_image_info = (void*)image_handle;
+
EFI_ENTRY("%p, %ld, %ld, %p", image_handle, exit_status,
exit_data_size, exit_data);
- return EFI_EXIT(efi_unsupported(__func__));
+
+ loaded_image_info->exit_status = exit_status;
+ longjmp(&loaded_image_info->exit_jmp);
+
+ panic("EFI application exited");
}
static struct efi_object *efi_search_obj(void *handle)
@@ -746,7 +757,7 @@ static const struct efi_boot_services efi_boot_services = {
.install_configuration_table = efi_install_configuration_table,
.load_image = efi_load_image,
.start_image = efi_start_image,
- .exit = (void*)efi_exit,
+ .exit = efi_exit,
.unload_image = efi_unload_image,
.exit_boot_services = efi_exit_boot_services,
.get_next_monotonic_count = efi_get_next_monotonic_count,
OpenPOWER on IntegriCloud