diff --git a/hypervisor/boot/guest/vboot_info.c b/hypervisor/boot/guest/vboot_info.c index 63ebb22fd..85637591f 100644 --- a/hypervisor/boot/guest/vboot_info.c +++ b/hypervisor/boot/guest/vboot_info.c @@ -60,8 +60,8 @@ static void parse_other_modules(struct acrn_vm *vm, const struct multiboot_modul type_len = end - start; if (strncmp("FIRMWARE", start, type_len) == 0) { char dyn_bootargs[100] = {'\0'}; - void *load_addr = gpa2hva(vm, (uint64_t)vm->sw.linux_info.bootargs_load_addr); - uint32_t args_size = vm->sw.linux_info.bootargs_size; + void *load_addr = gpa2hva(vm, (uint64_t)vm->sw.bootargs_info.load_addr); + uint32_t args_size = vm->sw.bootargs_info.size; static int32_t copy_once = 1; start = end + 1; /*it is fw name for boot args */ @@ -72,21 +72,21 @@ static void parse_other_modules(struct acrn_vm *vm, const struct multiboot_modul if (copy_once != 0) { copy_once = 0; (void)strncpy_s(load_addr, MAX_BOOTARGS_SIZE + 1U, - (const char *)vm->sw.linux_info.bootargs_src_addr, - vm->sw.linux_info.bootargs_size); - vm->sw.linux_info.bootargs_src_addr = load_addr; + (const char *)vm->sw.bootargs_info.src_addr, + vm->sw.bootargs_info.size); + vm->sw.bootargs_info.src_addr = load_addr; } (void)strncpy_s(load_addr + args_size, 100U, dyn_bootargs, 100U); - vm->sw.linux_info.bootargs_size = strnlen_s(load_addr, MAX_BOOTARGS_SIZE); + vm->sw.bootargs_info.size = strnlen_s(load_addr, MAX_BOOTARGS_SIZE); } else if (strncmp("RAMDISK", start, type_len) == 0) { - vm->sw.linux_info.ramdisk_src_addr = mod_addr; - vm->sw.linux_info.ramdisk_load_addr = vm->sw.kernel_info.kernel_load_addr + + vm->sw.ramdisk_info.src_addr = mod_addr; + vm->sw.ramdisk_info.load_addr = vm->sw.kernel_info.kernel_load_addr + vm->sw.kernel_info.kernel_size; - vm->sw.linux_info.ramdisk_load_addr = - (void *)round_page_up((uint64_t)vm->sw.linux_info.ramdisk_load_addr); - vm->sw.linux_info.ramdisk_size = mod_size; + vm->sw.ramdisk_info.load_addr = + (void *)round_page_up((uint64_t)vm->sw.ramdisk_info.load_addr); + vm->sw.ramdisk_info.size = mod_size; } else { pr_warn("not support mod, cmd: %s", start); } @@ -192,8 +192,8 @@ static int32_t init_general_vm_boot_info(struct acrn_vm *vm) if (vm_config->load_order == PRE_LAUNCHED_VM) { vm->sw.kernel_info.kernel_load_addr = (void *)(MEM_1M * 16U); - vm->sw.linux_info.bootargs_src_addr = (void *)vm_config->os_config.bootargs; - vm->sw.linux_info.bootargs_size = + vm->sw.bootargs_info.src_addr = (void *)vm_config->os_config.bootargs; + vm->sw.bootargs_info.size = strnlen_s(vm_config->os_config.bootargs, MAX_BOOTARGS_SIZE); } else { vm->sw.kernel_info.kernel_load_addr = @@ -207,20 +207,20 @@ static int32_t init_general_vm_boot_info(struct acrn_vm *vm) merge_cmdline(vm, hpa2hva((uint64_t)mbi->mi_cmdline), hpa2hva((uint64_t)mods[0].mm_string)); - vm->sw.linux_info.bootargs_src_addr = kernel_cmdline; - vm->sw.linux_info.bootargs_size = + vm->sw.bootargs_info.src_addr = kernel_cmdline; + vm->sw.bootargs_info.size = strnlen_s(kernel_cmdline, MAX_BOOTARGS_SIZE); } else { - vm->sw.linux_info.bootargs_src_addr = + vm->sw.bootargs_info.src_addr = hpa2hva((uint64_t)mods[0].mm_string); - vm->sw.linux_info.bootargs_size = + vm->sw.bootargs_info.size = strnlen_s(hpa2hva((uint64_t)mods[0].mm_string), MAX_BOOTARGS_SIZE); } } /* Kernel bootarg and zero page are right before the kernel image */ - vm->sw.linux_info.bootargs_load_addr = + vm->sw.bootargs_info.load_addr = vm->sw.kernel_info.kernel_load_addr - (MEM_1K * 8U); if (mbi->mi_mods_count > 1U) { diff --git a/hypervisor/common/vm_load.c b/hypervisor/common/vm_load.c index 986331e90..8b78c99c2 100644 --- a/hypervisor/common/vm_load.c +++ b/hypervisor/common/vm_load.c @@ -53,13 +53,14 @@ static uint32_t create_zeropage_e820(struct zero_page *zp, const struct acrn_vm static uint64_t create_zero_page(struct acrn_vm *vm) { struct zero_page *zeropage; - struct sw_linux *linux_info = &(vm->sw.linux_info); struct sw_kernel_info *sw_kernel = &(vm->sw.kernel_info); + struct sw_module_info *bootargs_info = &(vm->sw.bootargs_info); + struct sw_module_info *ramdisk_info = &(vm->sw.ramdisk_info); struct zero_page *hva; uint64_t gpa, addr; /* Set zeropage in Linux Guest RAM region just past boot args */ - gpa = (uint64_t)linux_info->bootargs_load_addr + MEM_4K; + gpa = (uint64_t)bootargs_info->load_addr + MEM_4K; hva = (struct zero_page *)gpa2hva(vm, gpa); zeropage = hva; @@ -73,16 +74,16 @@ static uint64_t create_zero_page(struct acrn_vm *vm) &(hva->hdr), sizeof(hva->hdr)); /* See if kernel has a RAM disk */ - if (linux_info->ramdisk_src_addr != NULL) { + if (ramdisk_info->src_addr != NULL) { /* Copy ramdisk load_addr and size in zeropage header structure */ - addr = (uint64_t)linux_info->ramdisk_load_addr; + addr = (uint64_t)ramdisk_info->load_addr; zeropage->hdr.ramdisk_addr = (uint32_t)addr; - zeropage->hdr.ramdisk_size = (uint32_t)linux_info->ramdisk_size; + zeropage->hdr.ramdisk_size = (uint32_t)ramdisk_info->size; } /* Copy bootargs load_addr in zeropage header structure */ - addr = (uint64_t)linux_info->bootargs_load_addr; + addr = (uint64_t)bootargs_info->load_addr; zeropage->hdr.bootargs_addr = (uint32_t)addr; /* set constant arguments in zero page */ @@ -103,8 +104,9 @@ int32_t direct_boot_sw_loader(struct acrn_vm *vm) char dyn_bootargs[100] = {0}; uint32_t kernel_entry_offset; struct zero_page *zeropage; - struct sw_linux *linux_info = &(vm->sw.linux_info); struct sw_kernel_info *sw_kernel = &(vm->sw.kernel_info); + struct sw_module_info *bootargs_info = &(vm->sw.bootargs_info); + struct sw_module_info *ramdisk_info = &(vm->sw.ramdisk_info); /* get primary vcpu */ struct acrn_vcpu *vcpu = vcpu_from_vid(vm, BOOT_CPU_ID); const struct acrn_vm_config *vm_config = get_vm_config(vm->vm_id); @@ -147,9 +149,9 @@ int32_t direct_boot_sw_loader(struct acrn_vm *vm) } /* Copy Guest OS bootargs to its load location */ - (void)copy_to_gpa(vm, linux_info->bootargs_src_addr, - (uint64_t)linux_info->bootargs_load_addr, - (strnlen_s((char *)linux_info->bootargs_src_addr, MAX_BOOTARGS_SIZE) + 1U)); + (void)copy_to_gpa(vm, bootargs_info->src_addr, + (uint64_t)bootargs_info->load_addr, + (strnlen_s((char *)bootargs_info->src_addr, MAX_BOOTARGS_SIZE) + 1U)); /* add "hugepagesz=1G hugepages=x" to cmdline for 1G hugepage * reserving. Current strategy is "total_mem_size in Giga - @@ -161,18 +163,18 @@ int32_t direct_boot_sw_loader(struct acrn_vm *vm) reserving_1g_pages = (vm_config->memory.size >> 30U) - NUM_REMAIN_1G_PAGES; if (reserving_1g_pages > 0) { snprintf(dyn_bootargs, 100U, " hugepagesz=1G hugepages=%lld", reserving_1g_pages); - (void)copy_to_gpa(vm, dyn_bootargs, ((uint64_t)linux_info->bootargs_load_addr - + linux_info->bootargs_size), + (void)copy_to_gpa(vm, dyn_bootargs, ((uint64_t)bootargs_info->load_addr + + bootargs_info->size), (strnlen_s(dyn_bootargs, 99U) + 1U)); } } /* Check if a RAM disk is present with Linux guest */ - if (linux_info->ramdisk_src_addr != NULL) { + if (ramdisk_info->src_addr != NULL) { /* Copy RAM disk to its load location */ - (void)copy_to_gpa(vm, linux_info->ramdisk_src_addr, - (uint64_t)linux_info->ramdisk_load_addr, - linux_info->ramdisk_size); + (void)copy_to_gpa(vm, ramdisk_info->src_addr, + (uint64_t)ramdisk_info->load_addr, + ramdisk_info->size); } /* Create Zeropage and copy Physical Base Address of Zeropage diff --git a/hypervisor/include/arch/x86/guest/vm.h b/hypervisor/include/arch/x86/guest/vm.h index c495fe441..33dc8a9f7 100644 --- a/hypervisor/include/arch/x86/guest/vm.h +++ b/hypervisor/include/arch/x86/guest/vm.h @@ -35,16 +35,11 @@ struct vm_hw_info { uint16_t created_vcpus; /* Number of created vcpus */ } __aligned(PAGE_SIZE); -struct sw_linux { - void *ramdisk_src_addr; /* HVA */ - void *ramdisk_load_addr; /* GPA */ - uint32_t ramdisk_size; - void *bootargs_src_addr; /* HVA */ - void *bootargs_load_addr; /* GPA */ - uint32_t bootargs_size; - void *dtb_src_addr; /* HVA */ - void *dtb_load_addr; /* GPA */ - uint32_t dtb_size; +struct sw_module_info { + /* sw modules like ramdisk, bootargs, firmware, etc. */ + void *src_addr; /* HVA */ + void *load_addr; /* GPA */ + uint32_t size; }; struct sw_kernel_info { @@ -58,8 +53,8 @@ struct vm_sw_info { int32_t kernel_type; /* Guest kernel type */ /* Kernel information (common for all guest types) */ struct sw_kernel_info kernel_info; - /* Additional information specific to Linux guests */ - struct sw_linux linux_info; + struct sw_module_info bootargs_info; + struct sw_module_info ramdisk_info; /* HVA to IO shared page */ void *io_shared_page; /* If enable IO completion polling mode */