mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-08-03 09:23:35 +00:00
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:
parent
475b05da54
commit
0f00a4b0da
@ -60,8 +60,8 @@ static void parse_other_modules(struct acrn_vm *vm, const struct multiboot_modul
|
|||||||
type_len = end - start;
|
type_len = end - start;
|
||||||
if (strncmp("FIRMWARE", start, type_len) == 0) {
|
if (strncmp("FIRMWARE", start, type_len) == 0) {
|
||||||
char dyn_bootargs[100] = {'\0'};
|
char dyn_bootargs[100] = {'\0'};
|
||||||
void *load_addr = gpa2hva(vm, (uint64_t)vm->sw.linux_info.bootargs_load_addr);
|
void *load_addr = gpa2hva(vm, (uint64_t)vm->sw.bootargs_info.load_addr);
|
||||||
uint32_t args_size = vm->sw.linux_info.bootargs_size;
|
uint32_t args_size = vm->sw.bootargs_info.size;
|
||||||
static int32_t copy_once = 1;
|
static int32_t copy_once = 1;
|
||||||
|
|
||||||
start = end + 1; /*it is fw name for boot args */
|
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) {
|
if (copy_once != 0) {
|
||||||
copy_once = 0;
|
copy_once = 0;
|
||||||
(void)strncpy_s(load_addr, MAX_BOOTARGS_SIZE + 1U,
|
(void)strncpy_s(load_addr, MAX_BOOTARGS_SIZE + 1U,
|
||||||
(const char *)vm->sw.linux_info.bootargs_src_addr,
|
(const char *)vm->sw.bootargs_info.src_addr,
|
||||||
vm->sw.linux_info.bootargs_size);
|
vm->sw.bootargs_info.size);
|
||||||
vm->sw.linux_info.bootargs_src_addr = load_addr;
|
vm->sw.bootargs_info.src_addr = load_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)strncpy_s(load_addr + args_size, 100U, dyn_bootargs, 100U);
|
(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) {
|
} else if (strncmp("RAMDISK", start, type_len) == 0) {
|
||||||
vm->sw.linux_info.ramdisk_src_addr = mod_addr;
|
vm->sw.ramdisk_info.src_addr = mod_addr;
|
||||||
vm->sw.linux_info.ramdisk_load_addr = vm->sw.kernel_info.kernel_load_addr +
|
vm->sw.ramdisk_info.load_addr = vm->sw.kernel_info.kernel_load_addr +
|
||||||
vm->sw.kernel_info.kernel_size;
|
vm->sw.kernel_info.kernel_size;
|
||||||
vm->sw.linux_info.ramdisk_load_addr =
|
vm->sw.ramdisk_info.load_addr =
|
||||||
(void *)round_page_up((uint64_t)vm->sw.linux_info.ramdisk_load_addr);
|
(void *)round_page_up((uint64_t)vm->sw.ramdisk_info.load_addr);
|
||||||
vm->sw.linux_info.ramdisk_size = mod_size;
|
vm->sw.ramdisk_info.size = mod_size;
|
||||||
} else {
|
} else {
|
||||||
pr_warn("not support mod, cmd: %s", start);
|
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) {
|
if (vm_config->load_order == PRE_LAUNCHED_VM) {
|
||||||
vm->sw.kernel_info.kernel_load_addr = (void *)(MEM_1M * 16U);
|
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.bootargs_info.src_addr = (void *)vm_config->os_config.bootargs;
|
||||||
vm->sw.linux_info.bootargs_size =
|
vm->sw.bootargs_info.size =
|
||||||
strnlen_s(vm_config->os_config.bootargs, MAX_BOOTARGS_SIZE);
|
strnlen_s(vm_config->os_config.bootargs, MAX_BOOTARGS_SIZE);
|
||||||
} else {
|
} else {
|
||||||
vm->sw.kernel_info.kernel_load_addr =
|
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),
|
merge_cmdline(vm, hpa2hva((uint64_t)mbi->mi_cmdline),
|
||||||
hpa2hva((uint64_t)mods[0].mm_string));
|
hpa2hva((uint64_t)mods[0].mm_string));
|
||||||
|
|
||||||
vm->sw.linux_info.bootargs_src_addr = kernel_cmdline;
|
vm->sw.bootargs_info.src_addr = kernel_cmdline;
|
||||||
vm->sw.linux_info.bootargs_size =
|
vm->sw.bootargs_info.size =
|
||||||
strnlen_s(kernel_cmdline, MAX_BOOTARGS_SIZE);
|
strnlen_s(kernel_cmdline, MAX_BOOTARGS_SIZE);
|
||||||
} else {
|
} else {
|
||||||
vm->sw.linux_info.bootargs_src_addr =
|
vm->sw.bootargs_info.src_addr =
|
||||||
hpa2hva((uint64_t)mods[0].mm_string);
|
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),
|
strnlen_s(hpa2hva((uint64_t)mods[0].mm_string),
|
||||||
MAX_BOOTARGS_SIZE);
|
MAX_BOOTARGS_SIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Kernel bootarg and zero page are right before the kernel image */
|
/* 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);
|
vm->sw.kernel_info.kernel_load_addr - (MEM_1K * 8U);
|
||||||
|
|
||||||
if (mbi->mi_mods_count > 1U) {
|
if (mbi->mi_mods_count > 1U) {
|
||||||
|
@ -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)
|
static uint64_t create_zero_page(struct acrn_vm *vm)
|
||||||
{
|
{
|
||||||
struct zero_page *zeropage;
|
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_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;
|
struct zero_page *hva;
|
||||||
uint64_t gpa, addr;
|
uint64_t gpa, addr;
|
||||||
|
|
||||||
/* Set zeropage in Linux Guest RAM region just past boot args */
|
/* 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);
|
hva = (struct zero_page *)gpa2hva(vm, gpa);
|
||||||
zeropage = hva;
|
zeropage = hva;
|
||||||
|
|
||||||
@ -73,16 +74,16 @@ static uint64_t create_zero_page(struct acrn_vm *vm)
|
|||||||
&(hva->hdr), sizeof(hva->hdr));
|
&(hva->hdr), sizeof(hva->hdr));
|
||||||
|
|
||||||
/* See if kernel has a RAM disk */
|
/* 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
|
/* 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_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 */
|
/* 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;
|
zeropage->hdr.bootargs_addr = (uint32_t)addr;
|
||||||
|
|
||||||
/* set constant arguments in zero page */
|
/* 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};
|
char dyn_bootargs[100] = {0};
|
||||||
uint32_t kernel_entry_offset;
|
uint32_t kernel_entry_offset;
|
||||||
struct zero_page *zeropage;
|
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_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 */
|
/* get primary vcpu */
|
||||||
struct acrn_vcpu *vcpu = vcpu_from_vid(vm, BOOT_CPU_ID);
|
struct acrn_vcpu *vcpu = vcpu_from_vid(vm, BOOT_CPU_ID);
|
||||||
const struct acrn_vm_config *vm_config = get_vm_config(vm->vm_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 */
|
/* Copy Guest OS bootargs to its load location */
|
||||||
(void)copy_to_gpa(vm, linux_info->bootargs_src_addr,
|
(void)copy_to_gpa(vm, bootargs_info->src_addr,
|
||||||
(uint64_t)linux_info->bootargs_load_addr,
|
(uint64_t)bootargs_info->load_addr,
|
||||||
(strnlen_s((char *)linux_info->bootargs_src_addr, MAX_BOOTARGS_SIZE) + 1U));
|
(strnlen_s((char *)bootargs_info->src_addr, MAX_BOOTARGS_SIZE) + 1U));
|
||||||
|
|
||||||
/* add "hugepagesz=1G hugepages=x" to cmdline for 1G hugepage
|
/* add "hugepagesz=1G hugepages=x" to cmdline for 1G hugepage
|
||||||
* reserving. Current strategy is "total_mem_size in Giga -
|
* 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;
|
reserving_1g_pages = (vm_config->memory.size >> 30U) - NUM_REMAIN_1G_PAGES;
|
||||||
if (reserving_1g_pages > 0) {
|
if (reserving_1g_pages > 0) {
|
||||||
snprintf(dyn_bootargs, 100U, " hugepagesz=1G hugepages=%lld", reserving_1g_pages);
|
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
|
(void)copy_to_gpa(vm, dyn_bootargs, ((uint64_t)bootargs_info->load_addr
|
||||||
+ linux_info->bootargs_size),
|
+ bootargs_info->size),
|
||||||
(strnlen_s(dyn_bootargs, 99U) + 1U));
|
(strnlen_s(dyn_bootargs, 99U) + 1U));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if a RAM disk is present with Linux guest */
|
/* 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 */
|
/* Copy RAM disk to its load location */
|
||||||
(void)copy_to_gpa(vm, linux_info->ramdisk_src_addr,
|
(void)copy_to_gpa(vm, ramdisk_info->src_addr,
|
||||||
(uint64_t)linux_info->ramdisk_load_addr,
|
(uint64_t)ramdisk_info->load_addr,
|
||||||
linux_info->ramdisk_size);
|
ramdisk_info->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create Zeropage and copy Physical Base Address of Zeropage
|
/* Create Zeropage and copy Physical Base Address of Zeropage
|
||||||
|
@ -35,16 +35,11 @@ struct vm_hw_info {
|
|||||||
uint16_t created_vcpus; /* Number of created vcpus */
|
uint16_t created_vcpus; /* Number of created vcpus */
|
||||||
} __aligned(PAGE_SIZE);
|
} __aligned(PAGE_SIZE);
|
||||||
|
|
||||||
struct sw_linux {
|
struct sw_module_info {
|
||||||
void *ramdisk_src_addr; /* HVA */
|
/* sw modules like ramdisk, bootargs, firmware, etc. */
|
||||||
void *ramdisk_load_addr; /* GPA */
|
void *src_addr; /* HVA */
|
||||||
uint32_t ramdisk_size;
|
void *load_addr; /* GPA */
|
||||||
void *bootargs_src_addr; /* HVA */
|
uint32_t size;
|
||||||
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_kernel_info {
|
struct sw_kernel_info {
|
||||||
@ -58,8 +53,8 @@ struct vm_sw_info {
|
|||||||
int32_t kernel_type; /* Guest kernel type */
|
int32_t kernel_type; /* Guest kernel type */
|
||||||
/* Kernel information (common for all guest types) */
|
/* Kernel information (common for all guest types) */
|
||||||
struct sw_kernel_info kernel_info;
|
struct sw_kernel_info kernel_info;
|
||||||
/* Additional information specific to Linux guests */
|
struct sw_module_info bootargs_info;
|
||||||
struct sw_linux linux_info;
|
struct sw_module_info ramdisk_info;
|
||||||
/* HVA to IO shared page */
|
/* HVA to IO shared page */
|
||||||
void *io_shared_page;
|
void *io_shared_page;
|
||||||
/* If enable IO completion polling mode */
|
/* If enable IO completion polling mode */
|
||||||
|
Loading…
Reference in New Issue
Block a user