Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp4229796yba; Tue, 23 Apr 2019 17:58:16 -0700 (PDT) X-Google-Smtp-Source: APXvYqxKdTC3SBsQbEC6ZKj3/gblF4LXgMJDoiUmKxBdvQvfexhpZKczVlZM8sdMniCdLTLHK/5c X-Received: by 2002:a17:902:868e:: with SMTP id g14mr11618962plo.183.1556067496430; Tue, 23 Apr 2019 17:58:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1556067496; cv=none; d=google.com; s=arc-20160816; b=z2acaneFJXgFBKXc84YnK4FjJS5MupHuqpCnDE86BiqARX6ARo06WpNFA7gu59GqDx lF61uRrQKzP6U3k0EzjRNJBc1lGSdq+EWd2ML9djZjRf4uv+BjpeFZu3QbgmvTYRXeu7 AZG9eTWD9IO5iYXwVPjp/ooY/Nsv1QjohVUGxSO4b1QJIDiMI3hpM03w4iPj6fSYbl6w emzx2S1NsFY6+t4V5J0Mgq15TroGhChO484H8Bl9m01R3J+y256c6ZdT3M2qfIs4d37I aIcSQk2XR2JajfiykvnmJsTBtMCawq5iiaHNmOlOO8Pwl4KHg4mCtTNEtCKh7NV1LjAj w2Yg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=dPMeNBnY8B4iqbRWXzuXCKOVPe0mDIpy2m32Nb4+ywY=; b=DDr9gDD38t3EYVJdbeY+y7vhmqsgj7mkfTnjUkxWCRQjc+Wn2zF3r469SHi06pA4Ch TzXGhMhX/SRlFP52dEtjORbKxjTaDyuHJ3PU3CLIEdUxFPEza+osRwIlTKT4VGbL/WKv hcSgfHa8c+ky1Ub7gExzk8okOA93lWoaYLu9i3GC/nFzdkT728rkFrfOeIIqQyYDi4pW hSciO/afA+Xjhhoh55RkttJkusa7JN9gKszMX8xqUbC7eA4M+oyWBRMvpq6gcoLwtrNT OA372AiiHIukFClZZbr5XA8L7nhqs3M3//Caz5q16VYablszGy22m+w+FuC581YjmQc0 jTEg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g11si16752724plt.35.2019.04.23.17.57.59; Tue, 23 Apr 2019 17:58:16 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729136AbfDXA45 (ORCPT + 99 others); Tue, 23 Apr 2019 20:56:57 -0400 Received: from mga02.intel.com ([134.134.136.20]:21806 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728615AbfDXA4y (ORCPT ); Tue, 23 Apr 2019 20:56:54 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Apr 2019 17:56:53 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.60,387,1549958400"; d="scan'208";a="340195441" Received: from genxtest-ykzhao.sh.intel.com ([10.239.143.71]) by fmsmga005.fm.intel.com with ESMTP; 23 Apr 2019 17:56:52 -0700 From: Zhao Yakui To: linux-kernel@vger.kernel.org, x86@kernel.org Cc: tglx@linutronix.de, bp@alien8.de, Zhao Yakui , Jason Chen CJ Subject: [RFC PATCH v5 2/4] x86: Add the support of Linux guest on ACRN hypervisor Date: Wed, 24 Apr 2019 08:54:18 +0800 Message-Id: <1556067260-9128-3-git-send-email-yakui.zhao@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1556067260-9128-1-git-send-email-yakui.zhao@intel.com> References: <1556067260-9128-1-git-send-email-yakui.zhao@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org ACRN is an open-source hypervisor maintained by Linux Foundation. It is built for embedded IOT with small footprint and real-time features. Add the ACRN guest support so that it allows Linux to be booted under ACRN hypervisor. Following this patch it will setup the upcall notification vector and enable hypercall. And after ACRN guest is supported, the ACRN driver part can add the interface that is used to manage the virtualized CPU/memory/device/interrupt for other guest system. Co-developed-by: Jason Chen CJ Signed-off-by: Jason Chen CJ Signed-off-by: Zhao Yakui --- v1->v2: Change the CONFIG_ACRN to CONFIG_ACRN_GUEST, which makes it easy to understand. Remove the export of x86_hyper_acrn. v2->v3: Remove the unnecessary dependency of PARAVIRT v3->v4: Refine the commit log and add meaningful description in Kconfig v4->v5: Minor change for the commit log. --- arch/x86/Kconfig | 12 ++++++++++++ arch/x86/include/asm/hypervisor.h | 1 + arch/x86/kernel/cpu/Makefile | 1 + arch/x86/kernel/cpu/acrn.c | 39 +++++++++++++++++++++++++++++++++++++++ arch/x86/kernel/cpu/hypervisor.c | 4 ++++ 5 files changed, 57 insertions(+) create mode 100644 arch/x86/kernel/cpu/acrn.c diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 2fc9297..8dc4200 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -845,6 +845,18 @@ config JAILHOUSE_GUEST cell. You can leave this option disabled if you only want to start 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 ACRN hypervisor. Enabling + this will allow the kernel to boot in virtualized environment under + 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 source "arch/x86/Kconfig.cpu" diff --git a/arch/x86/include/asm/hypervisor.h b/arch/x86/include/asm/hypervisor.h index 8c5aaba..50a30f6 100644 --- a/arch/x86/include/asm/hypervisor.h +++ b/arch/x86/include/asm/hypervisor.h @@ -29,6 +29,7 @@ enum x86_hypervisor_type { X86_HYPER_XEN_HVM, X86_HYPER_KVM, X86_HYPER_JAILHOUSE, + X86_HYPER_ACRN, }; #ifdef CONFIG_HYPERVISOR_GUEST diff --git a/arch/x86/kernel/cpu/Makefile b/arch/x86/kernel/cpu/Makefile index cfd24f9..17a7cdf 100644 --- a/arch/x86/kernel/cpu/Makefile +++ b/arch/x86/kernel/cpu/Makefile @@ -44,6 +44,7 @@ obj-$(CONFIG_X86_CPU_RESCTRL) += resctrl/ obj-$(CONFIG_X86_LOCAL_APIC) += perfctr-watchdog.o obj-$(CONFIG_HYPERVISOR_GUEST) += vmware.o hypervisor.o mshyperv.o +obj-$(CONFIG_ACRN_GUEST) += acrn.o ifdef CONFIG_X86_FEATURE_NAMES quiet_cmd_mkcapflags = MKCAP $@ diff --git a/arch/x86/kernel/cpu/acrn.c b/arch/x86/kernel/cpu/acrn.c new file mode 100644 index 0000000..f556640 --- /dev/null +++ b/arch/x86/kernel/cpu/acrn.c @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * ACRN detection support + * + * Copyright (C) 2019 Intel Corporation. All rights reserved. + * + * Jason Chen CJ + * Zhao Yakui + * + */ + +#include + +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 now. + * Later it needs to check the X86_FEATURE_X2APIC bit of cpu info + * returned by CPUID to determine whether the x2apic is + * supported in Linux 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, +}; diff --git a/arch/x86/kernel/cpu/hypervisor.c b/arch/x86/kernel/cpu/hypervisor.c index 479ca47..87e39ad 100644 --- a/arch/x86/kernel/cpu/hypervisor.c +++ b/arch/x86/kernel/cpu/hypervisor.c @@ -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_kvm; extern const struct hypervisor_x86 x86_hyper_jailhouse; +extern const struct hypervisor_x86 x86_hyper_acrn; static const __initconst struct hypervisor_x86 * const hypervisors[] = { @@ -49,6 +50,9 @@ static const __initconst struct hypervisor_x86 * const hypervisors[] = #ifdef CONFIG_JAILHOUSE_GUEST &x86_hyper_jailhouse, #endif +#ifdef CONFIG_ACRN_GUEST + &x86_hyper_acrn, +#endif }; enum x86_hypervisor_type x86_hyper_type; -- 2.7.4