efi_loader: create boot options without file path

Allow the efidebug command to create boot options without file path, e.g.

    efidebug boot add -b 0001 'short dev only' host 0:1 ''
    efidebug boot add -B 0002 'long dev only' host 0:1 ''

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
Heinrich Schuchardt 2022-06-11 05:22:08 +00:00
parent 178667b34b
commit 72fa9cd59e
2 changed files with 25 additions and 11 deletions

View File

@ -46,7 +46,6 @@ struct efi_device_path *expand_media_path(struct efi_device_path *device_path)
{ {
struct efi_device_path *dp, *rem, *full_path; struct efi_device_path *dp, *rem, *full_path;
efi_handle_t handle; efi_handle_t handle;
efi_status_t ret;
if (!device_path) if (!device_path)
return NULL; return NULL;
@ -59,7 +58,7 @@ struct efi_device_path *expand_media_path(struct efi_device_path *device_path)
dp = device_path; dp = device_path;
handle = efi_dp_find_obj(dp, &efi_simple_file_system_protocol_guid, handle = efi_dp_find_obj(dp, &efi_simple_file_system_protocol_guid,
&rem); &rem);
if (ret == EFI_SUCCESS) { if (handle) {
if (rem->type == DEVICE_PATH_TYPE_END) { if (rem->type == DEVICE_PATH_TYPE_END) {
dp = efi_dp_from_file(NULL, 0, dp = efi_dp_from_file(NULL, 0,
"/EFI/BOOT/" BOOTEFI_NAME); "/EFI/BOOT/" BOOTEFI_NAME);

View File

@ -973,9 +973,22 @@ static void path_to_uefi(void *uefi, const char *src)
*pos = 0; *pos = 0;
} }
/* /**
* If desc is NULL, this creates a path with only the file component, * efi_dp_from_file() - create device path for file
* otherwise it creates a full path with both device and file components *
* The function creates a device path from the block descriptor @desc and the
* partition number @part and appends a device path node created describing the
* file path @path.
*
* If @desc is NULL, the device path will not contain nodes describing the
* partition.
* If @path is an empty string "", the device path will not contain a node
* for the file path.
*
* @desc: block device descriptor or NULL
* @part: partition number
* @path: file path on partition or ""
* Return: device path or NULL in case of an error
*/ */
struct efi_device_path *efi_dp_from_file(struct blk_desc *desc, int part, struct efi_device_path *efi_dp_from_file(struct blk_desc *desc, int part,
const char *path) const char *path)
@ -1002,12 +1015,14 @@ struct efi_device_path *efi_dp_from_file(struct blk_desc *desc, int part,
buf = dp_part_fill(buf, desc, part); buf = dp_part_fill(buf, desc, part);
/* add file-path: */ /* add file-path: */
if (*path) {
fp = buf; fp = buf;
fp->dp.type = DEVICE_PATH_TYPE_MEDIA_DEVICE; fp->dp.type = DEVICE_PATH_TYPE_MEDIA_DEVICE;
fp->dp.sub_type = DEVICE_PATH_SUB_TYPE_FILE_PATH; fp->dp.sub_type = DEVICE_PATH_SUB_TYPE_FILE_PATH;
fp->dp.length = (u16)fpsize; fp->dp.length = (u16)fpsize;
path_to_uefi(fp->str, path); path_to_uefi(fp->str, path);
buf += fpsize; buf += fpsize;
}
*((struct efi_device_path *)buf) = END; *((struct efi_device_path *)buf) = END;