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