From patchwork Wed Apr 4 20:34:36 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maran Wilson X-Patchwork-Id: 10323379 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id CCC9160541 for ; Wed, 4 Apr 2018 20:35:14 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BE0D228FFD for ; Wed, 4 Apr 2018 20:35:14 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B285629003; Wed, 4 Apr 2018 20:35:14 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,RCVD_IN_DNSWL_HI,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3C2BC28FFD for ; Wed, 4 Apr 2018 20:35:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752068AbeDDUfB (ORCPT ); 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: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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); }