Received: by 10.213.65.68 with SMTP id h4csp674420imn; Tue, 20 Mar 2018 12:24:14 -0700 (PDT) X-Google-Smtp-Source: AG47ELvXdVl3oSNwJ6stIpEdYmvTpLeYnCAGBb7PwqzZ+rawA7hzfXpLcvA6YLLCHQCBc3hJovvQ X-Received: by 10.101.73.141 with SMTP id r13mr8929708pgs.426.1521573854753; Tue, 20 Mar 2018 12:24:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521573854; cv=none; d=google.com; s=arc-20160816; b=WY/z+XGxlZdmcc4rSdcGP+Dej/mX210tFgbcAboJNJb2attmXMyKK1B+PB2oxlLQdj uEXq5juVbyPkap/Gud093DOolwXGcLV/SgLl4vpDfLnHmv4jVK/oJg2x+OdtMJWxytMU ujzMUCQjWTzU3f1DiSZXOeRsKe8MCnw2M3dTodoz8+3TRJDf7EYLVjZtRlKPg3SEUwMD qTXO09Akl1R+3OVoEkgRBVVxlvwnl6gcvOWIP+bMOVR0j/9JD66q11T3RNPHUI8YaskA vgHG4At6ri+rm2nZHTyN9ZlHoi+XOd9bFKc6qVSEpL76cidCgVn2QjifvHlZ1i3b2562 Jqeg== 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:dkim-signature:arc-authentication-results; bh=Ott9YqAnapOQE9F6RSvZhAWUSWPEDdaOKvU50Rqpip4=; b=rG4h1qyWvOptocPQMpCO1EKYMCxK//s8Io+9tzjTwUqOs+qPVgmFbA8uFI645AkEoq l6uN6SrJQKqqVJlB8JHpspTJIIUxajeyoZz/gKsST1I40OcTNd5+D5Kc4QqvO1DEsFrl zhKYXGK8pHCMhBUmaQJbnwGpFQgMoULqZJhynB3w1NXyhKVFO8AvTWpiswF/DtNbQmuA of0GwcqzC3n7+zEBRp4LF7WyjEIOHuS3qRthRymUUCiAdLcDG1R3mK7CT5KJ9WWQokxn oQRy1ywT3jtY1JZik33xL8aZeqknX8bOrkJhFAdhaOiLtb9+hs2pRwumn2hOGZZ9Zcmo gFqg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2017-10-26 header.b=drgZQNgc; 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=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g24si1762172pfe.107.2018.03.20.12.23.59; Tue, 20 Mar 2018 12:24:14 -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; dkim=pass header.i=@oracle.com header.s=corp-2017-10-26 header.b=drgZQNgc; 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=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751739AbeCTTWH (ORCPT + 99 others); Tue, 20 Mar 2018 15:22:07 -0400 Received: from aserp2130.oracle.com ([141.146.126.79]:43348 "EHLO aserp2130.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751600AbeCTTWF (ORCPT ); Tue, 20 Mar 2018 15:22:05 -0400 Received: from pps.filterd (aserp2130.oracle.com [127.0.0.1]) by aserp2130.oracle.com (8.16.0.22/8.16.0.22) with SMTP id w2KJCOo9098048; Tue, 20 Mar 2018 19:21:44 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2017-10-26; bh=Ott9YqAnapOQE9F6RSvZhAWUSWPEDdaOKvU50Rqpip4=; b=drgZQNgcCCwxJN6FRLRZRb2am/uErQenAuCk689MglrufAW5US8GNjUXITgkhF0ZuReV DHc3r8uUHVJOsIkio3tlIEDthbF5PhN7wqLfxApmqvIhUs02NnO/SHHJnQkeguhm6qU/ df4/fkCDtvinNimp7PHfgc1Yr9ewtQKljKVxqE7uNwXNfapsa+ufxltp8jiN1dK8lua9 xFNjdRndpQF54h0lN0ZRabq/lDI7n7ZftCqepnVNm0THukUkai1Wy6lH8siwG5yhwg4J aLxnLgfAaKxTesC+tHWLyprIfk7xDvxoswFjKU3jnDi7E4ayM03w3IVjtzi2rJkM9efa JA== Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp2130.oracle.com with ESMTP id 2gu88m814s-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 20 Mar 2018 19:21:44 +0000 Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id w2KJLh3e010681 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 20 Mar 2018 19:21:43 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id w2KJLgdG029787; Tue, 20 Mar 2018 19:21:42 GMT Received: from marawils-linux.us.oracle.com (/10.141.197.9) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 20 Mar 2018 12:21:42 -0700 From: Maran Wilson To: x86@kernel.org, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, kvm@vger.kernel.org, pbonzini@redhat.com, jgross@suse.com Cc: tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com, roger.pau@citrix.com, boris.ostrovsky@oracle.com, rkrcmar@redhat.com, maran.wilson@oracle.com Subject: [PATCH v5 7/7] KVM: x86: Allow Qemu/KVM to use PVH entry point Date: Tue, 20 Mar 2018 12:21:20 -0700 Message-Id: <1521573680-17633-1-git-send-email-maran.wilson@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1521573369-17216-1-git-send-email-maran.wilson@oracle.com> References: <1521573369-17216-1-git-send-email-maran.wilson@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=8838 signatures=668695 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=7 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1711220000 definitions=main-1803200127 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org For certain applications it is desirable to rapidly boot a KVM virtual machine. In cases where legacy hardware and software support within the guest is not needed, Qemu should be able to boot directly into the uncompressed Linux kernel binary without the need to run firmware. There already exists an ABI to allow this for Xen PVH guests and the ABI is supported by Linux and FreeBSD: https://xenbits.xen.org/docs/unstable/misc/pvh.html This patch enables Qemu to use that same entry point for booting KVM guests. Signed-off-by: Maran Wilson Suggested-by: Konrad Rzeszutek Wilk Suggested-by: Boris Ostrovsky Tested-by: Boris Ostrovsky --- arch/x86/Kbuild | 2 +- arch/x86/Kconfig | 8 ++++++++ arch/x86/platform/pvh/Makefile | 4 ++-- arch/x86/platform/pvh/enlighten.c | 43 +++++++++++++++++++++++++++++---------- 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/arch/x86/Kbuild b/arch/x86/Kbuild index 2089e4414300..c625f57472f7 100644 --- a/arch/x86/Kbuild +++ b/arch/x86/Kbuild @@ -7,7 +7,7 @@ obj-$(CONFIG_KVM) += kvm/ # Xen paravirtualization support obj-$(CONFIG_XEN) += xen/ -obj-$(CONFIG_XEN_PVH) += platform/pvh/ +obj-$(CONFIG_PVH) += platform/pvh/ # Hyper-V paravirtualization support obj-$(subst m,y,$(CONFIG_HYPERV)) += hyperv/ diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 58831320b5d2..74ad956ee0f6 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -798,6 +798,14 @@ config PVH This option enables the PVH entry point for guest virtual machines as specified in the x86/HVM direct boot ABI. +config KVM_GUEST_PVH + bool "Support for running as a KVM PVH guest" + depends on KVM_GUEST + select PVH + ---help--- + This option enables starting KVM guests via the PVH entry point as + specified in the x86/HVM direct boot ABI. + config KVM_DEBUG_FS bool "Enable debug information for KVM Guests in debugfs" depends on KVM_GUEST && DEBUG_FS diff --git a/arch/x86/platform/pvh/Makefile b/arch/x86/platform/pvh/Makefile index 9fd25efcd2a3..5dec5067c9fb 100644 --- a/arch/x86/platform/pvh/Makefile +++ b/arch/x86/platform/pvh/Makefile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 OBJECT_FILES_NON_STANDARD_head.o := y -obj-$(CONFIG_XEN_PVH) += enlighten.o -obj-$(CONFIG_XEN_PVH) += head.o +obj-$(CONFIG_PVH) += enlighten.o +obj-$(CONFIG_PVH) += head.o diff --git a/arch/x86/platform/pvh/enlighten.c b/arch/x86/platform/pvh/enlighten.c index 347ecb1860d5..433f586d8302 100644 --- a/arch/x86/platform/pvh/enlighten.c +++ b/arch/x86/platform/pvh/enlighten.c @@ -7,6 +7,9 @@ #include #include +#include +#include + #include #include @@ -34,11 +37,28 @@ void __init __weak mem_map_via_hcall(struct boot_params *ptr __maybe_unused) BUG(); } -static void __init init_pvh_bootparams(void) +static void __init init_pvh_bootparams(bool xen_guest) { memset(&pvh_bootparams, 0, sizeof(pvh_bootparams)); - mem_map_via_hcall(&pvh_bootparams); + if ((pvh_start_info.version > 0) && (pvh_start_info.memmap_entries)) { + struct hvm_memmap_table_entry *ep; + int i; + + ep = __va(pvh_start_info.memmap_paddr); + pvh_bootparams.e820_entries = pvh_start_info.memmap_entries; + + for (i = 0; i < pvh_bootparams.e820_entries ; i++, ep++) { + pvh_bootparams.e820_table[i].addr = ep->addr; + pvh_bootparams.e820_table[i].size = ep->size; + pvh_bootparams.e820_table[i].type = ep->type; + } + } else if (xen_guest) { + mem_map_via_hcall(&pvh_bootparams); + } else { + /* Non-xen guests are not supported by version 0 */ + BUG(); + } if (pvh_bootparams.e820_entries < E820_MAX_ENTRIES_ZEROPAGE - 1) { pvh_bootparams.e820_table[pvh_bootparams.e820_entries].addr = @@ -69,7 +89,7 @@ static void __init init_pvh_bootparams(void) * environment (i.e. hardware_subarch 0). */ pvh_bootparams.hdr.version = 0x212; - pvh_bootparams.hdr.type_of_loader = (9 << 4) | 0; /* Xen loader */ + pvh_bootparams.hdr.type_of_loader = ((xen_guest ? 0x9 : 0xb) << 4) | 0; } /* @@ -82,13 +102,10 @@ void __init __weak xen_pvh_init(void) BUG(); } -/* - * When we add support for other hypervisors like Qemu/KVM, this routine can - * selectively invoke the appropriate initialization based on guest type. - */ -static void hypervisor_specific_init(void) +static void hypervisor_specific_init(bool xen_guest) { - xen_pvh_init(); + if (xen_guest) + xen_pvh_init(); } /* @@ -97,13 +114,17 @@ static void hypervisor_specific_init(void) */ void __init xen_prepare_pvh(void) { + + u32 msr = xen_cpuid_base(); + bool xen_guest = !!msr; + if (pvh_start_info.magic != XEN_HVM_START_MAGIC_VALUE) { xen_raw_printk("Error: Unexpected magic value (0x%08x)\n", pvh_start_info.magic); BUG(); } - hypervisor_specific_init(); + hypervisor_specific_init(xen_guest); - init_pvh_bootparams(); + init_pvh_bootparams(xen_guest); } -- 2.16.1