mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-19 20:22:46 +00:00
HV: modularizatoin: use abi_efi_info struct in acrn boot info
Previousely the efi_info structure in acrn_boot_info struct is defined as same as Linux kernel so that the native efi info from host could be passed to SOS zeropage with memcpy() api directly. Now replace it with abi_efi_info struct to make the content more generic; Tracked-On: #5661 Signed-off-by: Victor Sun <victor.sun@intel.com> Reviewed-by: Jason Chen CJ <jason.cj.chen@intel.com>
This commit is contained in:
parent
57d7225901
commit
c09e55c376
@ -6,7 +6,7 @@
|
||||
|
||||
#include <types.h>
|
||||
#include <errno.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/mmu.h>
|
||||
#include <boot.h>
|
||||
#include <rtl.h>
|
||||
#include <logmsg.h>
|
||||
@ -39,11 +39,7 @@ int32_t sanitize_acrn_boot_info(struct acrn_boot_info *abi)
|
||||
abi_status = -EINVAL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MULTIBOOT2
|
||||
if ((abi->mi_efi_info.efi_systab == 0U) && (abi->mi_efi_info.efi_systab_hi == 0U)) {
|
||||
pr_err("no multiboot2 uefi info found!");
|
||||
}
|
||||
#endif
|
||||
printf("%s environment detected.\n", boot_from_uefi(abi) ? "UEFI" : "Non-UEFI");
|
||||
|
||||
if (abi->loader_name[0] == '\0') {
|
||||
pr_err("no bootloader name found!");
|
||||
|
@ -43,6 +43,14 @@ struct abi_mmap {
|
||||
uint32_t type;
|
||||
};
|
||||
|
||||
struct abi_efi_info {
|
||||
const void *system_table;
|
||||
const void *memmap;
|
||||
uint32_t memmap_size;
|
||||
uint32_t memdesc_size;
|
||||
uint32_t memdesc_version;
|
||||
};
|
||||
|
||||
struct acrn_boot_info {
|
||||
|
||||
const char cmdline[MAX_BOOTARGS_SIZE];
|
||||
@ -55,9 +63,14 @@ struct acrn_boot_info {
|
||||
struct abi_mmap mmap_entry[MAX_MMAP_ENTRIES];
|
||||
|
||||
const void *mi_acpi_rsdp_va;
|
||||
struct efi_info mi_efi_info;
|
||||
struct abi_efi_info efi_info;
|
||||
};
|
||||
|
||||
static inline bool boot_from_uefi(struct acrn_boot_info *abi)
|
||||
{
|
||||
return (abi->efi_info.system_table != NULL);
|
||||
}
|
||||
|
||||
int32_t init_multiboot_info(uint32_t *registers);
|
||||
int32_t init_multiboot2_info(uint32_t *registers);
|
||||
|
||||
|
@ -47,28 +47,16 @@ static void mb2_mods_to_abi(struct acrn_boot_info *abi,
|
||||
strnlen_s((char *)hpa2hva_early((uint64_t)mb2_tag_mods->cmdline), MAX_MOD_STRING_SIZE));
|
||||
}
|
||||
|
||||
/**
|
||||
* @pre abi != NULL && mb2_tag_efi64 != 0
|
||||
*/
|
||||
static void mb2_efi64_to_abi(struct acrn_boot_info *abi, const struct multiboot2_tag_efi64 *mb2_tag_efi64)
|
||||
{
|
||||
const uint32_t efiloader_sig = 0x34364c45; /* "EL64" */
|
||||
abi->mi_efi_info.efi_systab = (uint32_t)(uint64_t)mb2_tag_efi64->pointer;
|
||||
abi->mi_efi_info.efi_systab_hi = (uint32_t)((uint64_t)mb2_tag_efi64->pointer >> 32U);
|
||||
abi->mi_efi_info.efi_loader_signature = efiloader_sig;
|
||||
}
|
||||
|
||||
/**
|
||||
* @pre abi != NULL && mb2_tag_efimmap != 0
|
||||
*/
|
||||
static void mb2_efimmap_to_abi(struct acrn_boot_info *abi,
|
||||
const struct multiboot2_tag_efi_mmap *mb2_tag_efimmap)
|
||||
{
|
||||
abi->mi_efi_info.efi_memdesc_size = mb2_tag_efimmap->descr_size;
|
||||
abi->mi_efi_info.efi_memdesc_version = mb2_tag_efimmap->descr_vers;
|
||||
abi->mi_efi_info.efi_memmap = (uint32_t)(uint64_t)mb2_tag_efimmap->efi_mmap;
|
||||
abi->mi_efi_info.efi_memmap_size = mb2_tag_efimmap->size - 16U;
|
||||
abi->mi_efi_info.efi_memmap_hi = (uint32_t)(((uint64_t)mb2_tag_efimmap->efi_mmap) >> 32U);
|
||||
abi->efi_info.memmap_size = mb2_tag_efimmap->size - 16U;
|
||||
abi->efi_info.memdesc_size = mb2_tag_efimmap->descr_size;
|
||||
abi->efi_info.memdesc_version = mb2_tag_efimmap->descr_vers;
|
||||
abi->efi_info.memmap = mb2_tag_efimmap->efi_mmap;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -111,7 +99,7 @@ int32_t multiboot2_to_acrn_bi(struct acrn_boot_info *abi, void *mb2_info)
|
||||
abi->mi_acpi_rsdp_va = ((struct multiboot2_tag_new_acpi *)mb2_tag)->rsdp;
|
||||
break;
|
||||
case MULTIBOOT2_TAG_TYPE_EFI64:
|
||||
mb2_efi64_to_abi(abi, (const struct multiboot2_tag_efi64 *)mb2_tag);
|
||||
abi->efi_info.system_table = (void *)((struct multiboot2_tag_efi64 *)mb2_tag)->pointer;
|
||||
break;
|
||||
case MULTIBOOT2_TAG_TYPE_EFI_MMAP:
|
||||
mb2_efimmap_to_abi(abi, (const struct multiboot2_tag_efi_mmap *)mb2_tag);
|
||||
|
@ -75,8 +75,18 @@ static uint64_t create_zero_page(struct acrn_vm *vm)
|
||||
if (is_sos_vm(vm)) {
|
||||
struct acrn_boot_info *abi = get_acrn_boot_info();
|
||||
|
||||
(void)memcpy_s(&(zeropage->boot_efi_info), sizeof(zeropage->boot_efi_info),
|
||||
&(abi->mi_efi_info), sizeof(abi->mi_efi_info));
|
||||
if (boot_from_uefi(abi)) {
|
||||
struct efi_info *sos_efi_info = &zeropage->boot_efi_info;
|
||||
|
||||
sos_efi_info->efi_loader_signature = 0x34364c45; /* "EL64" */
|
||||
sos_efi_info->efi_memdesc_version = abi->efi_info.memdesc_version;
|
||||
sos_efi_info->efi_memdesc_size = abi->efi_info.memdesc_size;
|
||||
sos_efi_info->efi_memmap_size = abi->efi_info.memmap_size;
|
||||
sos_efi_info->efi_memmap = (uint32_t)(uint64_t)abi->efi_info.memmap;
|
||||
sos_efi_info->efi_memmap_hi = (uint32_t)((uint64_t)abi->efi_info.memmap >> 32U);
|
||||
sos_efi_info->efi_systab = (uint32_t)(uint64_t)abi->efi_info.system_table;
|
||||
sos_efi_info->efi_systab_hi = (uint32_t)((uint64_t)abi->efi_info.system_table >> 32U);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* copy part of the header into the zero page */
|
||||
|
Loading…
Reference in New Issue
Block a user