1 /*
2  * Copyright (C) 2021-2022 Intel Corporation.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <asm/guest/vm.h>
8 #include <vboot.h>
9 
10 /**
11  * @pre vm != NULL
12  */
load_rawimage(struct acrn_vm * vm)13 static void load_rawimage(struct acrn_vm *vm)
14 {
15 	struct sw_kernel_info *sw_kernel = &(vm->sw.kernel_info);
16 	const struct acrn_vm_config *vm_config = get_vm_config(vm->vm_id);
17 	uint64_t kernel_load_gpa;
18 
19 	/* TODO: GPA 0 load support */
20 	kernel_load_gpa = vm_config->os_config.kernel_load_addr;
21 
22 	/* Copy the guest kernel image to its run-time location */
23 	(void)copy_to_gpa(vm, sw_kernel->kernel_src_addr, kernel_load_gpa, sw_kernel->kernel_size);
24 
25 	sw_kernel->kernel_entry_addr = (void *)vm_config->os_config.kernel_entry_addr;
26 }
27 
rawimage_loader(struct acrn_vm * vm)28 int32_t rawimage_loader(struct acrn_vm *vm)
29 {
30 	int32_t ret = 0;
31 	uint64_t vgdt_gpa = 0x800;
32 
33 	/*
34 	 * TODO:
35 	 *    - We need to initialize the guest BSP(boot strap processor) registers according to
36 	 *	guest boot mode (real mode vs protect mode)
37 	 *    - The memory layout usage is unclear, only GDT might be needed as its boot param.
38 	 *	currently we only support Zephyr which has no needs on cmdline/e820/efimmap/etc.
39 	 *	hardcode the vGDT GPA to 0x800 where is not used by Zephyr so far;
40 	 */
41 	init_vcpu_protect_mode_regs(vcpu_from_vid(vm, BSP_CPU_ID), vgdt_gpa);
42 
43 	load_rawimage(vm);
44 
45 	return ret;
46 }
47