2018-03-07 20:57:14 +08:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2018 Intel Corporation. All rights reserved.
|
|
|
|
*
|
2018-05-26 01:49:13 +08:00
|
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
2018-03-07 20:57:14 +08:00
|
|
|
*/
|
|
|
|
|
2021-04-23 15:50:57 +08:00
|
|
|
#include <asm/guest/vm.h>
|
2021-08-03 20:44:38 +08:00
|
|
|
#include <vboot.h>
|
2019-02-26 15:42:56 +08:00
|
|
|
#include <errno.h>
|
|
|
|
#include <logmsg.h>
|
2018-03-07 20:57:14 +08:00
|
|
|
|
2021-06-20 21:09:10 +08:00
|
|
|
/**
|
|
|
|
* @pre sw_module != NULL
|
|
|
|
*/
|
2021-08-09 16:36:24 +08:00
|
|
|
void load_sw_module(struct acrn_vm *vm, struct sw_module_info *sw_module)
|
2021-06-20 21:09:10 +08:00
|
|
|
{
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-24 01:51:32 +08:00
|
|
|
/**
|
|
|
|
* @pre vm != NULL
|
|
|
|
*/
|
2021-08-10 16:24:49 +08:00
|
|
|
int32_t prepare_os_image(struct acrn_vm *vm)
|
2021-05-24 01:51:32 +08:00
|
|
|
{
|
2021-08-03 16:23:45 +08:00
|
|
|
int32_t ret = -EINVAL;
|
2021-05-24 01:51:32 +08:00
|
|
|
/* get primary vcpu */
|
|
|
|
struct acrn_vcpu *vcpu = vcpu_from_vid(vm, BSP_CPU_ID);
|
2021-08-10 16:24:49 +08:00
|
|
|
struct sw_module_info *acpi_info = &(vm->sw.acpi_info);
|
2021-05-24 01:51:32 +08:00
|
|
|
|
2021-08-03 16:23:45 +08:00
|
|
|
switch (vm->sw.kernel_type) {
|
2021-08-09 16:36:24 +08:00
|
|
|
#ifdef CONFIG_GUEST_KERNEL_BZIMAGE
|
2021-08-03 16:23:45 +08:00
|
|
|
case KERNEL_BZIMAGE:
|
2021-08-10 15:58:41 +08:00
|
|
|
ret = bzimage_loader(vm);
|
2021-08-03 16:23:45 +08:00
|
|
|
break;
|
2021-08-09 16:36:24 +08:00
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_GUEST_KERNEL_RAWIMAGE
|
2021-08-03 16:23:45 +08:00
|
|
|
case KERNEL_RAWIMAGE:
|
2021-08-10 15:58:41 +08:00
|
|
|
ret = rawimage_loader(vm);
|
2021-08-03 16:23:45 +08:00
|
|
|
break;
|
2021-08-12 15:34:10 +08:00
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_GUEST_KERNEL_ELF
|
|
|
|
case KERNEL_ELF:
|
|
|
|
ret = elf_loader(vm);
|
|
|
|
break;
|
2021-08-09 16:36:24 +08:00
|
|
|
#endif
|
2021-08-03 16:23:45 +08:00
|
|
|
default:
|
2018-03-07 20:57:14 +08:00
|
|
|
ret = -EINVAL;
|
2021-08-03 16:23:45 +08:00
|
|
|
break;
|
2018-03-07 20:57:14 +08:00
|
|
|
}
|
|
|
|
|
2019-06-02 22:15:37 +08:00
|
|
|
if (ret == 0) {
|
2021-08-10 16:24:49 +08:00
|
|
|
/* Copy Guest OS ACPI to its load location */
|
|
|
|
load_sw_module(vm, acpi_info);
|
2019-06-02 22:15:37 +08:00
|
|
|
/* Set VCPU entry point to kernel entry */
|
2021-05-24 01:51:32 +08:00
|
|
|
vcpu_set_rip(vcpu, (uint64_t)vm->sw.kernel_info.kernel_entry_addr);
|
2019-11-07 16:55:14 +08:00
|
|
|
pr_info("%s, VM %hu VCPU %hu Entry: 0x%016lx ", __func__, vm->vm_id, vcpu->vcpu_id,
|
2021-05-24 01:51:32 +08:00
|
|
|
vm->sw.kernel_info.kernel_entry_addr);
|
2019-06-02 22:15:37 +08:00
|
|
|
}
|
|
|
|
|
2018-03-07 20:57:14 +08:00
|
|
|
return ret;
|
|
|
|
}
|