HV: vm_load: remove kernel_load_addr in sw_kernel_info struct

When guest kernel has multiple loading segments like ELF format image, just
define one load address in sw_kernel_info struct is meaningless.

The patch removes kernel_load_addr member in struct sw_kernel_info, the load
address should be parsed in each specified format image processing.

Tracked-On: #6323

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-23 22:32:41 +08:00 committed by wenlingz
parent d1d59437ea
commit 2fbc4c26e6
2 changed files with 11 additions and 14 deletions

View File

@ -337,7 +337,8 @@ static void load_sw_module(struct acrn_vm *vm, struct sw_module_info *sw_module)
/**
* @pre vm != NULL
*/
static void prepare_loading_bzimage(struct acrn_vm *vm, struct acrn_vcpu *vcpu, uint64_t load_params_gpa)
static void prepare_loading_bzimage(struct acrn_vm *vm, struct acrn_vcpu *vcpu,
uint64_t load_params_gpa, uint64_t kernel_load_gpa)
{
uint32_t i;
uint32_t prot_code_offset, prot_code_size, kernel_entry_offset;
@ -362,8 +363,7 @@ static void prepare_loading_bzimage(struct acrn_vm *vm, struct acrn_vcpu *vcpu,
(sw_kernel->kernel_size - prot_code_offset) : 0U;
/* Copy the protected mode part kernel code to its run-time location */
(void)copy_to_gpa(vm, (sw_kernel->kernel_src_addr + prot_code_offset),
(uint64_t)sw_kernel->kernel_load_addr, prot_code_size);
(void)copy_to_gpa(vm, (sw_kernel->kernel_src_addr + prot_code_offset), kernel_load_gpa, prot_code_size);
if (vm->sw.ramdisk_info.size > 0U) {
/* Use customer specified ramdisk load addr if it is configured in VM configuration,
@ -372,9 +372,7 @@ static void prepare_loading_bzimage(struct acrn_vm *vm, struct acrn_vcpu *vcpu,
if (vm_config->os_config.kernel_ramdisk_addr != 0UL) {
vm->sw.ramdisk_info.load_addr = (void *)vm_config->os_config.kernel_ramdisk_addr;
} else {
uint64_t kernel_start = (uint64_t)sw_kernel->kernel_load_addr;
vm->sw.ramdisk_info.load_addr = (void *)get_initrd_load_addr(vm, kernel_start);
vm->sw.ramdisk_info.load_addr = (void *)get_initrd_load_addr(vm, kernel_load_gpa);
if (vm->sw.ramdisk_info.load_addr == NULL) {
pr_err("failed to load initrd for VM%d !", vm->vm_id);
}
@ -400,7 +398,7 @@ static void prepare_loading_bzimage(struct acrn_vm *vm, struct acrn_vcpu *vcpu,
kernel_entry_offset += 512U;
}
sw_kernel->kernel_entry_addr = (void *)((uint64_t)sw_kernel->kernel_load_addr + kernel_entry_offset);
sw_kernel->kernel_entry_addr = (void *)(kernel_load_gpa + kernel_entry_offset);
/* Documentation states: ebx=0, edi=0, ebp=0, esi=ptr to
* zeropage
@ -425,13 +423,13 @@ static void prepare_loading_rawimage(struct acrn_vm *vm)
struct sw_kernel_info *sw_kernel = &(vm->sw.kernel_info);
struct sw_module_info *acpi_info = &(vm->sw.acpi_info);
const struct acrn_vm_config *vm_config = get_vm_config(vm->vm_id);
uint64_t kernel_load_gpa;
/* TODO: GPA 0 load support */
vm->sw.kernel_info.kernel_load_addr = (void *)vm_config->os_config.kernel_load_addr;
kernel_load_gpa = vm_config->os_config.kernel_load_addr;
/* Copy the guest kernel image to its run-time location */
(void)copy_to_gpa(vm, sw_kernel->kernel_src_addr,
(uint64_t)sw_kernel->kernel_load_addr, sw_kernel->kernel_size);
(void)copy_to_gpa(vm, sw_kernel->kernel_src_addr, kernel_load_gpa, sw_kernel->kernel_size);
/* Copy Guest OS ACPI to its load location */
load_sw_module(vm, acpi_info);
@ -447,13 +445,13 @@ static int32_t vm_bzimage_loader(struct acrn_vm *vm)
uint64_t load_params_gpa = find_space_from_ve820(vm, BZIMG_LOAD_PARAMS_SIZE, MEM_4K, MEM_1M);
if (load_params_gpa != INVALID_GPA) {
vm->sw.kernel_info.kernel_load_addr = get_bzimage_kernel_load_addr(vm);
uint64_t kernel_load_gpa = (uint64_t)get_bzimage_kernel_load_addr(vm);
if (vm->sw.kernel_info.kernel_load_addr != NULL) {
if (kernel_load_gpa != 0UL) {
/* We boot bzImage from protected mode directly */
init_vcpu_protect_mode_regs(vcpu, BZIMG_INITGDT_GPA(load_params_gpa));
prepare_loading_bzimage(vm, vcpu, load_params_gpa);
prepare_loading_bzimage(vm, vcpu, load_params_gpa, kernel_load_gpa);
ret = 0;
}

View File

@ -55,7 +55,6 @@ struct sw_module_info {
struct sw_kernel_info {
void *kernel_src_addr; /* HVA */
void *kernel_load_addr; /* GPA */
void *kernel_entry_addr; /* GPA */
uint32_t kernel_size;
};