
Kojima-san
[...]
/**
- try_load_entry() - try to load image for boot option
@@ -594,7 +638,6 @@ static efi_status_t try_load_entry(u16 n, efi_handle_t *handle, }
if (lo.attributes & LOAD_OPTION_ACTIVE) {
struct efi_device_path *file_path;
u32 attributes;
log_debug("trying to load "%ls" from %pD\n", lo.label,
@@ -611,10 +654,7 @@ static efi_status_t try_load_entry(u16 n, efi_handle_t *handle, else ret = EFI_LOAD_ERROR; } else {
file_path = expand_media_path(lo.file_path);
ret = EFI_CALL(efi_load_image(true, efi_root, file_path,
NULL, 0, handle));
efi_free_pool(file_path);
} if (ret != EFI_SUCCESS) { log_warning("Loading %ls '%ls' failed\n",ret = try_load_from_media(lo.file_path, handle);
@@ -748,19 +788,19 @@ error:
- efi_bootmgr_enumerate_boot_option() - enumerate the possible bootable media
- @opt: pointer to the media boot option structure
- @volume_handles: pointer to the efi handles
*/
- @handles: pointer to the efi handles
- @count: number of efi handle
- Return: status code
static efi_status_t efi_bootmgr_enumerate_boot_option(struct eficonfig_media_boot_option *opt,
efi_handle_t *volume_handles,
efi_status_t count)
efi_handle_t *handles,
efi_uintn_t *count)
{
- u32 i;
- u32 i, num = 0; struct efi_handler *handler; efi_status_t ret = EFI_SUCCESS;
- for (i = 0; i < count; i++) {
- for (i = 0; i < *count; i++) { u16 *p; u16 dev_name[BOOTMENU_DEVICE_NAME_MAX]; char *optional_data;
@@ -768,8 +808,15 @@ static efi_status_t efi_bootmgr_enumerate_boot_option(struct eficonfig_media_boo char buf[BOOTMENU_DEVICE_NAME_MAX]; struct efi_device_path *device_path; struct efi_device_path *short_dp;
struct efi_block_io *blkio;
ret = efi_search_protocol(handles[i], &efi_block_io_guid, &handler);
blkio = handler->protocol_interface;
ret = efi_search_protocol(volume_handles[i], &efi_guid_device_path, &handler);
if (blkio->media->logical_partition)
continue;
if (ret != EFI_SUCCESS) continue; ret = efi_protocol_open(handler, (void **)&device_path,ret = efi_search_protocol(handles[i], &efi_guid_device_path, &handler);
@@ -777,7 +824,7 @@ static efi_status_t efi_bootmgr_enumerate_boot_option(struct eficonfig_media_boo if (ret != EFI_SUCCESS) continue;
ret = efi_disk_get_device_name(volume_handles[i], buf, BOOTMENU_DEVICE_NAME_MAX);
if (ret != EFI_SUCCESS) continue;ret = efi_disk_get_device_name(handles[i], buf, BOOTMENU_DEVICE_NAME_MAX);
@@ -801,17 +848,20 @@ static efi_status_t efi_bootmgr_enumerate_boot_option(struct eficonfig_media_boo * to store guid, instead of realloc the load_option. */ lo.optional_data = "1234567";
opt[i].size = efi_serialize_load_option(&lo, (u8 **)&opt[i].lo);
if (!opt[i].size) {
opt[num].size = efi_serialize_load_option(&lo, (u8 **)&opt[num].lo);
if (!opt[num].size) {
I am a bit lost here. Why are we using 'num' instead of 'i'? The opt variable contains all media boot options with a block_io_protocol right? Aren't we going to copy the wrong load options in optional_data if we don't use 'i'?
ret = EFI_OUT_OF_RESOURCES; goto out; } /* set the guid */
optional_data = (char *)opt[i].lo + (opt[i].size - u16_strsize(u"1234567"));
memcpy(optional_data, &efi_guid_bootmenu_auto_generated, sizeof(efi_guid_t));optional_data = (char *)opt[num].lo + (opt[num].size - u16_strsize(u"1234567"));
}num++;
out:
- *count = num;
- return ret;
}
[...]
Thanks /Ilias