Commit ec7972c9 authored by Zhao Yakui's avatar Zhao Yakui Committed by Borislav Petkov

x86: Add support for Linux guests on an ACRN hypervisor

ACRN is an open-source hypervisor maintained by The Linux Foundation. It
is built for embedded IOT with small footprint and real-time features.
Add ACRN guest support so that it allows Linux to be booted under the
ACRN hypervisor. This adds only the barebones implementation.

 [ bp: Massage commit message and help text. ]
Co-developed-by: default avatarJason Chen CJ <jason.cj.chen@intel.com>
Signed-off-by: default avatarJason Chen CJ <jason.cj.chen@intel.com>
Signed-off-by: default avatarZhao Yakui <yakui.zhao@intel.com>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: x86-ml <x86@kernel.org>
Link: https://lkml.kernel.org/r/1559108037-18813-3-git-send-email-yakui.zhao@intel.com
parent ecca2502
...@@ -835,6 +835,16 @@ config JAILHOUSE_GUEST ...@@ -835,6 +835,16 @@ config JAILHOUSE_GUEST
cell. You can leave this option disabled if you only want to start cell. You can leave this option disabled if you only want to start
Jailhouse and run Linux afterwards in the root cell. Jailhouse and run Linux afterwards in the root cell.
config ACRN_GUEST
bool "ACRN Guest support"
depends on X86_64
help
This option allows to run Linux as guest in the ACRN hypervisor. ACRN is
a flexible, lightweight reference open-source hypervisor, built with
real-time and safety-criticality in mind. It is built for embedded
IOT with small footprint and real-time features. More details can be
found in https://projectacrn.org/.
endif #HYPERVISOR_GUEST endif #HYPERVISOR_GUEST
source "arch/x86/Kconfig.cpu" source "arch/x86/Kconfig.cpu"
......
...@@ -29,6 +29,7 @@ enum x86_hypervisor_type { ...@@ -29,6 +29,7 @@ enum x86_hypervisor_type {
X86_HYPER_XEN_HVM, X86_HYPER_XEN_HVM,
X86_HYPER_KVM, X86_HYPER_KVM,
X86_HYPER_JAILHOUSE, X86_HYPER_JAILHOUSE,
X86_HYPER_ACRN,
}; };
#ifdef CONFIG_HYPERVISOR_GUEST #ifdef CONFIG_HYPERVISOR_GUEST
......
...@@ -47,6 +47,7 @@ obj-$(CONFIG_X86_CPU_RESCTRL) += resctrl/ ...@@ -47,6 +47,7 @@ obj-$(CONFIG_X86_CPU_RESCTRL) += resctrl/
obj-$(CONFIG_X86_LOCAL_APIC) += perfctr-watchdog.o obj-$(CONFIG_X86_LOCAL_APIC) += perfctr-watchdog.o
obj-$(CONFIG_HYPERVISOR_GUEST) += vmware.o hypervisor.o mshyperv.o obj-$(CONFIG_HYPERVISOR_GUEST) += vmware.o hypervisor.o mshyperv.o
obj-$(CONFIG_ACRN_GUEST) += acrn.o
ifdef CONFIG_X86_FEATURE_NAMES ifdef CONFIG_X86_FEATURE_NAMES
quiet_cmd_mkcapflags = MKCAP $@ quiet_cmd_mkcapflags = MKCAP $@
......
// SPDX-License-Identifier: GPL-2.0
/*
* ACRN detection support
*
* Copyright (C) 2019 Intel Corporation. All rights reserved.
*
* Jason Chen CJ <jason.cj.chen@intel.com>
* Zhao Yakui <yakui.zhao@intel.com>
*
*/
#include <asm/hypervisor.h>
static uint32_t __init acrn_detect(void)
{
return hypervisor_cpuid_base("ACRNACRNACRN\0\0", 0);
}
static void __init acrn_init_platform(void)
{
}
static bool acrn_x2apic_available(void)
{
/*
* x2apic is not supported for now. Future enablement will have to check
* X86_FEATURE_X2APIC to determine whether x2apic is supported in the
* guest.
*/
return false;
}
const __initconst struct hypervisor_x86 x86_hyper_acrn = {
.name = "ACRN",
.detect = acrn_detect,
.type = X86_HYPER_ACRN,
.init.init_platform = acrn_init_platform,
.init.x2apic_available = acrn_x2apic_available,
};
...@@ -32,6 +32,7 @@ extern const struct hypervisor_x86 x86_hyper_xen_pv; ...@@ -32,6 +32,7 @@ extern const struct hypervisor_x86 x86_hyper_xen_pv;
extern const struct hypervisor_x86 x86_hyper_xen_hvm; extern const struct hypervisor_x86 x86_hyper_xen_hvm;
extern const struct hypervisor_x86 x86_hyper_kvm; extern const struct hypervisor_x86 x86_hyper_kvm;
extern const struct hypervisor_x86 x86_hyper_jailhouse; extern const struct hypervisor_x86 x86_hyper_jailhouse;
extern const struct hypervisor_x86 x86_hyper_acrn;
static const __initconst struct hypervisor_x86 * const hypervisors[] = static const __initconst struct hypervisor_x86 * const hypervisors[] =
{ {
...@@ -49,6 +50,9 @@ static const __initconst struct hypervisor_x86 * const hypervisors[] = ...@@ -49,6 +50,9 @@ static const __initconst struct hypervisor_x86 * const hypervisors[] =
#ifdef CONFIG_JAILHOUSE_GUEST #ifdef CONFIG_JAILHOUSE_GUEST
&x86_hyper_jailhouse, &x86_hyper_jailhouse,
#endif #endif
#ifdef CONFIG_ACRN_GUEST
&x86_hyper_acrn,
#endif
}; };
enum x86_hypervisor_type x86_hyper_type; enum x86_hypervisor_type x86_hyper_type;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment