HV: refine sw_linux struct

The guest OS of ACRN will not be limited to Linux, so refine the struct
of sw_linux to more generic sw_module_info. Currently bootargs and ramdisk
are only supported modules but we can include more modules in future;

Tracked-On: #3214

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
2019-05-21 11:54:15 +08:00
committed by wenlingz
parent 475b05da54
commit 0f00a4b0da
3 changed files with 43 additions and 46 deletions

View File

@@ -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) {