Pull request for efi-2022-04-rc1

Documentation:

* Fix building HTML documentation of readthedocs.io
* Add ARM Juno board documentation
* Build requirements for Alpine Linux
* Include DM headers in API documentation

UEFI:

* Fix section alignment of EFI binaries
* Fix header length of RISC-V EFI binaries allowing to run them on EDK II
* Remove kaslr-seed from device tree if the EFI_RNG_PROTOCOL is provided

Other:

* Let 'part list' show all 128 GPT partitions
This commit is contained in:
Tom Rini
2022-01-15 07:39:09 -05:00
49 changed files with 1059 additions and 670 deletions

View File

@@ -58,7 +58,7 @@ obj-$(CONFIG_CMD_EXTENSION) += extension_board.o
obj-$(CONFIG_CMD_ECHO) += echo.o
obj-$(CONFIG_ENV_IS_IN_EEPROM) += eeprom.o
obj-$(CONFIG_CMD_EEPROM) += eeprom.o
obj-$(CONFIG_EFI_STUB) += efi.o
obj-$(CONFIG_EFI) += efi.o
obj-$(CONFIG_CMD_EFIDEBUG) += efidebug.o
obj-$(CONFIG_CMD_ELF) += elf.o
obj-$(CONFIG_HUSH_PARSER) += exit.o

View File

