1 /*
2  * Copyright (C) 2018-2022 Intel Corporation.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <asm/guest/vm.h>
8 #include <vboot.h>
9 #include <errno.h>
10 #include <logmsg.h>
11 
12 /**
13  * @pre sw_module != NULL
14  */
load_sw_module(struct acrn_vm * vm,struct sw_module_info * sw_module)15 void load_sw_module(struct acrn_vm *vm, struct sw_module_info *sw_module)
16 {
17 	if ((sw_module->size != 0) && (sw_module->load_addr != NULL)) {
18 		(void)copy_to_gpa(vm, sw_module->src_addr, (uint64_t)sw_module->load_addr, sw_module->size);
19 	}
20 }
21 
22 /**
23  * @pre vm != NULL
24  */
prepare_os_image(struct acrn_vm * vm)25 int32_t prepare_os_image(struct acrn_vm *vm)
26 {
27 	int32_t ret = -EINVAL;
28 	/* get primary vcpu */
29 	struct acrn_vcpu *vcpu = vcpu_from_vid(vm, BSP_CPU_ID);
30 	struct sw_module_info *acpi_info = &(vm->sw.acpi_info);
31 
32 	switch (vm->sw.kernel_type) {
33 #ifdef CONFIG_GUEST_KERNEL_BZIMAGE
34 	case KERNEL_BZIMAGE:
35 		ret = bzimage_loader(vm);
36 		break;
37 #endif
38 #ifdef CONFIG_GUEST_KERNEL_RAWIMAGE
39 	case KERNEL_RAWIMAGE:
40 		ret = rawimage_loader(vm);
41 		break;
42 #endif
43 #ifdef CONFIG_GUEST_KERNEL_ELF
44 	case KERNEL_ELF:
45 		ret = elf_loader(vm);
46 		break;
47 #endif
48 	default:
49 		ret = -EINVAL;
50 		break;
51 	}
52 
53 	if (ret == 0) {
54 		/* Copy Guest OS ACPI to its load location */
55 		load_sw_module(vm, acpi_info);
56 		/* Set VCPU entry point to kernel entry */
57 		vcpu_set_rip(vcpu, (uint64_t)vm->sw.kernel_info.kernel_entry_addr);
58 		pr_info("%s, VM %hu VCPU %hu Entry: 0x%016lx ", __func__, vm->vm_id, vcpu->vcpu_id,
59 			vm->sw.kernel_info.kernel_entry_addr);
60 	}
61 
62 	return ret;
63 }
64