From 82a1d4406c8cf5ffe93d7c73c7f483a455f879aa Mon Sep 17 00:00:00 2001 From: Victor Sun Date: Tue, 8 Jun 2021 15:22:46 +0800 Subject: [PATCH] HV: modularization: use abi_mmap struct in acrn boot info Use more generic abi_mmap struct to replace multiboot_mmap struct in acrn_boot_info; Tracked-On: #5661 Signed-off-by: Victor Sun Reviewed-by: Jason Chen CJ --- hypervisor/arch/x86/e820.c | 6 +++--- hypervisor/boot/boot.c | 2 +- hypervisor/boot/include/boot.h | 17 +++++++++++++++-- hypervisor/boot/multiboot/multiboot.c | 19 ++++++++++--------- hypervisor/boot/multiboot/multiboot2.c | 14 +++++++------- 5 files changed, 36 insertions(+), 22 deletions(-) diff --git a/hypervisor/arch/x86/e820.c b/hypervisor/arch/x86/e820.c index cb9391d31..4a3edefd3 100644 --- a/hypervisor/arch/x86/e820.c +++ b/hypervisor/arch/x86/e820.c @@ -104,12 +104,12 @@ void init_e820(void) uint64_t top_addr_space = CONFIG_PLATFORM_RAM_SIZE + PLATFORM_LO_MMIO_SIZE; struct acrn_boot_info *abi = get_acrn_boot_info(); - struct multiboot_mmap *mmap = abi->mi_mmap_entry; + struct abi_mmap *mmap = abi->mmap_entry; - hv_e820_entries_nr = abi->mi_mmap_entries; + hv_e820_entries_nr = abi->mmap_entries; dev_dbg(DBG_LEVEL_E820, "mmap addr 0x%x entries %d\n", - abi->mi_mmap_entry, hv_e820_entries_nr); + abi->mmap_entry, hv_e820_entries_nr); for (i = 0U; i < hv_e820_entries_nr; i++) { diff --git a/hypervisor/boot/boot.c b/hypervisor/boot/boot.c index e06e8ef9e..9933e842d 100644 --- a/hypervisor/boot/boot.c +++ b/hypervisor/boot/boot.c @@ -28,7 +28,7 @@ int32_t sanitize_acrn_boot_info(struct acrn_boot_info *abi) abi_status = -EINVAL; } - if (abi->mi_mmap_entries == 0U) { + if (abi->mmap_entries == 0U) { pr_err("no boot mmap info found"); abi_status = -EINVAL; } diff --git a/hypervisor/boot/include/boot.h b/hypervisor/boot/include/boot.h index 175e69f49..5ecf56eb0 100644 --- a/hypervisor/boot/include/boot.h +++ b/hypervisor/boot/include/boot.h @@ -31,6 +31,19 @@ struct abi_module { const char string[MAX_MOD_STRING_SIZE]; }; +/* ABI memory map types, compatible to Multiboot/Multiboot2/E820; */ +#define MMAP_TYPE_RAM 1U +#define MMAP_TYPE_RESERVED 2U +#define MMAP_TYPE_ACPI_RECLAIM 3U +#define MMAP_TYPE_ACPI_NVS 4U +#define MMAP_TYPE_UNUSABLE 5U + +struct abi_mmap { + uint64_t baseaddr; + uint64_t length; + uint32_t type; +}; + struct acrn_boot_info { char protocol_name[MAX_PROTOCOL_NAME_SIZE]; @@ -40,8 +53,8 @@ struct acrn_boot_info { uint32_t mods_count; struct abi_module mods[MAX_MODULE_NUM]; - uint32_t mi_mmap_entries; - struct multiboot_mmap mi_mmap_entry[MAX_MMAP_ENTRIES]; + uint32_t mmap_entries; + struct abi_mmap mmap_entry[MAX_MMAP_ENTRIES]; const void *mi_acpi_rsdp_va; struct efi_info mi_efi_info; diff --git a/hypervisor/boot/multiboot/multiboot.c b/hypervisor/boot/multiboot/multiboot.c index 35eaacb66..e3a024ee2 100644 --- a/hypervisor/boot/multiboot/multiboot.c +++ b/hypervisor/boot/multiboot/multiboot.c @@ -26,20 +26,21 @@ int32_t multiboot_to_acrn_bi(struct acrn_boot_info *abi, void *mb_info) { (char *)hpa2hva_early((uint64_t)mbi->mi_loader_name), strnlen_s((char *)hpa2hva_early((uint64_t)mbi->mi_loader_name), (MAX_LOADER_NAME_SIZE - 1U))); - abi->mi_mmap_entries = mbi->mi_mmap_length / sizeof(struct multiboot_mmap); + abi->mmap_entries = mbi->mi_mmap_length / sizeof(struct multiboot_mmap); - if (((mbi->mi_flags & MULTIBOOT_INFO_HAS_MMAP) != 0U) && (abi->mi_mmap_entries != 0U) && (mmap != NULL)) { + if (((mbi->mi_flags & MULTIBOOT_INFO_HAS_MMAP) != 0U) && (abi->mmap_entries != 0U) && (mmap != NULL)) { - if (abi->mi_mmap_entries > MAX_MMAP_ENTRIES) { - abi->mi_mmap_entries = MAX_MMAP_ENTRIES; + if (abi->mmap_entries > MAX_MMAP_ENTRIES) { + abi->mmap_entries = MAX_MMAP_ENTRIES; } - (void)memcpy_s((void *)(&abi->mi_mmap_entry[0]), - (abi->mi_mmap_entries * sizeof(struct multiboot_mmap)), - mmap, (abi->mi_mmap_entries * sizeof(struct multiboot_mmap))); - + for (i = 0U; i < abi->mmap_entries; i++) { + abi->mmap_entry[i].baseaddr = (mmap + i)->baseaddr; + abi->mmap_entry[i].length = (mmap + i)->length; + abi->mmap_entry[i].type = (mmap + i)->type; + } } else { - abi->mi_mmap_entries = 0U; + abi->mmap_entries = 0U; } abi->mods_count = mbi->mi_mods_count; diff --git a/hypervisor/boot/multiboot/multiboot2.c b/hypervisor/boot/multiboot/multiboot2.c index a4af6a176..50a6ab208 100644 --- a/hypervisor/boot/multiboot/multiboot2.c +++ b/hypervisor/boot/multiboot/multiboot2.c @@ -19,15 +19,15 @@ static void mb2_mmap_to_abi(struct acrn_boot_info *abi, const struct multiboot2_ struct multiboot2_mmap_entry *mb2_mmap = (struct multiboot2_mmap_entry *)mb2_tag_mmap->entries; /* multiboot2 mmap tag header occupied 16 bytes */ - abi->mi_mmap_entries = (mb2_tag_mmap->size - 16U) / sizeof(struct multiboot2_mmap_entry); - if (abi->mi_mmap_entries > MAX_MMAP_ENTRIES) { - abi->mi_mmap_entries = MAX_MMAP_ENTRIES; + abi->mmap_entries = (mb2_tag_mmap->size - 16U) / sizeof(struct multiboot2_mmap_entry); + if (abi->mmap_entries > MAX_MMAP_ENTRIES) { + abi->mmap_entries = MAX_MMAP_ENTRIES; } - for (i = 0U; i < abi->mi_mmap_entries; i++) { - abi->mi_mmap_entry[i].baseaddr = (mb2_mmap + i)->addr; - abi->mi_mmap_entry[i].length = (mb2_mmap + i)->len; - abi->mi_mmap_entry[i].type = (mb2_mmap + i)->type; + for (i = 0U; i < abi->mmap_entries; i++) { + abi->mmap_entry[i].baseaddr = (mb2_mmap + i)->addr; + abi->mmap_entry[i].length = (mb2_mmap + i)->len; + abi->mmap_entry[i].type = (mb2_mmap + i)->type; } }