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)13static 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)28int32_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