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); > + ret = try_load_from_media(lo.file_path, handle); > } > if (ret != EFI_SUCCESS) { > log_warning("Loading %ls '%ls' failed\n", > @@ -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; > + > + ret = efi_search_protocol(handles[i], &efi_guid_device_path, > &handler); > if (ret != EFI_SUCCESS) > continue; > ret = efi_protocol_open(handler, (void **)&device_path, > @@ -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); > + ret = efi_disk_get_device_name(handles[i], buf, > BOOTMENU_DEVICE_NAME_MAX); > if (ret != EFI_SUCCESS) > continue; > > @@ -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")); > + optional_data = (char *)opt[num].lo + (opt[num].size - > u16_strsize(u"1234567")); > memcpy(optional_data, &efi_guid_bootmenu_auto_generated, > sizeof(efi_guid_t)); > + num++; > } > > out: > + *count = num; > + > return ret; > } > [...] Thanks /Ilias