diff --git a/hypervisor/boot/boot.c b/hypervisor/boot/boot.c index 487bf5f85..919fb7662 100644 --- a/hypervisor/boot/boot.c +++ b/hypervisor/boot/boot.c @@ -6,7 +6,7 @@ #include #include -#include +#include #include #include #include @@ -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!"); diff --git a/hypervisor/boot/include/boot.h b/hypervisor/boot/include/boot.h index b8f5f7b08..c4ff1e30a 100644 --- a/hypervisor/boot/include/boot.h +++ b/hypervisor/boot/include/boot.h @@ -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); diff --git a/hypervisor/boot/multiboot/multiboot2.c b/hypervisor/boot/multiboot/multiboot2.c index 43cba7ca8..5e7f8f063 100644 --- a/hypervisor/boot/multiboot/multiboot2.c +++ b/hypervisor/boot/multiboot/multiboot2.c @@ -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); diff --git a/hypervisor/common/vm_load.c b/hypervisor/common/vm_load.c index a7cfadce7..6ef3ee96f 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->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 */