efi_loader: Move struct efi_mem_list fields together

We don't need a separate struct for the values in this node. Move
everything in together, so that there is just one struct to consider.

Add a comment about physical_start, so it is clear that it is really
a pointer.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass
2024-12-11 06:54:07 -07:00
parent f6f2ccdf34
commit 764b9ae523

View File

@@ -28,36 +28,29 @@ DECLARE_GLOBAL_DATA_PTR;
efi_uintn_t efi_memory_map_key;
/**
* struct priv_mem_desc - defines an memory region
* struct efi_mem_list - defines an EFI memory record
*
* Note that this struct is for use inside U-Boot and is not visible to the
* EFI application, other than through calls to efi_get_memory_map(), where this
* internal format is converted to the external struct efi_mem_desc format.
*
* @link: Link to prev/next node in list
* @type: EFI memory-type
* @physical_start: Start address of region in physical memory
* @physical_start: Start address of region in physical memory. Note that this
* is really a pointer stored as an address, so use map_to_sysmem() to
* convert it to an address if needed
* @num_pages: Number of EFI pages this record covers (each is EFI_PAGE_SIZE
* bytes)
* @attribute: Memory attributes (see EFI_MEMORY...)
*/
struct priv_mem_desc {
struct efi_mem_list {
struct list_head link;
enum efi_memory_type type;
efi_physical_addr_t physical_start;
u64 num_pages;
u64 attribute;
};
/**
* struct efi_mem_list - defines an EFI memory record
*
* @link: Link to prev/next node in list
* @desc: Memory information about this node
*/
struct efi_mem_list {
struct list_head link;
struct priv_mem_desc desc;
};
#define EFI_CARVE_NO_OVERLAP -1
#define EFI_CARVE_LOOP_AGAIN -2
#define EFI_CARVE_OVERLAPS_NONRAM -3
@@ -128,9 +121,9 @@ static int efi_mem_cmp(void *priv, struct list_head *a, struct list_head *b)
struct efi_mem_list *mema = list_entry(a, struct efi_mem_list, link);
struct efi_mem_list *memb = list_entry(b, struct efi_mem_list, link);
if (mema->desc.physical_start == memb->desc.physical_start)
if (mema->physical_start == memb->physical_start)
return 0;
else if (mema->desc.physical_start < memb->desc.physical_start)
else if (mema->physical_start < memb->physical_start)
return 1;
else
return -1;
@@ -139,12 +132,12 @@ static int efi_mem_cmp(void *priv, struct list_head *a, struct list_head *b)
/**
* desc_get_end() - get end address of memory area
*
* @desc: memory descriptor
* @node: memory node
* Return: end address + 1
*/
static uint64_t desc_get_end(struct priv_mem_desc *desc)
static uint64_t desc_get_end(struct efi_mem_list *node)
{
return desc->physical_start + (desc->num_pages << EFI_PAGE_SHIFT);
return node->physical_start + (node->num_pages << EFI_PAGE_SHIFT);
}
/**
@@ -164,8 +157,8 @@ static void efi_mem_sort(void)
while (merge_again) {
merge_again = false;
list_for_each_entry(lmem, &efi_mem, link) {
struct priv_mem_desc *prev;
struct priv_mem_desc *cur;
struct efi_mem_list *prev;
struct efi_mem_list *cur;
uint64_t pages;
if (!prevmem) {
@@ -173,8 +166,8 @@ static void efi_mem_sort(void)
continue;
}
cur = &lmem->desc;
prev = &prevmem->desc;
cur = lmem;
prev = prevmem;
if ((desc_get_end(cur) == prev->physical_start) &&
(prev->type == cur->type) &&
@@ -219,11 +212,11 @@ static void efi_mem_sort(void)
* to re-add the already carved out pages to the mapping.
*/
static s64 efi_mem_carve_out(struct efi_mem_list *map,
struct priv_mem_desc *carve_desc,
struct efi_mem_list *carve_desc,
bool overlap_conventional)
{
struct efi_mem_list *newmap;
struct priv_mem_desc *map_desc = &map->desc;
struct efi_mem_list *map_desc = map;
uint64_t map_start = map_desc->physical_start;
uint64_t map_end = map_start + (map_desc->num_pages << EFI_PAGE_SHIFT);
uint64_t carve_start = carve_desc->physical_start;
@@ -249,8 +242,8 @@ static s64 efi_mem_carve_out(struct efi_mem_list *map,
list_del(&map->link);
free(map);
} else {
map->desc.physical_start = carve_end;
map->desc.num_pages = (map_end - carve_end)
map->physical_start = carve_end;
map->num_pages = (map_end - carve_end)
>> EFI_PAGE_SHIFT;
}
@@ -268,10 +261,10 @@ static s64 efi_mem_carve_out(struct efi_mem_list *map,
newmap = calloc(1, sizeof(*newmap));
if (!newmap)
return EFI_CARVE_OUT_OF_RESOURCES;
newmap->desc.type = map->desc.type;
newmap->desc.physical_start = carve_start;
newmap->desc.num_pages = (map_end - carve_start) >> EFI_PAGE_SHIFT;
newmap->desc.attribute = map->desc.attribute;
newmap->type = map->type;
newmap->physical_start = carve_start;
newmap->num_pages = (map_end - carve_start) >> EFI_PAGE_SHIFT;
newmap->attribute = map->attribute;
/* Insert before current entry (descending address order) */
list_add_tail(&newmap->link, &map->link);
@@ -305,20 +298,20 @@ efi_status_t efi_add_memory_map_pg(u64 start, u64 pages,
newlist = calloc(1, sizeof(*newlist));
if (!newlist)
return EFI_OUT_OF_RESOURCES;
newlist->desc.type = memory_type;
newlist->desc.physical_start = start;
newlist->desc.num_pages = pages;
newlist->type = memory_type;
newlist->physical_start = start;
newlist->num_pages = pages;
switch (memory_type) {
case EFI_RUNTIME_SERVICES_CODE:
case EFI_RUNTIME_SERVICES_DATA:
newlist->desc.attribute = EFI_MEMORY_WB | EFI_MEMORY_RUNTIME;
newlist->attribute = EFI_MEMORY_WB | EFI_MEMORY_RUNTIME;
break;
case EFI_MMAP_IO:
newlist->desc.attribute = EFI_MEMORY_RUNTIME;
newlist->attribute = EFI_MEMORY_RUNTIME;
break;
default:
newlist->desc.attribute = EFI_MEMORY_WB;
newlist->attribute = EFI_MEMORY_WB;
break;
}
@@ -328,7 +321,7 @@ efi_status_t efi_add_memory_map_pg(u64 start, u64 pages,
list_for_each_entry(lmem, &efi_mem, link) {
s64 r;
r = efi_mem_carve_out(lmem, &newlist->desc,
r = efi_mem_carve_out(lmem, newlist,
overlap_conventional);
switch (r) {
case EFI_CARVE_OUT_OF_RESOURCES:
@@ -423,12 +416,12 @@ static efi_status_t efi_check_allocated(u64 addr, bool must_be_allocated)
struct efi_mem_list *item;
list_for_each_entry(item, &efi_mem, link) {
u64 start = item->desc.physical_start;
u64 end = start + (item->desc.num_pages << EFI_PAGE_SHIFT);
u64 start = item->physical_start;
u64 end = start + (item->num_pages << EFI_PAGE_SHIFT);
if (addr >= start && addr < end) {
if (must_be_allocated ^
(item->desc.type == EFI_CONVENTIONAL_MEMORY))
(item->type == EFI_CONVENTIONAL_MEMORY))
return EFI_SUCCESS;
else
return EFI_NOT_FOUND;
@@ -701,14 +694,14 @@ efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size,
/* Return the list in ascending order */
memory_map = &memory_map[map_entries - 1];
list_for_each_entry(lmem, &efi_mem, link) {
memory_map->type = lmem->desc.type;
memory_map->type = lmem->type;
memory_map->reserved = 0;
memory_map->physical_start = lmem->desc.physical_start;
memory_map->physical_start = lmem->physical_start;
/* virtual and physical are always the same */
memory_map->virtual_start = lmem->desc.physical_start;
memory_map->num_pages = lmem->desc.num_pages;
memory_map->attribute = lmem->desc.attribute;
memory_map->virtual_start = lmem->physical_start;
memory_map->num_pages = lmem->num_pages;
memory_map->attribute = lmem->attribute;
memory_map--;
}