diff options
-rw-r--r-- | cmd/bootefi.c | 34 | ||||
-rw-r--r-- | cmd/fs.c | 2 | ||||
-rw-r--r-- | include/efi_loader.h | 10 | ||||
-rw-r--r-- | lib/efi_loader/efi_disk.c | 6 |
4 files changed, 37 insertions, 15 deletions
diff --git a/cmd/bootefi.c b/cmd/bootefi.c index 2b104d4908..2f0b90a9da 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -21,16 +21,16 @@ * In addition to the originating device we also declare the file path * of "bootefi" based loads to be /bootefi. */ -static struct efi_device_path_file_path bootefi_dummy_path[] = { +static struct efi_device_path_file_path bootefi_image_path[] = { { .dp.type = DEVICE_PATH_TYPE_MEDIA_DEVICE, .dp.sub_type = DEVICE_PATH_SUB_TYPE_FILE_PATH, - .dp.length = sizeof(bootefi_dummy_path[0]), + .dp.length = sizeof(bootefi_image_path[0]), .str = { 'b','o','o','t','e','f','i' }, }, { .dp.type = DEVICE_PATH_TYPE_END, .dp.sub_type = DEVICE_PATH_SUB_TYPE_END, - .dp.length = sizeof(bootefi_dummy_path[0]), + .dp.length = sizeof(bootefi_image_path[0]), } }; @@ -38,14 +38,14 @@ static efi_status_t bootefi_open_dp(void *handle, efi_guid_t *protocol, void **protocol_interface, void *agent_handle, void *controller_handle, uint32_t attributes) { - *protocol_interface = bootefi_dummy_path; + *protocol_interface = bootefi_image_path; return EFI_SUCCESS; } /* The EFI loaded_image interface for the image executed via "bootefi" */ static struct efi_loaded_image loaded_image_info = { - .device_handle = bootefi_dummy_path, - .file_path = bootefi_dummy_path, + .device_handle = bootefi_image_path, + .file_path = bootefi_image_path, }; /* The EFI object struct for the image executed via "bootefi" */ @@ -63,7 +63,7 @@ static struct efi_object loaded_image_info_obj = { { /* * When asking for the device path interface, return - * bootefi_dummy_path + * bootefi_image_path */ .guid = &efi_guid_device_path, .open = &bootefi_open_dp, @@ -73,11 +73,11 @@ static struct efi_object loaded_image_info_obj = { /* The EFI object struct for the device the "bootefi" image was loaded from */ static struct efi_object bootefi_device_obj = { - .handle = bootefi_dummy_path, + .handle = bootefi_image_path, .protocols = { { /* When asking for the device path interface, return - * bootefi_dummy_path */ + * bootefi_image_path */ .guid = &efi_guid_device_path, .open = &bootefi_open_dp, } @@ -188,3 +188,19 @@ U_BOOT_CMD( "Boots an EFI payload from memory\n", bootefi_help_text ); + +void efi_set_bootdev(const char *dev, const char *devnr) +{ + char devname[16] = { 0 }; /* dp->str is u16[16] long */ + char *colon; + + /* Assemble the condensed device name we use in efi_disk.c */ + snprintf(devname, sizeof(devname), "%s%s", dev, devnr); + colon = strchr(devname, ':'); + if (colon) + *colon = '\0'; + + /* Patch the bootefi_image_path to the target device */ + memset(bootefi_image_path[0].str, 0, sizeof(bootefi_image_path[0].str)); + ascii2unicode(bootefi_image_path[0].str, devname); +} @@ -9,6 +9,7 @@ #include <common.h> #include <command.h> #include <fs.h> +#include <efi_loader.h> static int do_size_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { @@ -26,6 +27,7 @@ U_BOOT_CMD( static int do_load_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { + efi_set_bootdev(argv[1], (argc > 2) ? argv[2] : ""); return do_load(cmdtp, flag, argc, argv, FS_TYPE_ANY); } diff --git a/include/efi_loader.h b/include/efi_loader.h index 11be685f0e..74bed26662 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -109,6 +109,8 @@ void efi_restore_gd(void); efi_status_t efi_exit_func(efi_status_t ret); /* Call this to relocate the runtime section to an address space */ void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map); +/* Call this to set the current device name */ +void efi_set_bootdev(const char *dev, const char *devnr); /* Generic EFI memory allocator, call this to get memory */ void *efi_alloc(uint64_t len, int memory_type); @@ -129,6 +131,13 @@ uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type, /* Called by board init to initialize the EFI memory map */ int efi_memory_init(void); +/* Convert strings from normal C strings to uEFI strings */ +static inline void ascii2unicode(u16 *unicode, char *ascii) +{ + while (*ascii) + *(unicode++) = *(ascii++); +} + /* * Use these to indicate that your code / data should go into the EFI runtime * section and thus still be available when the OS is running @@ -144,5 +153,6 @@ int efi_memory_init(void); /* No loader configured, stub out EFI_ENTRY */ static inline void efi_restore_gd(void) { } +static inline void efi_set_bootdev(const char *dev, const char *devnr) { } #endif diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c index 6f543ff5cb..aaff947596 100644 --- a/lib/efi_loader/efi_disk.c +++ b/lib/efi_loader/efi_disk.c @@ -29,12 +29,6 @@ struct efi_disk_obj { struct efi_device_path_file_path *dp; }; -static void ascii2unicode(u16 *unicode, char *ascii) -{ - while (*ascii) - *(unicode++) = *(ascii++); -} - static efi_status_t efi_disk_open_block(void *handle, efi_guid_t *protocol, void **protocol_interface, void *agent_handle, void *controller_handle, uint32_t attributes) |