Files
acrn-hypervisor/hypervisor/boot/guest/deprivilege_boot.c
Jason Chen CJ 238d8bbaa2 reshuffle init_vm_boot_info
now only SOS need decide boot with de-privilege or direct boot mode, while
for other pre-launched VMs, they should use direct boot mode.

this patch merge boot/guest/direct_boot_info.c &
boot/guest/deprivilege_boot_info.c into boot/guest/vboot_info.c,
and change init_direct_vboot_info() function name to init_general_vm_boot_info().

in init_vm_boot_info(), depend on get_sos_boot_mode(), SOS may choose to init
vm boot info by setting the vm_sw_loader to deprivilege specific one; for SOS
using DIRECT_BOOT_MODE and all other VMS, they will use general_sw_loader as
vm_sw_loader and go through init_general_vm_boot_info() for virtual boot vm
info filling.

this patch also move spurious handler initilization for de-privilege mode from
boot/guest/deprivilege_boot.c to boot/guest/vboot_info.c, and just set it in
deprivilege sw_loader before irq enabling.

Changes to be committed:
	modified:   Makefile
	modified:   arch/x86/guest/vm.c
	modified:   boot/guest/deprivilege_boot.c
	deleted:    boot/guest/deprivilege_boot_info.c
	modified:   boot/guest/direct_boot.c
	renamed:    boot/guest/direct_boot_info.c -> boot/guest/vboot_info.c
	modified:   boot/guest/vboot_wrapper.c
	modified:   boot/include/guest/deprivilege_boot.h
	modified:   boot/include/guest/direct_boot.h
	modified:   boot/include/guest/vboot.h
	new file:   boot/include/guest/vboot_info.h
	modified:   common/vm_load.c
	modified:   include/arch/x86/guest/vm.h

Tracked-On: #1842
Signed-off-by: Jason Chen CJ <jason.cj.chen@intel.com>
2019-05-20 18:49:59 +08:00

82 lines
1.8 KiB
C

/*
* Copyright (C) 2019 Intel Corporation. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
/* this is for de-privilege guest vboot method */
#include <types.h>
#include <acrn_common.h>
#include <pgtable.h>
#include <logmsg.h>
#include <rtl.h>
#include <vlapic.h>
#include <lapic.h>
#include <per_cpu.h>
#include <multiboot.h>
#include <deprivilege_boot.h>
static struct depri_boot_context depri_boot_ctx;
static struct lapic_regs depri_boot_lapic_regs;
static void init_depri_boot(void)
{
static bool depri_initialized = false;
struct multiboot_info *mbi = NULL;
if (!depri_initialized) {
(void)parse_hv_cmdline();
mbi = (struct multiboot_info *) hpa2hva(((uint64_t)(uint32_t)boot_regs[1]));
if ((mbi == NULL) || ((mbi->mi_flags & MULTIBOOT_INFO_HAS_DRIVES) == 0U)) {
pr_err("no multiboot drivers for depri_boot found");
} else {
(void)memcpy_s(&depri_boot_ctx, sizeof(struct depri_boot_context),
hpa2hva((uint64_t)mbi->mi_drives_addr),
sizeof(struct depri_boot_context));
save_lapic(&depri_boot_lapic_regs);
}
depri_initialized = true;
}
}
const struct depri_boot_context *get_depri_boot_ctx(void)
{
init_depri_boot();
return &depri_boot_ctx;
}
const struct lapic_regs *get_depri_boot_lapic_regs(void)
{
init_depri_boot();
return &depri_boot_lapic_regs;
}
static uint64_t get_depri_boot_ap_trampoline(void)
{
return depri_boot_ctx.ap_trampoline_buf;
}
static void* get_depri_boot_rsdp(void)
{
return hpa2hva((uint64_t)(depri_boot_ctx.rsdp));
}
static void init_depri_boot_irq(void)
{
/* nothing to do for now */
}
static struct vboot_operations depri_boot_ops = {
.init = init_depri_boot,
.get_ap_trampoline = get_depri_boot_ap_trampoline,
.get_rsdp = get_depri_boot_rsdp,
.init_irq = init_depri_boot_irq,
};
struct vboot_operations* get_deprivilege_boot_ops(void)
{
return &depri_boot_ops;
}