Merge tag 'efi-2022-04-rc1' of https://source.denx.de/u-boot/custodians/u-boot-efi
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:
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
78
cmd/efi.c
78
cmd/efi.c
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user