Files
acrn-hypervisor/hypervisor/common/vm_load.c
Yifan Liu bbf2dec9b8 hv: vm_load: Move rip setting to arch_vm_prepare_bsp
prepare_os_image should not touch vcpu internal state.
Move this operation to arch_vm_prepare_bsp.

Since arch_vm_prepare_bsp now changes vcpu registers,
this action also affects the logic of resume_vm_from_s3.

Refactor resume_vm_from_s3 to avoid direct call to
start_vm.

Tracked-On: #8830
Signed-off-by: Yifan Liu <yifan1.liu@intel.com>
Reviewed-by: Fei Li <fei1.li@intel.com>
Acked-by: Wang Yu1 <yu1.wang@intel.com>
2025-10-30 13:30:32 +08:00

60 lines
1.2 KiB
C

/*
* Copyright (C) 2018-2022 Intel Corporation.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <vm.h>
#include <vboot.h>
#include <errno.h>
#include <logmsg.h>
/**
* @pre sw_module != NULL
*/
void load_sw_module(struct acrn_vm *vm, struct sw_module_info *sw_module)
{
if ((sw_module->size != 0) && (sw_module->load_addr != NULL)) {
(void)copy_to_gpa(vm, sw_module->src_addr, (uint64_t)sw_module->load_addr, sw_module->size);
}
}
/**
* @pre vm != NULL
*/
int32_t prepare_os_image(struct acrn_vm *vm)
{
int32_t ret = -EINVAL;
struct sw_module_info *acpi_info = &(vm->sw.acpi_info);
switch (vm->sw.kernel_type) {
#ifdef CONFIG_GUEST_KERNEL_BZIMAGE
case KERNEL_BZIMAGE:
ret = bzimage_loader(vm);
break;
#endif
#ifdef CONFIG_GUEST_KERNEL_RAWIMAGE
case KERNEL_RAWIMAGE:
ret = rawimage_loader(vm);
break;
#endif
#ifdef CONFIG_GUEST_KERNEL_ELF
case KERNEL_ELF:
ret = elf_loader(vm);
break;
#endif
default:
ret = -EINVAL;
break;
}
if (ret == 0) {
/* Copy Guest OS ACPI to its load location */
load_sw_module(vm, acpi_info);
pr_dbg("%s, VM%hu 0x%016lx", __func__, vm->vm_id,
vm->sw.kernel_info.kernel_entry_addr);
}
return ret;
}