help
Linux 64-bit Boot Protocol
+config KVM_BOOT_PROTOCOL_QEMU_VIRT
+ bool "QEMU virt"
+ depends on KVM_VMM_QEMU && !KVM_VMM_FIRECRACKER && ARCH_ARM_64
+ help
+ Default QEMU virt environment
+
config KVM_BOOT_EFI_STUB
bool "EFI stub"
depends on KVM_VMM_QEMU && !KVM_VMM_FIRECRACKER
KVM_LDFLAGS-y += -Wl,-m,elf_x86_64
endif
else ifeq (arm64,$(CONFIG_UK_ARCH))
+ifeq ($(CONFIG_KVM_BOOT_PROTOCOL_QEMU_VIRT),y)
+KVM_LDFLAGS-y += -Wl,--entry=_libkvmplat_entry
KVM_LDFLAGS-y += -Wl,-m,aarch64elf
KVM_LINK_LIBGCC_FLAG := -lgcc
+else ifeq ($(CONFIG_KVM_BOOT_EFI_STUB),y)
+KVM_LDFLAGS-y += -Wl,--entry=uk_efi_entry64
+KVM_LDFLAGS-y += -Wl,-m,aarch64elf
+KVM_LINK_LIBGCC_FLAG := -lgcc
+endif
endif
##
LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) += $(UK_PLAT_COMMON_BASE)/arm/lcpu_start.S
endif
LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) += $(LIBKVMPLAT_BASE)/arm/bpt64.S|arm
+ifeq ($(CONFIG_KVM_BOOT_EFI_STUB),y)
+LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) += $(LIBKVMPLAT_BASE)/arm/efi_post.c
+LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) += $(LIBKVMPLAT_BASE)/arm/efi_entry64.S|arm
+else
LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) += $(LIBKVMPLAT_BASE)/arm/entry64.S|isr
+endif
LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) += $(LIBKVMPLAT_BASE)/arm/exceptions.S|isr
LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) += $(LIBKVMPLAT_BASE)/arm/pagetable64.S|isr
LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) += $(LIBKVMPLAT_BASE)/arm/setup.c
+++ /dev/null
-/* SPDX-License-Identifier: BSD-3-Clause */
-/* Copyright (c) 2023, Unikraft GmbH and The Unikraft Authors.
- * Licensed under the BSD-3-Clause License (the "License").
- * You may not use this file except in compliance with the License.
- */
-#include <kvm/efi.h>
-#include <uk/arch/paging.h>
-#include <uk/plat/common/bootinfo.h>
-#include <uk/plat/lcpu.h>
-#include <uk/plat/common/sections.h>
-
-extern void clean_and_invalidate_dcache_range(unsigned long, unsigned long);
-extern void _ukplat_entry(void *) __noreturn;
-extern __paddr_t vector_table;
-extern void start_mmu(void);
-
-static __u8 __align(16) uk_efi_bootstack[__PAGE_SIZE];
-
-/* We cannot set the system register directly */
-#define uk_efi_set_sp_el1(sp) \
- __asm__ __volatile__("mov sp, %0\n" ::"r" (sp))
-
-void __noreturn uk_efi_jmp_to_kern(void)
-{
- ukplat_lcpu_disable_irq();
-
- /* Invalidate the image from the data cache */
- clean_and_invalidate_dcache_range(__BASE_ADDR, __END);
-
- SYSREG_WRITE64(sctlr_el1, SCTLR_SET_BITS);
- SYSREG_WRITE64(contextidr_el1, 0);
- SYSREG_WRITE64(VBAR_EL1, &vector_table);
- SYSREG_WRITE64(spsr_el1, 0);
- SYSREG_WRITE64(elr_el1, 0);
- SYSREG_WRITE64(cntv_cval_el0, 0);
- /* EDKII's backtrace and dump register code is written in C, so
- * it requires a stack. If SP_EL1 is corrupted before an exception
- * is taken, they rely on SP_EL0 which is set to a backup stack.
- * Thus, reset it to 0 to avoid any back reference to firmware.
- */
- SYSREG_WRITE64(sp_el0, 0);
- SYSREG_WRITE64(tpidr_el0, 0);
-
- start_mmu();
- uk_efi_set_sp_el1(uk_efi_bootstack + __PAGE_SIZE);
- _ukplat_entry(ukplat_bootinfo_get());
-}
--- /dev/null
+/* SPDX-License-Identifier: BSD-3-Clause */
+/* Copyright (c) 2023, Unikraft GmbH and The Unikraft Authors.
+ * Licensed under the BSD-3-Clause License (the "License").
+ * You may not use this file except in compliance with the License.
+ */
+#include <kvm/efi.h>
+#include <uk/arch/paging.h>
+#include <uk/plat/common/bootinfo.h>
+#include <uk/plat/lcpu.h>
+#include <uk/plat/common/sections.h>
+
+extern void clean_and_invalidate_dcache_range(unsigned long, unsigned long);
+extern void _ukplat_entry(void *) __noreturn;
+extern __paddr_t vector_table;
+extern void start_mmu(void);
+
+static __u8 __align(16) uk_efi_bootstack[__PAGE_SIZE];
+
+/* We cannot set the system register directly */
+#define uk_efi_set_sp_el1(sp) \
+ __asm__ __volatile__("mov sp, %0\n" ::"r" (sp))
+
+void __noreturn uk_efi_jmp_to_kern(void)
+{
+ ukplat_lcpu_disable_irq();
+
+ /* Invalidate the image from the data cache */
+ clean_and_invalidate_dcache_range(__BASE_ADDR, __END);
+
+ SYSREG_WRITE64(sctlr_el1, SCTLR_SET_BITS);
+ SYSREG_WRITE64(contextidr_el1, 0);
+ SYSREG_WRITE64(VBAR_EL1, &vector_table);
+ SYSREG_WRITE64(spsr_el1, 0);
+ SYSREG_WRITE64(elr_el1, 0);
+ SYSREG_WRITE64(cntv_cval_el0, 0);
+ /* EDKII's backtrace and dump register code is written in C, so
+ * it requires a stack. If SP_EL1 is corrupted before an exception
+ * is taken, they rely on SP_EL0 which is set to a backup stack.
+ * Thus, reset it to 0 to avoid any back reference to firmware.
+ */
+ SYSREG_WRITE64(sp_el0, 0);
+ SYSREG_WRITE64(tpidr_el0, 0);
+
+ start_mmu();
+ uk_efi_set_sp_el1(uk_efi_bootstack + __PAGE_SIZE);
+ _ukplat_entry(ukplat_bootinfo_get());
+}
OUTPUT_FORMAT("elf64-littleaarch64")
OUTPUT_ARCH(aarch64)
-ENTRY(_libkvmplat_entry)
PHDRS
{