aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2018-06-12 10:21:16 +0200
committerAlexander Graf <agraf@suse.de>2018-06-14 10:53:37 +0200
commit58bc69d20aaf2e32e93e977d708fe6a1af0ad6d1 (patch)
treecb3a89feee36f5dcbc65e0354614ffed4f917657
parent2f61b13d6acba787b00598d519c85222e993e4ca (diff)
downloadu-boot-58bc69d20aaf2e32e93e977d708fe6a1af0ad6d1.zip
u-boot-58bc69d20aaf2e32e93e977d708fe6a1af0ad6d1.tar.gz
u-boot-58bc69d20aaf2e32e93e977d708fe6a1af0ad6d1.tar.bz2
efi_loader: Allocate memory handle for mem dp
When we boot using memdp (bootefi on an address without previous load that populates the device path) then the memory device path we pass in is not backed by any handle. That can result in weird effects. For example grub gets very grumpy about this inside the efi_net module and just loops endlessly. So let's expose a simple handle that the memory device path is backed on. That way any code that looks for the device the dp is on, finds one. Signed-off-by: Alexander Graf <agraf@suse.de>
-rw-r--r--cmd/bootefi.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index 707d159..f55a40d 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -263,6 +263,7 @@ static efi_status_t do_bootefi_exec(void *efi,
{
struct efi_loaded_image loaded_image_info = {};
struct efi_object loaded_image_info_obj = {};
+ struct efi_object mem_obj = {};
struct efi_device_path *memdp = NULL;
efi_status_t ret;
@@ -279,6 +280,12 @@ static efi_status_t do_bootefi_exec(void *efi,
/* actual addresses filled in after efi_load_pe() */
memdp = efi_dp_from_mem(0, 0, 0);
device_path = image_path = memdp;
+ efi_add_handle(&mem_obj);
+
+ ret = efi_add_protocol(mem_obj.handle, &efi_guid_device_path,
+ device_path);
+ if (ret != EFI_SUCCESS)
+ goto exit;
} else {
assert(device_path && image_path);
}
@@ -343,6 +350,8 @@ static efi_status_t do_bootefi_exec(void *efi,
exit:
/* image has returned, loaded-image obj goes *poof*: */
list_del(&loaded_image_info_obj.link);
+ if (mem_obj.handle)
+ list_del(&mem_obj.link);
return ret;
}