efi: Provide wrappers for load_image, start_image and unload_image

These can be used to register a different implementation later,
for example, when shim provides a protocol with those functions.

Signed-off-by: Julian Andres Klode <julian.klode@canonical.com>
Signed-off-by: Mate Kukri <mate.kukri@canonical.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Julian Andres Klode authored and Daniel Kiper committed 2025-07-11 17:12:24 +02:00
1 parent 030a70fcad
commit 70897d3d3e
4 files changed
+109 -15

No files matched your search

+57
View File
@@ -1049,3 +1049,60 @@ grub_efi_find_configuration_table (const grub_guid_t *target_guid)
return 0;
}
static const grub_efi_loader_t *override_loader = NULL;
grub_err_t
grub_efi_register_loader (const grub_efi_loader_t *loader)
{
if (override_loader != NULL)
return grub_error (GRUB_ERR_BUG, "trying to register different loader");
override_loader = loader;
return GRUB_ERR_NONE;
}
grub_err_t
grub_efi_unregister_loader (const grub_efi_loader_t *loader)
{
if (loader != override_loader)
return grub_error (GRUB_ERR_BUG, "trying to unregister different loader");
override_loader = NULL;
return GRUB_ERR_NONE;
}
grub_efi_status_t
grub_efi_load_image (grub_efi_boolean_t boot_policy,
grub_efi_handle_t parent_image_handle,
grub_efi_device_path_t *file_path, void *source_buffer,
grub_efi_uintn_t source_size,
grub_efi_handle_t *image_handle)
{
if (override_loader != NULL)
return override_loader->load_image (boot_policy, parent_image_handle,
file_path, source_buffer, source_size,
image_handle);
return grub_efi_system_table->boot_services->load_image (
boot_policy, parent_image_handle, file_path, source_buffer, source_size,
image_handle);
}
grub_efi_status_t
grub_efi_start_image (grub_efi_handle_t image_handle,
grub_efi_uintn_t *exit_data_size,
grub_efi_char16_t **exit_data)
{
if (override_loader != NULL)
return override_loader->start_image (image_handle, exit_data_size,
exit_data);
return grub_efi_system_table->boot_services->start_image (
image_handle, exit_data_size, exit_data);
}
grub_efi_status_t
grub_efi_unload_image (grub_efi_handle_t image_handle)
{
if (override_loader != NULL)
return override_loader->unload_image (image_handle);
return grub_efi_system_table->boot_services->unload_image (image_handle);
}