From 681688fbe42b9581daa9b677e182269c406a9c70 Mon Sep 17 00:00:00 2001 From: Liang Yi Date: Mon, 18 Jan 2021 07:41:30 +0800 Subject: [PATCH] hv: modularization: change of multiboot API. The init_multiboot_info() and sanitize_multiboot_ifno() APIs now require parameters instead of implicitly relying on global boot variables. Tracked-On: #5661 Signed-off-by: Vijay Dhanraj Reviewed-by: Jason Chen CJ --- hypervisor/arch/x86/e820.c | 2 +- hypervisor/arch/x86/init.c | 5 ++-- hypervisor/arch/x86/seed/seed.c | 2 +- hypervisor/boot/acpi_base.c | 2 +- hypervisor/boot/guest/vboot_info.c | 4 +-- hypervisor/boot/include/multiboot.h | 6 ++--- hypervisor/boot/multiboot/multiboot.c | 29 +++++++++++----------- hypervisor/boot/multiboot/multiboot2.c | 10 ++++---- hypervisor/boot/multiboot/multiboot_priv.h | 11 ++++---- hypervisor/common/vm_load.c | 2 +- hypervisor/debug/console.c | 2 +- 11 files changed, 38 insertions(+), 37 deletions(-) diff --git a/hypervisor/arch/x86/e820.c b/hypervisor/arch/x86/e820.c index 2be74aa50..23899a232 100644 --- a/hypervisor/arch/x86/e820.c +++ b/hypervisor/arch/x86/e820.c @@ -127,7 +127,7 @@ void init_e820(void) uint32_t i; uint64_t top_addr_space = CONFIG_PLATFORM_RAM_SIZE + PLATFORM_LO_MMIO_SIZE; - struct acrn_multiboot_info *mbi = get_multiboot_info(); + struct acrn_multiboot_info *mbi = get_acrn_multiboot_info(); struct multiboot_mmap *mmap = mbi->mi_mmap_entry; hv_e820_entries_nr = mbi->mi_mmap_entries; diff --git a/hypervisor/arch/x86/init.c b/hypervisor/arch/x86/init.c index 3d667881c..e668d588f 100644 --- a/hypervisor/arch/x86/init.c +++ b/hypervisor/arch/x86/init.c @@ -15,6 +15,7 @@ #include #include #include +#include /* Push sp magic to top of stack for call trace */ #define SWITCH_TO(rsp, to) \ @@ -86,11 +87,11 @@ void init_primary_pcpu(void) /* Clear BSS */ (void)memset(&ld_bss_start, 0U, (size_t)(&ld_bss_end - &ld_bss_start)); - init_acrn_multiboot_info(); + init_acrn_multiboot_info(boot_regs[0], boot_regs[1], efiloader_sig); init_debug_pre(); - if (sanitize_multiboot_info() != 0) { + if (sanitize_acrn_multiboot_info(boot_regs[0], boot_regs[1]) != 0) { panic("Multiboot info error!"); } diff --git a/hypervisor/arch/x86/seed/seed.c b/hypervisor/arch/x86/seed/seed.c index 43b1e09aa..68f4f8a08 100644 --- a/hypervisor/arch/x86/seed/seed.c +++ b/hypervisor/arch/x86/seed/seed.c @@ -41,7 +41,7 @@ static uint32_t parse_seed_arg(void) { const char *cmd_src = NULL; char *arg, *arg_end; - struct acrn_multiboot_info *mbi = get_multiboot_info(); + struct acrn_multiboot_info *mbi = get_acrn_multiboot_info(); uint32_t i = SEED_ARG_NUM - 1U; uint32_t len; diff --git a/hypervisor/boot/acpi_base.c b/hypervisor/boot/acpi_base.c index c8f5195ac..bc3e7d2cd 100644 --- a/hypervisor/boot/acpi_base.c +++ b/hypervisor/boot/acpi_base.c @@ -70,7 +70,7 @@ static struct acpi_table_rsdp *get_rsdp(void) if (acpi_rsdp != NULL) { rsdp = acpi_rsdp; } else { - rsdp = (struct acpi_table_rsdp *)(get_multiboot_info()->mi_acpi_rsdp_va); + rsdp = (struct acpi_table_rsdp *)(get_acrn_multiboot_info()->mi_acpi_rsdp_va); if (rsdp == NULL) { uint16_t *addr; diff --git a/hypervisor/boot/guest/vboot_info.c b/hypervisor/boot/guest/vboot_info.c index 605fad50a..71aad8921 100644 --- a/hypervisor/boot/guest/vboot_info.c +++ b/hypervisor/boot/guest/vboot_info.c @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include #include @@ -257,7 +257,7 @@ static int32_t init_vm_sw_load(struct acrn_vm *vm, const struct acrn_multiboot_i */ int32_t init_vm_boot_info(struct acrn_vm *vm) { - struct acrn_multiboot_info *mbi = get_multiboot_info(); + struct acrn_multiboot_info *mbi = get_acrn_multiboot_info(); int32_t ret = -EINVAL; stac(); diff --git a/hypervisor/boot/include/multiboot.h b/hypervisor/boot/include/multiboot.h index 8a5172d8d..6937c1d67 100644 --- a/hypervisor/boot/include/multiboot.h +++ b/hypervisor/boot/include/multiboot.h @@ -76,9 +76,9 @@ struct acrn_multiboot_info { struct efi_info mi_efi_info; }; -void init_acrn_multiboot_info(void); -struct acrn_multiboot_info *get_multiboot_info(void); -int32_t sanitize_multiboot_info(void); +void init_acrn_multiboot_info(uint32_t magic, uint32_t info, char *sig); +int32_t sanitize_acrn_multiboot_info(uint32_t magic, uint32_t info); +struct acrn_multiboot_info *get_acrn_multiboot_info(void); #endif /* ASSEMBLER */ diff --git a/hypervisor/boot/multiboot/multiboot.c b/hypervisor/boot/multiboot/multiboot.c index 7e1cad479..a3b6b9a59 100644 --- a/hypervisor/boot/multiboot/multiboot.c +++ b/hypervisor/boot/multiboot/multiboot.c @@ -7,7 +7,6 @@ #include #include #include -#include #include #include #include @@ -68,10 +67,10 @@ static struct acrn_multiboot_info acrn_mbi = { 0U }; static int32_t mbi_status; -void init_acrn_multiboot_info(void) +void init_acrn_multiboot_info(uint32_t magic, uint32_t info, char *sig) { - if (boot_from_multiboot1()) { - struct multiboot_info *mbi = (struct multiboot_info *)(hpa2hva_early((uint64_t)boot_regs[1])); + if (boot_from_multiboot1(magic, info)) { + struct multiboot_info *mbi = (struct multiboot_info *)(hpa2hva_early((uint64_t)info)); acrn_mbi.mi_flags = mbi->mi_flags; acrn_mbi.mi_drives_addr = mbi->mi_drives_addr; @@ -84,22 +83,22 @@ void init_acrn_multiboot_info(void) acrn_mbi.mi_mods_va = (struct multiboot_module *)hpa2hva_early((uint64_t)mbi->mi_mods_addr); mbi_status = 0; #ifdef CONFIG_MULTIBOOT2 - } else if (boot_from_multiboot2()) { - mbi_status = multiboot2_to_acrn_mbi(&acrn_mbi, hpa2hva_early((uint64_t)boot_regs[1])); + } else if (boot_from_multiboot2(magic)) { + mbi_status = multiboot2_to_acrn_mbi(&acrn_mbi, hpa2hva_early((uint64_t)info), sig); #endif } else { mbi_status = -ENODEV; } } -int32_t sanitize_multiboot_info(void) +int32_t sanitize_acrn_multiboot_info(uint32_t magic, uint32_t info) { if ((acrn_mbi.mi_mmap_entries != 0U) && (acrn_mbi.mi_mmap_va != NULL)) { if (acrn_mbi.mi_mmap_entries > E820_MAX_ENTRIES) { pr_err("Too many E820 entries %d\n", acrn_mbi.mi_mmap_entries); acrn_mbi.mi_mmap_entries = E820_MAX_ENTRIES; } - if (boot_from_multiboot1()) { + if (boot_from_multiboot1(magic, info)) { uint32_t mmap_entry_size = sizeof(struct multiboot_mmap); (void)memcpy_s((void *)(&acrn_mbi.mi_mmap_entry[0]), @@ -108,7 +107,7 @@ int32_t sanitize_multiboot_info(void) (acrn_mbi.mi_mmap_entries * mmap_entry_size)); } #ifdef CONFIG_MULTIBOOT2 - if (boot_from_multiboot2()) { + if (boot_from_multiboot2(magic)) { uint32_t i; struct multiboot2_mmap_entry *mb2_mmap = (struct multiboot2_mmap_entry *)acrn_mbi.mi_mmap_va; @@ -129,7 +128,7 @@ int32_t sanitize_multiboot_info(void) acrn_mbi.mi_mods_count = MAX_MODULE_NUM; } if (acrn_mbi.mi_mods_count != 0U) { - if (boot_from_multiboot1() && (acrn_mbi.mi_mods_va != NULL)) { + if (boot_from_multiboot1(magic, info) && (acrn_mbi.mi_mods_va != NULL)) { (void)memcpy_s((void *)(&acrn_mbi.mi_mods[0]), (acrn_mbi.mi_mods_count * sizeof(struct multiboot_module)), (const void *)acrn_mbi.mi_mods_va, @@ -145,9 +144,10 @@ int32_t sanitize_multiboot_info(void) mbi_status = -EINVAL; } - if (boot_from_multiboot2()) { +#ifdef CONFIG_MULTIBOOT2 + if (boot_from_multiboot2(magic)) { if (acrn_mbi.mi_efi_info.efi_memmap_hi != 0U) { - pr_err("the efi mmap address should be less than 4G!"); + pr_err("the EFI mmap address should be less than 4G!"); acrn_mbi.mi_flags &= ~MULTIBOOT_INFO_HAS_EFI_MMAP; mbi_status = -EINVAL; } @@ -156,12 +156,13 @@ int32_t sanitize_multiboot_info(void) pr_err("no multiboot2 uefi info found!"); } } +#endif if (acrn_mbi.mi_loader_name[0] == '\0') { pr_err("no bootloader name found!"); mbi_status = -EINVAL; } else { - printf("Multiboot%s Bootloader: %s\n", boot_from_multiboot1() ? "" : "2", acrn_mbi.mi_loader_name); + printf("Multiboot%s Bootloader: %s\n", boot_from_multiboot1(magic, info) ? "" : "2", acrn_mbi.mi_loader_name); } return mbi_status; @@ -172,7 +173,7 @@ int32_t sanitize_multiboot_info(void) * @post retval->mi_flags & MULTIBOOT_INFO_HAS_MMAP != 0U * @post (retval->mi_mmap_entries > 0U) && (retval->mi_mmap_entries <= E820_MAX_ENTRIES) */ -struct acrn_multiboot_info *get_multiboot_info(void) +struct acrn_multiboot_info *get_acrn_multiboot_info(void) { return &acrn_mbi; } diff --git a/hypervisor/boot/multiboot/multiboot2.c b/hypervisor/boot/multiboot/multiboot2.c index f7a3ec012..377995232 100644 --- a/hypervisor/boot/multiboot/multiboot2.c +++ b/hypervisor/boot/multiboot/multiboot2.c @@ -6,7 +6,6 @@ #include #include -#include #include #include #include "multiboot_priv.h" @@ -37,10 +36,11 @@ static void mb2_mods_to_mbi(struct acrn_multiboot_info *mbi, /** * @pre mbi != NULL && mb2_tag_efi64 != 0 */ -static void mb2_efi64_to_mbi(struct acrn_multiboot_info *mbi, const struct multiboot2_tag_efi64 *mb2_tag_efi64) +static void mb2_efi64_to_mbi(struct acrn_multiboot_info *mbi, const struct multiboot2_tag_efi64 *mb2_tag_efi64, + char *sig) { mbi->mi_efi_info.efi_systab = (uint32_t)(uint64_t)mb2_tag_efi64->pointer; - mbi->mi_efi_info.efi_loader_signature = (uint32_t)(uint64_t)efiloader_sig; + mbi->mi_efi_info.efi_loader_signature = (uint32_t)(uint64_t)sig; mbi->mi_flags |= MULTIBOOT_INFO_HAS_EFI64; } @@ -61,7 +61,7 @@ static void mb2_efimmap_to_mbi(struct acrn_multiboot_info *mbi, /** * @pre mbi != NULL */ -int32_t multiboot2_to_acrn_mbi(struct acrn_multiboot_info *mbi, void *mb2_info) +int32_t multiboot2_to_acrn_mbi(struct acrn_multiboot_info *mbi, void *mb2_info, char *sig) { int32_t ret = 0; struct multiboot2_tag *mb2_tag, *mb2_tag_end; @@ -92,7 +92,7 @@ int32_t multiboot2_to_acrn_mbi(struct acrn_multiboot_info *mbi, void *mb2_info) mbi->mi_acpi_rsdp_va = ((struct multiboot2_tag_new_acpi *)mb2_tag)->rsdp; break; case MULTIBOOT2_TAG_TYPE_EFI64: - mb2_efi64_to_mbi(mbi, (const struct multiboot2_tag_efi64 *)mb2_tag); + mb2_efi64_to_mbi(mbi, (const struct multiboot2_tag_efi64 *)mb2_tag, sig); break; case MULTIBOOT2_TAG_TYPE_EFI_MMAP: mb2_efimmap_to_mbi(mbi, (const struct multiboot2_tag_efi_mmap *)mb2_tag); diff --git a/hypervisor/boot/multiboot/multiboot_priv.h b/hypervisor/boot/multiboot/multiboot_priv.h index c0d370f9e..bb19a58a8 100644 --- a/hypervisor/boot/multiboot/multiboot_priv.h +++ b/hypervisor/boot/multiboot/multiboot_priv.h @@ -75,7 +75,7 @@ struct multiboot2_tag_efi_mmap /* * @post boot_regs[1] stores the address pointer that point to a valid multiboot2 info */ -static inline bool boot_from_multiboot2(void) +static inline bool boot_from_multiboot2(uint32_t magic) { /* * Multiboot spec states that the Multiboot information structure may be placed @@ -86,16 +86,15 @@ static inline bool boot_from_multiboot2(void) * 0f3f5b7c13fa9b67 ("multiboot2: Set min address for mbi allocation to 0x1000") * which dates on Dec 26 2019. */ - return (boot_regs[0] == MULTIBOOT2_INFO_MAGIC); + return (magic == MULTIBOOT2_INFO_MAGIC); } -int32_t multiboot2_to_acrn_mbi(struct acrn_multiboot_info *mbi, void *mb2_info); +int32_t multiboot2_to_acrn_mbi(struct acrn_multiboot_info *mbi, void *mb2_info, char *sig); #endif - -static inline bool boot_from_multiboot1(void) +static inline bool boot_from_multiboot1(uint32_t magic, uint32_t info) { - return ((boot_regs[0] == MULTIBOOT_INFO_MAGIC) && (boot_regs[1] != 0U)); + return ((magic == MULTIBOOT_INFO_MAGIC) && (info != 0U)); } #endif /* MULTIBOOT_PRIV_H */ diff --git a/hypervisor/common/vm_load.c b/hypervisor/common/vm_load.c index 75cecd9e3..145d6d720 100644 --- a/hypervisor/common/vm_load.c +++ b/hypervisor/common/vm_load.c @@ -76,7 +76,7 @@ static uint64_t create_zero_page(struct acrn_vm *vm) #ifdef CONFIG_MULTIBOOT2 if (is_sos_vm(vm)) { - struct acrn_multiboot_info *mbi = get_multiboot_info(); + struct acrn_multiboot_info *mbi = get_acrn_multiboot_info(); (void)memcpy_s(&(zeropage->boot_efi_info), sizeof(zeropage->boot_efi_info), &(mbi->mi_efi_info), sizeof(mbi->mi_efi_info)); diff --git a/hypervisor/debug/console.c b/hypervisor/debug/console.c index 2123f1c4b..686235b77 100644 --- a/hypervisor/debug/console.c +++ b/hypervisor/debug/console.c @@ -28,7 +28,7 @@ static void parse_hvdbg_cmdline(void) { const char *start = NULL; const char *end = NULL; - struct acrn_multiboot_info *mbi = get_multiboot_info(); + struct acrn_multiboot_info *mbi = get_acrn_multiboot_info(); if ((mbi->mi_flags & MULTIBOOT_INFO_HAS_CMDLINE) != 0U) { start = mbi->mi_cmdline;