diff options
author | Tom Rini | 2021-02-04 17:35:50 -0500 |
---|---|---|
committer | Tom Rini | 2021-02-04 17:35:50 -0500 |
commit | 55ffabec7f9108060350fae29b932fbd832f8296 (patch) | |
tree | ca7399205efb7aeb994def6728c6d79fc10d4ba5 /lib | |
parent | 21cb717e79e3f6588abae52fe55e2c415850c913 (diff) | |
parent | 5489448cd7d46554f7f45a180754be78eff9f54d (diff) |
Merge tag 'efi-2021-04-rc2' of https://gitlab.denx.de/u-boot/custodians/u-boot-efi
Pull request for UEFI sub-system for efi-2021-04-rc2
Bug fixes:
* do not allow creating of files with filenames on FAT file system
* install UEFI System Partition GUID on ESP handle
* in dtbdump.efi test tool use GUID to find ESP handle
Documentation:
* man-page for load command
* describe end of life of plat_auto
Diffstat (limited to 'lib')
-rw-r--r-- | lib/efi_loader/efi_device_path_to_text.c | 15 | ||||
-rw-r--r-- | lib/efi_loader/efi_disk.c | 15 | ||||
-rw-r--r-- | lib/efi_loader/efi_dt_fixup.c | 25 | ||||
-rw-r--r-- | lib/efi_selftest/dtbdump.c | 85 |
4 files changed, 87 insertions, 53 deletions
diff --git a/lib/efi_loader/efi_device_path_to_text.c b/lib/efi_loader/efi_device_path_to_text.c index 5ae4833fa78..1aaa9f94fa4 100644 --- a/lib/efi_loader/efi_device_path_to_text.c +++ b/lib/efi_loader/efi_device_path_to_text.c @@ -244,6 +244,21 @@ static char *dp_media(char *s, struct efi_device_path *dp) cddp->partition_start, cddp->partition_size); break; } + case DEVICE_PATH_SUB_TYPE_VENDOR_PATH: { + int i, n; + struct efi_device_path_vendor *vdp = + (struct efi_device_path_vendor *)dp; + + s += sprintf(s, "VenMedia(%pUl", &vdp->guid); + n = (int)vdp->dp.length - sizeof(struct efi_device_path_vendor); + if (n > 0) { + s += sprintf(s, ","); + for (i = 0; i < n; ++i) + s += sprintf(s, "%02x", vdp->vendor_data[i]); + } + s += sprintf(s, ")"); + break; + } case DEVICE_PATH_SUB_TYPE_FILE_PATH: { struct efi_device_path_file_path *fp = (struct efi_device_path_file_path *)dp; diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c index d0aad0252a5..1f6b817dead 100644 --- a/lib/efi_loader/efi_disk.c +++ b/lib/efi_loader/efi_disk.c @@ -19,6 +19,7 @@ struct efi_system_partition efi_system_partition; const efi_guid_t efi_block_io_guid = EFI_BLOCK_IO_PROTOCOL_GUID; +const efi_guid_t efi_system_partition_guid = PARTITION_SYSTEM_GUID; /** * struct efi_disk_obj - EFI disk object @@ -362,6 +363,7 @@ static efi_status_t efi_disk_add_dev( { struct efi_disk_obj *diskobj; struct efi_object *handle; + const efi_guid_t *guid = NULL; efi_status_t ret; /* Don't add empty devices */ @@ -400,6 +402,8 @@ static efi_status_t efi_disk_add_dev( efi_free_pool(node); diskobj->offset = part_info->start; diskobj->media.last_block = part_info->size - 1; + if (part_info->bootable & PART_EFI_SYSTEM_PARTITION) + guid = &efi_system_partition_guid; } else { diskobj->dp = efi_dp_from_part(desc, part); diskobj->offset = 0; @@ -417,7 +421,8 @@ static efi_status_t efi_disk_add_dev( handle = &diskobj->header; ret = EFI_CALL(efi_install_multiple_protocol_interfaces( &handle, &efi_guid_device_path, diskobj->dp, - &efi_block_io_guid, &diskobj->ops, NULL)); + &efi_block_io_guid, &diskobj->ops, + guid, NULL, NULL)); if (ret != EFI_SUCCESS) return ret; @@ -467,13 +472,7 @@ static efi_status_t efi_disk_add_dev( /* Store first EFI system partition */ if (part && !efi_system_partition.if_type) { - int r; - struct disk_partition info; - - r = part_get_info(desc, part, &info); - if (r) - return EFI_DEVICE_ERROR; - if (info.bootable & PART_EFI_SYSTEM_PARTITION) { + if (part_info->bootable & PART_EFI_SYSTEM_PARTITION) { efi_system_partition.if_type = desc->if_type; efi_system_partition.devnum = desc->devnum; efi_system_partition.part = part; diff --git a/lib/efi_loader/efi_dt_fixup.c b/lib/efi_loader/efi_dt_fixup.c index 3850ab3b0fe..6de57b84d20 100644 --- a/lib/efi_loader/efi_dt_fixup.c +++ b/lib/efi_loader/efi_dt_fixup.c @@ -110,6 +110,7 @@ efi_dt_fixup(struct efi_dt_fixup_protocol *this, void *dtb, { efi_status_t ret; size_t required_size; + size_t total_size; bootm_headers_t img = { 0 }; EFI_ENTRY("%p, %p, %p, %d", this, dtb, buffer_size, flags); @@ -124,20 +125,20 @@ efi_dt_fixup(struct efi_dt_fixup_protocol *this, void *dtb, goto out; } if (flags & EFI_DT_APPLY_FIXUPS) { + /* Check size */ required_size = fdt_off_dt_strings(dtb) + fdt_size_dt_strings(dtb) + 0x3000; - } else { - required_size = fdt_totalsize(dtb); - } - if (required_size > *buffer_size) { - *buffer_size = required_size; - ret = EFI_BUFFER_TOO_SMALL; - goto out; - } - fdt_set_totalsize(dtb, *buffer_size); + total_size = fdt_totalsize(dtb); + if (required_size < total_size) + required_size = total_size; + if (required_size > *buffer_size) { + *buffer_size = required_size; + ret = EFI_BUFFER_TOO_SMALL; + goto out; + } - if (flags & EFI_DT_APPLY_FIXUPS) { + fdt_set_totalsize(dtb, *buffer_size); if (image_setup_libfdt(&img, dtb, 0, NULL)) { log_err("failed to process device tree\n"); ret = EFI_INVALID_PARAMETER; @@ -147,10 +148,10 @@ efi_dt_fixup(struct efi_dt_fixup_protocol *this, void *dtb, if (flags & EFI_DT_RESERVE_MEMORY) efi_carve_out_dt_rsv(dtb); - if (EFI_DT_INSTALL_TABLE) { + if (flags & EFI_DT_INSTALL_TABLE) { ret = efi_install_configuration_table(&efi_guid_fdt, dtb); if (ret != EFI_SUCCESS) { - log_err("ERROR: failed to install device tree\n"); + log_err("failed to install device tree\n"); goto out; } } diff --git a/lib/efi_selftest/dtbdump.c b/lib/efi_selftest/dtbdump.c index 953b264d9d4..38ab9f8bf0e 100644 --- a/lib/efi_selftest/dtbdump.c +++ b/lib/efi_selftest/dtbdump.c @@ -9,6 +9,7 @@ #include <common.h> #include <efi_api.h> #include <efi_dt_fixup.h> +#include <part.h> #define BUFFER_SIZE 64 #define ESC 0x17 @@ -27,6 +28,7 @@ static efi_handle_t handle; static struct efi_system_table *systable; static const efi_guid_t efi_dt_fixup_protocol_guid = EFI_DT_FIXUP_PROTOCOL_GUID; static const efi_guid_t efi_file_info_guid = EFI_FILE_INFO_GUID; +static const efi_guid_t efi_system_partition_guid = PARTITION_SYSTEM_GUID; /** * print() - print string @@ -231,6 +233,52 @@ void do_help(void) } /** + * open_file_system() - open simple file system protocol + * + * file_system: interface of the simple file system protocol + * Return: status code + */ +static efi_status_t +open_file_system(struct efi_simple_file_system_protocol **file_system) +{ + struct efi_loaded_image *loaded_image; + efi_status_t ret; + efi_handle_t *handle_buffer = NULL; + efi_uintn_t count; + + ret = bs->open_protocol(handle, &loaded_image_guid, + (void **)&loaded_image, NULL, NULL, + EFI_OPEN_PROTOCOL_GET_PROTOCOL); + if (ret != EFI_SUCCESS) { + error(L"Loaded image protocol not found\r\n"); + return ret; + } + + /* Open the simple file system protocol on the same partition */ + ret = bs->open_protocol(loaded_image->device_handle, + &guid_simple_file_system_protocol, + (void **)file_system, NULL, NULL, + EFI_OPEN_PROTOCOL_GET_PROTOCOL); + if (ret == EFI_SUCCESS) + return ret; + + /* Open the simple file system protocol on the UEFI system partition */ + ret = bs->locate_handle_buffer(BY_PROTOCOL, &efi_system_partition_guid, + NULL, &count, &handle_buffer); + if (ret == EFI_SUCCESS && handle_buffer) + ret = bs->open_protocol(handle_buffer[0], + &guid_simple_file_system_protocol, + (void **)file_system, NULL, NULL, + EFI_OPEN_PROTOCOL_GET_PROTOCOL); + if (ret != EFI_SUCCESS) + error(L"Failed to open simple file system protocol\r\n"); + if (handle) + bs->free_pool(handle_buffer); + + return ret; +} + +/** * do_load() - load and install device-tree * * @filename: file name @@ -239,7 +287,6 @@ void do_help(void) efi_status_t do_load(u16 *filename) { struct efi_dt_fixup_protocol *dt_fixup_prot; - struct efi_loaded_image *loaded_image; struct efi_simple_file_system_protocol *file_system; struct efi_file_handle *root = NULL, *file = NULL; u64 addr = 0; @@ -258,22 +305,9 @@ efi_status_t do_load(u16 *filename) filename = skip_whitespace(filename); - ret = bs->open_protocol(handle, &loaded_image_guid, - (void **)&loaded_image, NULL, NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL); - if (ret != EFI_SUCCESS) { - error(L"Loaded image protocol not found\r\n"); - return ret; - } - /* Open the simple file system protocol */ - ret = bs->open_protocol(loaded_image->device_handle, - &guid_simple_file_system_protocol, - (void **)&file_system, NULL, NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL); - if (ret != EFI_SUCCESS) { - error(L"Failed to open simple file system protocol\r\n"); + ret = open_file_system(&file_system); + if (ret != EFI_SUCCESS) goto out; - } /* Open volume */ ret = file_system->open_volume(file_system, &root); @@ -389,7 +423,6 @@ out: */ efi_status_t do_save(u16 *filename) { - struct efi_loaded_image *loaded_image; struct efi_simple_file_system_protocol *file_system; efi_uintn_t dtb_size; struct efi_file_handle *root, *file; @@ -409,23 +442,9 @@ efi_status_t do_save(u16 *filename) filename = skip_whitespace(filename); - ret = bs->open_protocol(handle, &loaded_image_guid, - (void **)&loaded_image, NULL, NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL); - if (ret != EFI_SUCCESS) { - error(L"Loaded image protocol not found\r\n"); - return ret; - } - - /* Open the simple file system protocol */ - ret = bs->open_protocol(loaded_image->device_handle, - &guid_simple_file_system_protocol, - (void **)&file_system, NULL, NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL); - if (ret != EFI_SUCCESS) { - error(L"Failed to open simple file system protocol\r\n"); + ret = open_file_system(&file_system); + if (ret != EFI_SUCCESS) return ret; - } /* Open volume */ ret = file_system->open_volume(file_system, &root); |