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 <victor.sun@intel.com>
Reviewed-by: Jason Chen CJ <jason.cj.chen@intel.com>
This commit is contained in:
Victor Sun 2021-06-08 15:22:46 +08:00 committed by wenlingz
parent c59ea6c250
commit 82a1d4406c
5 changed files with 36 additions and 22 deletions

View File

@ -104,12 +104,12 @@ void init_e820(void)
uint64_t top_addr_space = CONFIG_PLATFORM_RAM_SIZE + PLATFORM_LO_MMIO_SIZE; uint64_t top_addr_space = CONFIG_PLATFORM_RAM_SIZE + PLATFORM_LO_MMIO_SIZE;
struct acrn_boot_info *abi = get_acrn_boot_info(); 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", 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++) { for (i = 0U; i < hv_e820_entries_nr; i++) {

View File

@ -28,7 +28,7 @@ int32_t sanitize_acrn_boot_info(struct acrn_boot_info *abi)
abi_status = -EINVAL; abi_status = -EINVAL;
} }
if (abi->mi_mmap_entries == 0U) { if (abi->mmap_entries == 0U) {
pr_err("no boot mmap info found"); pr_err("no boot mmap info found");
abi_status = -EINVAL; abi_status = -EINVAL;
} }

View File

@ -31,6 +31,19 @@ struct abi_module {
const char string[MAX_MOD_STRING_SIZE]; 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 { struct acrn_boot_info {
char protocol_name[MAX_PROTOCOL_NAME_SIZE]; char protocol_name[MAX_PROTOCOL_NAME_SIZE];
@ -40,8 +53,8 @@ struct acrn_boot_info {
uint32_t mods_count; uint32_t mods_count;
struct abi_module mods[MAX_MODULE_NUM]; struct abi_module mods[MAX_MODULE_NUM];
uint32_t mi_mmap_entries; uint32_t mmap_entries;
struct multiboot_mmap mi_mmap_entry[MAX_MMAP_ENTRIES]; struct abi_mmap mmap_entry[MAX_MMAP_ENTRIES];
const void *mi_acpi_rsdp_va; const void *mi_acpi_rsdp_va;
struct efi_info mi_efi_info; struct efi_info mi_efi_info;

View File

@ -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), (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))); 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) { if (abi->mmap_entries > MAX_MMAP_ENTRIES) {
abi->mi_mmap_entries = MAX_MMAP_ENTRIES; abi->mmap_entries = MAX_MMAP_ENTRIES;
} }
(void)memcpy_s((void *)(&abi->mi_mmap_entry[0]), for (i = 0U; i < abi->mmap_entries; i++) {
(abi->mi_mmap_entries * sizeof(struct multiboot_mmap)), abi->mmap_entry[i].baseaddr = (mmap + i)->baseaddr;
mmap, (abi->mi_mmap_entries * sizeof(struct multiboot_mmap))); abi->mmap_entry[i].length = (mmap + i)->length;
abi->mmap_entry[i].type = (mmap + i)->type;
}
} else { } else {
abi->mi_mmap_entries = 0U; abi->mmap_entries = 0U;
} }
abi->mods_count = mbi->mi_mods_count; abi->mods_count = mbi->mi_mods_count;

View File

@ -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; struct multiboot2_mmap_entry *mb2_mmap = (struct multiboot2_mmap_entry *)mb2_tag_mmap->entries;
/* multiboot2 mmap tag header occupied 16 bytes */ /* multiboot2 mmap tag header occupied 16 bytes */
abi->mi_mmap_entries = (mb2_tag_mmap->size - 16U) / sizeof(struct multiboot2_mmap_entry); abi->mmap_entries = (mb2_tag_mmap->size - 16U) / sizeof(struct multiboot2_mmap_entry);
if (abi->mi_mmap_entries > MAX_MMAP_ENTRIES) { if (abi->mmap_entries > MAX_MMAP_ENTRIES) {
abi->mi_mmap_entries = MAX_MMAP_ENTRIES; abi->mmap_entries = MAX_MMAP_ENTRIES;
} }
for (i = 0U; i < abi->mi_mmap_entries; i++) { for (i = 0U; i < abi->mmap_entries; i++) {
abi->mi_mmap_entry[i].baseaddr = (mb2_mmap + i)->addr; abi->mmap_entry[i].baseaddr = (mb2_mmap + i)->addr;
abi->mi_mmap_entry[i].length = (mb2_mmap + i)->len; abi->mmap_entry[i].length = (mb2_mmap + i)->len;
abi->mi_mmap_entry[i].type = (mb2_mmap + i)->type; abi->mmap_entry[i].type = (mb2_mmap + i)->type;
} }
} }