efi: clean up efi command

* Eliminate superfluous enum value EFI_TABLE_END.
* Use correct variable type for the memory type.
* Check validity of memory type.
* Make efi_build_mem_table static.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
Heinrich Schuchardt 2020-08-27 12:39:03 +02:00
parent 0f7878b853
commit 5b94e26f1a
2 changed files with 22 additions and 18 deletions

View file

@ -71,7 +71,19 @@ static int h_cmp_entry(const void *v1, const void *v2)
return diff < 0 ? -1 : diff > 0 ? 1 : 0; return diff < 0 ? -1 : diff > 0 ? 1 : 0;
} }
void *efi_build_mem_table(struct efi_entry_memmap *map, int size, bool skip_bs) /**
* efi_build_mem_table() - make a sorted copy of the memory table
*
* @map: Pointer to EFI memory map table
* @size: Size of table in bytes
* @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)
{ {
struct efi_mem_desc *desc, *end, *base, *dest, *prev; struct efi_mem_desc *desc, *end, *base, *dest, *prev;
int count; int count;
@ -92,7 +104,13 @@ void *efi_build_mem_table(struct efi_entry_memmap *map, int size, bool skip_bs)
end = (struct efi_mem_desc *)((ulong)base + count * map->desc_size); end = (struct efi_mem_desc *)((ulong)base + count * map->desc_size);
for (desc = base; desc < end; desc = efi_get_next_mem_desc(map, desc)) { for (desc = base; desc < end; desc = efi_get_next_mem_desc(map, desc)) {
bool merge = true; bool merge = true;
int type = desc->type; u32 type = desc->type;
if (type >= EFI_MAX_MEMORY_TYPE) {
printf("Memory map contains invalid entry type %u\n",
type);
continue;
}
if (skip_bs && is_boot_services(desc->type)) if (skip_bs && is_boot_services(desc->type))
type = EFI_CONVENTIONAL_MEMORY; type = EFI_CONVENTIONAL_MEMORY;
@ -119,7 +137,7 @@ void *efi_build_mem_table(struct efi_entry_memmap *map, int size, bool skip_bs)
} }
/* Mark the end */ /* Mark the end */
dest->type = EFI_TABLE_END; dest->type = EFI_MAX_MEMORY_TYPE;
return base; return base;
} }
@ -138,7 +156,7 @@ static void efi_print_mem_table(struct efi_entry_memmap *map,
/* Keep track of all the different attributes we have seen */ /* Keep track of all the different attributes we have seen */
attr_seen_count = 0; attr_seen_count = 0;
addr = 0; addr = 0;
for (upto = 0; desc->type != EFI_TABLE_END; 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(map, desc)) {
const char *name; const char *name;
u64 size; u64 size;

View file

@ -180,7 +180,6 @@ enum efi_mem_type {
EFI_PERSISTENT_MEMORY_TYPE, EFI_PERSISTENT_MEMORY_TYPE,
EFI_MAX_MEMORY_TYPE, EFI_MAX_MEMORY_TYPE,
EFI_TABLE_END, /* For efi_build_mem_table() */
}; };
/* Attribute values */ /* Attribute values */
@ -481,17 +480,4 @@ void efi_putc(struct efi_priv *priv, const char ch);
*/ */
int efi_info_get(enum efi_entry_t type, void **datap, int *sizep); int efi_info_get(enum efi_entry_t type, void **datap, int *sizep);
/**
* efi_build_mem_table() - make a sorted copy of the memory table
*
* @map: Pointer to EFI memory map table
* @size: Size of table in bytes
* @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
*/
void *efi_build_mem_table(struct efi_entry_memmap *map, int size, bool skip_bs);
#endif /* _LINUX_EFI_H */ #endif /* _LINUX_EFI_H */