Received: by 10.213.65.68 with SMTP id h4csp1153251imn; Wed, 4 Apr 2018 13:36:20 -0700 (PDT) X-Google-Smtp-Source: AIpwx4+44mgSnbemaBsMOIxaSBh7mdwXjJTL298KSSvJ656HiP93aO1t1bIAdTz8/Cwyklzo4V8N X-Received: by 10.99.121.131 with SMTP id u125mr13201017pgc.48.1522874180590; Wed, 04 Apr 2018 13:36:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522874180; cv=none; d=google.com; s=arc-20160816; b=iATFizcfaHFnpwTq/np0SIqKIIDIZTWCE6HOasTGqtz6ZlPvRz7Wb7/ix9ddOIcZvr pIt8baWiPrXFdj584EFcw3bFUIo2JR4VZrZewBsocqDRUXsoF0ZnP8nUmjCmnFghMOYj WgzA9yOJKq9LGnmXeVk5BwD5zDG+swzH5Le3celatLALutPAmGYGzGCgz1+C/ZfGC2+E 49eSP41gEp3rIDN8jjz0HTxTyWI31cB5SGJdzV8WsVvnVDnlo7sVcp0jqgNL9GIhC4Ns +kXZjP4vMxJx1V5W5j8Rvk7SJjX2tZ9elRxxMOHc5h9ba9epJbisk1AJk5sALF2GJ1XN K1Og== 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=V45EysO6MB61XK2bd77AQoXS1XGAz8Yl2cPJom0lndU=; b=t/sF/B6HPtvu5nETyxRTuiVAJ6uwKt0zcaFvuGtfUCoEffq+h0zctMwDWUGJyx4uGR hGytS5824Op/zosY3OqekuJzl5dfAcEXTDyfZE9+ZmGbd4gFxnZO/4jWREEN2d3WuJ1V sBp9wJczCS5vjzDquI5dtL+BvzLWc7igUt21Ytq3+0l9OSsL1h+0HYPcYB4L1OERGH5k pOUbOUzhXQJporNneZx0MRfuXDu54LnN4oHvYVIBoBtptWAnKubyZx1qm9QhTPQxQ1m3 g1JrSXSh6rf+5EcA/kHUzsWpZCIDORxemDIdOPuG2U2+DwZQhPBz4jS1P5gULXxxNT3X qE1g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2017-10-26 header.b=Ya0pln9j; 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 c1-v6si4172846plk.611.2018.04.04.13.36.06; Wed, 04 Apr 2018 13:36:20 -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=Ya0pln9j; 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 S1752185AbeDDUfB (ORCPT + 99 others); Wed, 4 Apr 2018 16:35:01 -0400 Received: from userp2120.oracle.com ([156.151.31.85]:39644 "EHLO userp2120.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751773AbeDDUe7 (ORCPT ); Wed, 4 Apr 2018 16:34:59 -0400 Received: from pps.filterd (userp2120.oracle.com [127.0.0.1]) by userp2120.oracle.com (8.16.0.22/8.16.0.22) with SMTP id w34KVuBW096306; Wed, 4 Apr 2018 20:34:43 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=V45EysO6MB61XK2bd77AQoXS1XGAz8Yl2cPJom0lndU=; b=Ya0pln9jwzz67F+IjM9vm/RWCUggJysZWWvkzLYQOOWs1A73Kqwao1xp6m4tWEBZtN6w L6kwjSXnqOo941klhbwngAsA9uSRqVVDMRpVoIgeeO+U7hJk0sny+GPkfvhYe9z/7MM8 AYE7aK2bBoCN+Vn+hwb3kTn7I4xBM12HsJKKoG6CPxsQNDt5Doht8JLjTUkI/1U6P4L/ V1D2+gjusSpAFuhniLKl8NVl1j3SBypebOQiKvEWn+w1qf9GzC9ectwqzb9KM60zIi4N I5p2eBwVQvOVq6DxTJSIbuisF5nKDGc/2q2L7NuXizL89q/rY5/TIm9CY8UODu/tdJYa iQ== Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp2120.oracle.com with ESMTP id 2h55tt00a9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 04 Apr 2018 20:34:43 +0000 Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.14.4/8.14.4) with ESMTP id w34KYgpZ022594 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 4 Apr 2018 20:34:42 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id w34KYfpJ023998; Wed, 4 Apr 2018 20:34:42 GMT Received: from marawils-linux.us.oracle.com (/10.141.197.9) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 04 Apr 2018 13:34:41 -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 v6 7/7] KVM: x86: Allow Qemu/KVM to use PVH entry point Date: Wed, 4 Apr 2018 13:34:36 -0700 Message-Id: <1522874076-18409-1-git-send-email-maran.wilson@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1522873659-17572-1-git-send-email-maran.wilson@oracle.com> References: <1522873659-17572-1-git-send-email-maran.wilson@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=8853 signatures=668697 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-1804040198 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 e3b836d7ad09..1e6d83e181b5 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -787,6 +787,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 efbceba8db4f..815a09ad625c 100644 --- a/arch/x86/platform/pvh/enlighten.c +++ b/arch/x86/platform/pvh/enlighten.c @@ -8,6 +8,9 @@ #include #include +#include +#include + #include #include @@ -40,11 +43,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 = @@ -75,7 +95,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; x86_init.acpi.get_root_pointer = pvh_get_root_pointer; } @@ -90,13 +110,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(); } /* @@ -105,13 +122,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