|
@@ -127,6 +127,7 @@ static unsigned long do_bootefi_exec(void *efi, void *fdt,
|
|
|
{
|
|
|
struct efi_loaded_image loaded_image_info = {};
|
|
|
struct efi_object loaded_image_info_obj = {};
|
|
|
+ struct efi_device_path *memdp = NULL;
|
|
|
ulong ret;
|
|
|
|
|
|
ulong (*entry)(void *image_handle, struct efi_system_table *st)
|
|
@@ -135,6 +136,20 @@ static unsigned long do_bootefi_exec(void *efi, void *fdt,
|
|
|
const efi_guid_t fdt_guid = EFI_FDT_GUID;
|
|
|
bootm_headers_t img = { 0 };
|
|
|
|
|
|
+ /*
|
|
|
+ * Special case for efi payload not loaded from disk, such as
|
|
|
+ * 'bootefi hello' or for example payload loaded directly into
|
|
|
+ * memory via jtag/etc:
|
|
|
+ */
|
|
|
+ if (!device_path && !image_path) {
|
|
|
+ printf("WARNING: using memory device/image path, this may confuse some payloads!\n");
|
|
|
+ /* actual addresses filled in after efi_load_pe() */
|
|
|
+ memdp = efi_dp_from_mem(0, 0, 0);
|
|
|
+ device_path = image_path = memdp;
|
|
|
+ } else {
|
|
|
+ assert(device_path && image_path);
|
|
|
+ }
|
|
|
+
|
|
|
/* Initialize and populate EFI object list */
|
|
|
if (!efi_obj_list_initalized)
|
|
|
efi_init_obj_list();
|
|
@@ -181,6 +196,14 @@ static unsigned long do_bootefi_exec(void *efi, void *fdt,
|
|
|
goto exit;
|
|
|
}
|
|
|
|
|
|
+ if (memdp) {
|
|
|
+ struct efi_device_path_memory *mdp = (void *)memdp;
|
|
|
+ mdp->memory_type = loaded_image_info.image_code_type;
|
|
|
+ mdp->start_address = (uintptr_t)loaded_image_info.image_base;
|
|
|
+ mdp->end_address = mdp->start_address +
|
|
|
+ loaded_image_info.image_size;
|
|
|
+ }
|
|
|
+
|
|
|
/* we don't support much: */
|
|
|
env_set("efi_8be4df61-93ca-11d2-aa0d-00e098032b8c_OsIndicationsSupported",
|
|
|
"{ro,boot}(blob)0000000000000000");
|