mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-05 13:42:07 +00:00
currently, ACRN hypervisor can either boot from sbl/abl or uefi, that's why we have different firmware method under bsp & boot dirs. but the fact is that we actually have two different operations based on different guest boot mode: 1. de-privilege-boot: ACRN hypervisor will boot VM0 in the same context as native(before entering hypervisor) - it means hypervisor will co-work with ACRN UEFI bootloader, restore the context env and de-privilege this env to VM0 guest. 2. direct-boot: ACRN hypervisor will directly boot different pre-launched VM(including SOS), it will setup guest env by pre-defined configuration, and prepare guest kernel image, ramdisk which fetch from multiboot modules. this patch is trying to: - rename files related with firmware, change them to guest vboot related - restruct all guest boot stuff in boot & bsp dirs into a new boot/guest dir - use de-privilege & direct boot to distinguish two different boot operations this patch is pure file movement, the rename of functions based on old assumption will be in the following patch. Changes to be committed: modified: ../efi-stub/Makefile modified: ../efi-stub/boot.c modified: Makefile modified: arch/x86/cpu.c modified: arch/x86/guest/vm.c modified: arch/x86/init.c modified: arch/x86/irq.c modified: arch/x86/trampoline.c modified: boot/acpi.c renamed: bsp/cmdline.c -> boot/cmdline.c renamed: bsp/firmware_uefi.c -> boot/guest/deprivilege_boot.c renamed: boot/uefi/uefi_boot.c -> boot/guest/deprivilege_boot_info.c renamed: bsp/firmware_sbl.c -> boot/guest/direct_boot.c renamed: boot/sbl/multiboot.c -> boot/guest/direct_boot_info.c renamed: bsp/firmware_wrapper.c -> boot/guest/vboot_wrapper.c modified: boot/include/acpi.h renamed: bsp/include/firmware_uefi.h -> boot/include/guest/deprivilege_boot.h renamed: bsp/include/firmware_sbl.h -> boot/include/guest/direct_boot.h renamed: bsp/include/firmware.h -> boot/include/guest/vboot.h modified: include/arch/x86/multiboot.h Tracked-On: #1842 Signed-off-by: Jason Chen CJ <jason.cj.chen@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
96 lines
2.1 KiB
C
96 lines
2.1 KiB
C
/*
|
|
* Copyright (C) 2019 Intel Corporation. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
/* this is for UEFI platform */
|
|
|
|
#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 uefi_context uefi_ctx;
|
|
static struct lapic_regs uefi_lapic_regs;
|
|
|
|
static void uefi_init(void)
|
|
{
|
|
static bool uefi_initialized = false;
|
|
struct multiboot_info *mbi = NULL;
|
|
|
|
if (!uefi_initialized) {
|
|
parse_hv_cmdline();
|
|
|
|
mbi = (struct multiboot_info *) hpa2hva(((uint64_t)(uint32_t)boot_regs[1]));
|
|
if ((mbi->mi_flags & MULTIBOOT_INFO_HAS_DRIVES) == 0U) {
|
|
pr_err("no multiboot drivers for uefi found");
|
|
} else {
|
|
memcpy_s(&uefi_ctx, sizeof(struct uefi_context), hpa2hva((uint64_t)mbi->mi_drives_addr),
|
|
sizeof(struct uefi_context));
|
|
save_lapic(&uefi_lapic_regs);
|
|
}
|
|
uefi_initialized = true;
|
|
}
|
|
}
|
|
|
|
const struct uefi_context *get_uefi_ctx(void)
|
|
{
|
|
uefi_init();
|
|
return &uefi_ctx;
|
|
}
|
|
|
|
const struct lapic_regs *get_uefi_lapic_regs(void)
|
|
{
|
|
uefi_init();
|
|
return &uefi_lapic_regs;
|
|
}
|
|
|
|
static uint64_t uefi_get_ap_trampoline(void)
|
|
{
|
|
return (uint64_t)(uefi_ctx.ap_trampoline_buf);
|
|
}
|
|
|
|
static void* uefi_get_rsdp(void)
|
|
{
|
|
return hpa2hva((uint64_t)(uefi_ctx.rsdp));
|
|
}
|
|
|
|
static void uefi_spurious_handler(int32_t vector)
|
|
{
|
|
if (get_pcpu_id() == BOOT_CPU_ID) {
|
|
struct acrn_vcpu *vcpu = per_cpu(vcpu, BOOT_CPU_ID);
|
|
|
|
if (vcpu != NULL) {
|
|
vlapic_set_intr(vcpu, vector, LAPIC_TRIG_EDGE);
|
|
} else {
|
|
pr_err("%s vcpu or vlapic is not ready, interrupt lost\n", __func__);
|
|
}
|
|
}
|
|
}
|
|
|
|
static void uefi_init_irq(void)
|
|
{
|
|
spurious_handler = (spurious_handler_t)uefi_spurious_handler;
|
|
/* we defer irq enabling till vlapic is ready */
|
|
}
|
|
|
|
static struct firmware_operations firmware_uefi_ops = {
|
|
.init = uefi_init,
|
|
.get_ap_trampoline = uefi_get_ap_trampoline,
|
|
.get_rsdp = uefi_get_rsdp,
|
|
.init_irq = uefi_init_irq,
|
|
.init_vm_boot_info = uefi_init_vm_boot_info,
|
|
};
|
|
|
|
struct firmware_operations* uefi_get_firmware_operations(void)
|
|
{
|
|
return &firmware_uefi_ops;
|
|
}
|