mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-22 13:37:10 +00:00
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:
parent
d1d59437ea
commit
2fbc4c26e6
@ -337,7 +337,8 @@ static void load_sw_module(struct acrn_vm *vm, struct sw_module_info *sw_module)
|
|||||||
/**
|
/**
|
||||||
* @pre vm != NULL
|
* @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 i;
|
||||||
uint32_t prot_code_offset, prot_code_size, kernel_entry_offset;
|
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;
|
(sw_kernel->kernel_size - prot_code_offset) : 0U;
|
||||||
|
|
||||||
/* Copy the protected mode part kernel code to its run-time location */
|
/* 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),
|
(void)copy_to_gpa(vm, (sw_kernel->kernel_src_addr + prot_code_offset), kernel_load_gpa, prot_code_size);
|
||||||
(uint64_t)sw_kernel->kernel_load_addr, prot_code_size);
|
|
||||||
|
|
||||||
if (vm->sw.ramdisk_info.size > 0U) {
|
if (vm->sw.ramdisk_info.size > 0U) {
|
||||||
/* Use customer specified ramdisk load addr if it is configured in VM configuration,
|
/* 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) {
|
if (vm_config->os_config.kernel_ramdisk_addr != 0UL) {
|
||||||
vm->sw.ramdisk_info.load_addr = (void *)vm_config->os_config.kernel_ramdisk_addr;
|
vm->sw.ramdisk_info.load_addr = (void *)vm_config->os_config.kernel_ramdisk_addr;
|
||||||
} else {
|
} 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_load_gpa);
|
||||||
|
|
||||||
vm->sw.ramdisk_info.load_addr = (void *)get_initrd_load_addr(vm, kernel_start);
|
|
||||||
if (vm->sw.ramdisk_info.load_addr == NULL) {
|
if (vm->sw.ramdisk_info.load_addr == NULL) {
|
||||||
pr_err("failed to load initrd for VM%d !", vm->vm_id);
|
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;
|
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
|
/* Documentation states: ebx=0, edi=0, ebp=0, esi=ptr to
|
||||||
* zeropage
|
* 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_kernel_info *sw_kernel = &(vm->sw.kernel_info);
|
||||||
struct sw_module_info *acpi_info = &(vm->sw.acpi_info);
|
struct sw_module_info *acpi_info = &(vm->sw.acpi_info);
|
||||||
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);
|
||||||
|
uint64_t kernel_load_gpa;
|
||||||
|
|
||||||
/* TODO: GPA 0 load support */
|
/* 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 */
|
/* Copy the guest kernel image to its run-time location */
|
||||||
(void)copy_to_gpa(vm, sw_kernel->kernel_src_addr,
|
(void)copy_to_gpa(vm, sw_kernel->kernel_src_addr, kernel_load_gpa, sw_kernel->kernel_size);
|
||||||
(uint64_t)sw_kernel->kernel_load_addr, sw_kernel->kernel_size);
|
|
||||||
|
|
||||||
/* Copy Guest OS ACPI to its load location */
|
/* Copy Guest OS ACPI to its load location */
|
||||||
load_sw_module(vm, acpi_info);
|
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);
|
uint64_t load_params_gpa = find_space_from_ve820(vm, BZIMG_LOAD_PARAMS_SIZE, MEM_4K, MEM_1M);
|
||||||
|
|
||||||
if (load_params_gpa != INVALID_GPA) {
|
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 */
|
/* We boot bzImage from protected mode directly */
|
||||||
init_vcpu_protect_mode_regs(vcpu, BZIMG_INITGDT_GPA(load_params_gpa));
|
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;
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,6 @@ struct sw_module_info {
|
|||||||
|
|
||||||
struct sw_kernel_info {
|
struct sw_kernel_info {
|
||||||
void *kernel_src_addr; /* HVA */
|
void *kernel_src_addr; /* HVA */
|
||||||
void *kernel_load_addr; /* GPA */
|
|
||||||
void *kernel_entry_addr; /* GPA */
|
void *kernel_entry_addr; /* GPA */
|
||||||
uint32_t kernel_size;
|
uint32_t kernel_size;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user