acrn-hypervisor/hypervisor/common/efi_mmap.c
Victor Sun 9ac8e292fd HV: add efi memory map parsing function
When hypervisor boot from efi environment, the efi memory layout should be
considered as main memory map reference for hypervisor use. This patch add
function that parses the efi memory descriptor entries info from efi memory
map pointer and stores the info into a static hv_memdesc[] array.

Tracked-On: #5626

Signed-off-by: Victor Sun <victor.sun@intel.com>
Reviewed-by: Jason Chen CJ <jason.cj.chen@intel.com>
2021-06-11 10:06:02 +08:00

72 lines
2.0 KiB
C

/*
* Copyright (C) 2021 Intel Corporation.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <types.h>
#include <boot.h>
#include <efi.h>
#include <efi_mmap.h>
#include <logmsg.h>
static uint16_t hv_memdesc_nr;
static struct efi_memory_desc hv_memdesc[MAX_EFI_MMAP_ENTRIES];
static void sort_efi_mmap_entries(void)
{
uint32_t i,j;
struct efi_memory_desc tmp_memdesc;
/* Bubble sort */
for (i = 0U; i < (hv_memdesc_nr - 1U); i++) {
for (j = 0U; j < (hv_memdesc_nr - i - 1U); j++) {
if (hv_memdesc[j].phys_addr > hv_memdesc[j + 1U].phys_addr) {
tmp_memdesc = hv_memdesc[j];
hv_memdesc[j] = hv_memdesc[j + 1U];
hv_memdesc[j + 1U] = tmp_memdesc;
}
}
}
}
void init_efi_mmap_entries(struct efi_info *uefi_info)
{
void *efi_memmap = (void *)((uint64_t)uefi_info->memmap | ((uint64_t)uefi_info->memmap_hi << 32U));
struct efi_memory_desc *efi_memdesc = (struct efi_memory_desc *)efi_memmap;
uint32_t entry = 0U;
while ((void *)efi_memdesc < (efi_memmap + uefi_info->memmap_size)) {
if (entry >= MAX_EFI_MMAP_ENTRIES) {
pr_err("Too many efi memmap entries, entries up %d are ignored.", MAX_EFI_MMAP_ENTRIES);
break;
}
hv_memdesc[entry] = *efi_memdesc;
/* Per UEFI spec, EFI_MEMORY_DESCRIPTOR array element returned in MemoryMap.
* The size is returned to allow for future expansion of the EFI_MEMORY_DESCRIPTOR
* in response to hardware innovation. The structure of the EFI_MEMORY_DESCRIPTOR
* may be extended in the future but it will remain backwards compatible with the
* current definition. Thus OS software must use the DescriptorSize to find the
* start of each EFI_MEMORY_DESCRIPTOR in the MemoryMap array.
*/
efi_memdesc = (struct efi_memory_desc *)((void *)efi_memdesc + uefi_info->memdesc_size);
entry ++;
}
hv_memdesc_nr = entry;
sort_efi_mmap_entries();
}
uint32_t get_efi_mmap_entries_count(void)
{
return hv_memdesc_nr;
}
const struct efi_memory_desc *get_efi_mmap_entry(void)
{
return hv_memdesc;
}