@@ -310,6 +310,8 @@ efi_status_t efi_install_fdt(void *fdt)
/* Create memory reservations as indicated by the device tree */
efi_carve_out_dt_rsv(fdt);
efi_try_purge_kaslr_seed(fdt);
/* Install device tree as UEFI table */
ret = efi_install_configuration_table(&efi_guid_fdt, fdt);
if (ret != EFI_SUCCESS) {

View File

@@ -13,6 +13,8 @@
#include <sort.h>
#include <asm/global_data.h>
DECLARE_GLOBAL_DATA_PTR;
static const char *const type_name[] = {
"reserved",
"loader_code",
@@ -75,16 +77,17 @@ static int h_cmp_entry(const void *v1, const void *v2)
/**
* efi_build_mem_table() - make a sorted copy of the memory table
*
* @map: Pointer to EFI memory map table
* @desc_base: Pointer to EFI memory map table
* @size: Size of table in bytes
* @desc_size: Size of each @desc_base record
* @skip_bs: True to skip boot-time memory and merge it with conventional
* memory. This will significantly reduce the number of table
* entries.
* Return: pointer to the new table. It should be freed with free() by the
* caller.
*/
static void *efi_build_mem_table(struct efi_entry_memmap *map, int size,
bool skip_bs)
static void *efi_build_mem_table(struct efi_mem_desc *desc_base, int size,
int desc_size, bool skip_bs)
{
struct efi_mem_desc *desc, *end, *base, *dest, *prev;
int count;
@@ -95,15 +98,16 @@ static void *efi_build_mem_table(struct efi_entry_memmap *map, int size,
debug("%s: Cannot allocate %#x bytes\n", __func__, size);
return NULL;
}
end = (struct efi_mem_desc *)((ulong)map + size);
count = ((ulong)end - (ulong)map->desc) / map->desc_size;
memcpy(base, map->desc, (ulong)end - (ulong)map->desc);
qsort(base, count, map->desc_size, h_cmp_entry);
end = (void *)desc_base + size;
count = ((ulong)end - (ulong)desc_base) / desc_size;
memcpy(base, desc_base, (ulong)end - (ulong)desc_base);
qsort(base, count, desc_size, h_cmp_entry);
prev = NULL;
addr = 0;
dest = base;
end = (struct efi_mem_desc *)((ulong)base + count * map->desc_size);
for (desc = base; desc < end; desc = efi_get_next_mem_desc(map, desc)) {
end = (struct efi_mem_desc *)((ulong)base + count * desc_size);
for (desc = base; desc < end;
desc = efi_get_next_mem_desc(desc, desc_size)) {
bool merge = true;
u32 type = desc->type;
@@ -116,7 +120,7 @@ static void *efi_build_mem_table(struct efi_entry_memmap *map, int size,
if (skip_bs && is_boot_services(desc->type))
type = EFI_CONVENTIONAL_MEMORY;
memcpy(dest, desc, map->desc_size);
memcpy(dest, desc, desc_size);
dest->type = type;
if (!skip_bs || !prev)
merge = false;
@@ -131,7 +135,7 @@ static void *efi_build_mem_table(struct efi_entry_memmap *map, int size,
prev->num_pages += desc->num_pages;
} else {
prev = dest;
dest = efi_get_next_mem_desc(map, dest);
dest = efi_get_next_mem_desc(dest, desc_size);
}
addr = desc->physical_start + (desc->num_pages <<
EFI_PAGE_SHIFT);
@@ -143,8 +147,8 @@ static void *efi_build_mem_table(struct efi_entry_memmap *map, int size,
return base;
}
static void efi_print_mem_table(struct efi_entry_memmap *map,
struct efi_mem_desc *desc, bool skip_bs)
static void efi_print_mem_table(struct efi_mem_desc *desc, int desc_size,
bool skip_bs)
{
u64 attr_seen[ATTR_SEEN_MAX];
int attr_seen_count;
@@ -158,7 +162,7 @@ static void efi_print_mem_table(struct efi_entry_memmap *map,
attr_seen_count = 0;
addr = 0;
for (upto = 0; desc->type != EFI_MAX_MEMORY_TYPE;
upto++, desc = efi_get_next_mem_desc(map, desc)) {
upto++, desc = efi_get_next_mem_desc(desc, desc_size)) {
const char *name;
u64 size;
@@ -215,37 +219,53 @@ static void efi_print_mem_table(struct efi_entry_memmap *map,
static int do_efi_mem(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
struct efi_mem_desc *desc;
struct efi_entry_memmap *map;
struct efi_mem_desc *orig, *desc;
uint version, key;
int desc_size;
int size, ret;
bool skip_bs;
skip_bs = !argc || *argv[0] != 'a';
ret = efi_info_get(EFIET_MEMORY_MAP, (void **)&map, &size);
switch (ret) {
case -ENOENT:
printf("No EFI table available\n");
goto done;
case -EPROTONOSUPPORT:
printf("Incorrect EFI table version\n");
goto done;
if (IS_ENABLED(CONFIG_EFI_APP)) {
ret = efi_get_mmap(&orig, &size, &key, &desc_size, &version);
if (ret) {
printf("Cannot read memory map (err=%d)\n", ret);
return CMD_RET_FAILURE;
}
} else {
struct efi_entry_memmap *map;
ret = efi_info_get(EFIET_MEMORY_MAP, (void **)&map, &size);
switch (ret) {
case -ENOENT:
printf("No EFI table available\n");
goto done;
case -EPROTONOSUPPORT:
printf("Incorrect EFI table version\n");
goto done;
}
orig = map->desc;
desc_size = map->desc_size;
version = map->version;
}
printf("EFI table at %lx, memory map %p, size %x, version %x, descr. size %#x\n",
gd->arch.table, map, size, map->version, map->desc_size);
if (map->version != EFI_MEM_DESC_VERSION) {
printf("EFI table at %lx, memory map %p, size %x, key %x, version %x, descr. size %#x\n",
gd->arch.table, orig, size, key, version, desc_size);
if (version != EFI_MEM_DESC_VERSION) {
printf("Incorrect memory map version\n");
ret = -EPROTONOSUPPORT;
goto done;
}
desc = efi_build_mem_table(map, size, skip_bs);
desc = efi_build_mem_table(orig, size, desc_size, skip_bs);
if (!desc) {
ret = -ENOMEM;
goto done;
}
efi_print_mem_table(map, desc, skip_bs);
efi_print_mem_table(desc, desc_size, skip_bs);
free(desc);
if (IS_ENABLED(CONFIG_EFI_APP))
free(orig);
done:
if (ret)
printf("Error: %d\n", ret);

View File

@@ -89,10 +89,10 @@ static int do_part_list(int argc, char *const argv[])
if (var != NULL) {
int p;
char str[512] = { '\0', };
char str[3 * MAX_SEARCH_PARTITIONS] = { '\0', };
struct disk_partition info;
for (p = 1; p < MAX_SEARCH_PARTITIONS; p++) {
for (p = 1; p <= MAX_SEARCH_PARTITIONS; p++) {
char t[5];
int r = part_get_info(desc, p, &info);