From 4774c79da088226aa7d5cfe52ae073285422d534 Mon Sep 17 00:00:00 2001 From: Victor Sun Date: Tue, 8 Jun 2021 16:23:08 +0800 Subject: [PATCH] HV: modularizatoin: refine efi_info struct usage in acrn boot info This patch has below changes: 1. rename mi_efi_info to uefi_info in struct acrn_boot_info; 2. remove redundant "efi_" prefix for efi_info struct members; 3. The efi_info structure in acrn_boot_info struct is defined as same as Linux kernel so the native efi info from boot loader is passed to SOS zeropage with memcpy() api directly. Now replace memcpy() with detailed struct member assignment; 4. add boot_from_uefi() api; Tracked-On: #5661 Signed-off-by: Victor Sun Reviewed-by: Jason Chen CJ --- hypervisor/boot/boot.c | 4 +--- hypervisor/boot/include/boot.h | 7 ++++++- hypervisor/boot/multiboot/multiboot2.c | 16 +++++++--------- hypervisor/common/vm_load.c | 14 ++++++++++++-- hypervisor/include/lib/efi.h | 16 ++++++++-------- 5 files changed, 34 insertions(+), 23 deletions(-) diff --git a/hypervisor/boot/boot.c b/hypervisor/boot/boot.c index 9933e842d..9089ff4d1 100644 --- a/hypervisor/boot/boot.c +++ b/hypervisor/boot/boot.c @@ -33,9 +33,7 @@ int32_t sanitize_acrn_boot_info(struct acrn_boot_info *abi) abi_status = -EINVAL; } - if ((abi->mi_efi_info.efi_systab == 0U) && (abi->mi_efi_info.efi_systab_hi == 0U)) { - pr_err("no uefi info found!"); - } + printf("%s environment detected.\n", boot_from_uefi(abi) ? "UEFI" : "Non-UEFI"); if (abi->loader_name[0] == '\0') { pr_err("no bootloader name found!"); diff --git a/hypervisor/boot/include/boot.h b/hypervisor/boot/include/boot.h index 5ecf56eb0..679217360 100644 --- a/hypervisor/boot/include/boot.h +++ b/hypervisor/boot/include/boot.h @@ -57,9 +57,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 efi_info uefi_info; }; +static inline bool boot_from_uefi(struct acrn_boot_info *abi) +{ + return !((abi->uefi_info.systab == 0U) && (abi->uefi_info.systab_hi == 0U)); +} + int32_t init_multiboot_info(uint32_t *registers); void init_acrn_boot_info(uint32_t *registers); diff --git a/hypervisor/boot/multiboot/multiboot2.c b/hypervisor/boot/multiboot/multiboot2.c index 50a6ab208..2420bc45f 100644 --- a/hypervisor/boot/multiboot/multiboot2.c +++ b/hypervisor/boot/multiboot/multiboot2.c @@ -52,10 +52,8 @@ static void mb2_mods_to_abi(struct acrn_boot_info *abi, */ 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; + abi->uefi_info.systab = (uint32_t)(uint64_t)mb2_tag_efi64->pointer; + abi->uefi_info.systab_hi = (uint32_t)((uint64_t)mb2_tag_efi64->pointer >> 32U); } /** @@ -64,11 +62,11 @@ static void mb2_efi64_to_abi(struct acrn_boot_info *abi, const struct multiboot2 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->uefi_info.memdesc_size = mb2_tag_efimmap->descr_size; + abi->uefi_info.memdesc_version = mb2_tag_efimmap->descr_vers; + abi->uefi_info.memmap = (uint32_t)(uint64_t)mb2_tag_efimmap->efi_mmap; + abi->uefi_info.memmap_size = mb2_tag_efimmap->size - 16U; + abi->uefi_info.memmap_hi = (uint32_t)(((uint64_t)mb2_tag_efimmap->efi_mmap) >> 32U); } /** diff --git a/hypervisor/common/vm_load.c b/hypervisor/common/vm_load.c index a7cfadce7..35fa6ccc1 100644 --- a/hypervisor/common/vm_load.c +++ b/hypervisor/common/vm_load.c @@ -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->loader_signature = 0x34364c45; /* "EL64" */ + sos_efi_info->memdesc_version = abi->uefi_info.memdesc_version; + sos_efi_info->memdesc_size = abi->uefi_info.memdesc_size; + sos_efi_info->memmap_size = abi->uefi_info.memmap_size; + sos_efi_info->memmap = abi->uefi_info.memmap; + sos_efi_info->memmap_hi = abi->uefi_info.memmap_hi; + sos_efi_info->systab = abi->uefi_info.systab; + sos_efi_info->systab_hi = abi->uefi_info.systab_hi; + } } #endif /* copy part of the header into the zero page */ diff --git a/hypervisor/include/lib/efi.h b/hypervisor/include/lib/efi.h index ab35da076..b420b2ad6 100644 --- a/hypervisor/include/lib/efi.h +++ b/hypervisor/include/lib/efi.h @@ -8,14 +8,14 @@ #define EFI_H struct efi_info { - uint32_t efi_loader_signature; /* 0x1c0 */ - uint32_t efi_systab; /* 0x1c4 */ - uint32_t efi_memdesc_size; /* 0x1c8 */ - uint32_t efi_memdesc_version; /* 0x1cc */ - uint32_t efi_memmap; /* 0x1d0 */ - uint32_t efi_memmap_size; /* 0x1d4 */ - uint32_t efi_systab_hi; /* 0x1d8 */ - uint32_t efi_memmap_hi; /* 0x1dc */ + uint32_t loader_signature; /* 0x1c0 */ + uint32_t systab; /* 0x1c4 */ + uint32_t memdesc_size; /* 0x1c8 */ + uint32_t memdesc_version; /* 0x1cc */ + uint32_t memmap; /* 0x1d0 */ + uint32_t memmap_size; /* 0x1d4 */ + uint32_t systab_hi; /* 0x1d8 */ + uint32_t memmap_hi; /* 0x1dc */ } __packed; #endif