Received: by 10.223.185.116 with SMTP id b49csp6507288wrg; Wed, 28 Feb 2018 10:32:39 -0800 (PST) X-Google-Smtp-Source: AH8x225jgED8D/OQfnNFXZnZ23bLZOc6sZl4glCgxHHQr1FYH9mer2Fqr2hs3Lx5pNggMaKq33V5 X-Received: by 10.99.166.10 with SMTP id t10mr14943680pge.198.1519842758961; Wed, 28 Feb 2018 10:32:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519842758; cv=none; d=google.com; s=arc-20160816; b=csDI+hMoSf1AqSYBym8D/PYQYTtMSwa2q8gYyqaWxf5QQi0gxiQ6xzObEqD5l/UrhG G3jE1Egdu500FYvfjophJl3uT7ZOsrWmF9En1I/UGjgUYFrv3kP4HKOUCnL3L3/xAM9B VR+yng/IhXy6OruclYJ3UMS4aD2MYn31sLeETsoflUiJ7aWiIpf2QTANEoN218JfJkwl c1YVV7ASiDN2ZKXCwjKRdRG62G88ycgp83o3jq57urL+yJdD8bxjzFFVYzQkqHgMDA/4 m9N4XOyN7cp8O+fBSFB4cUjbf2LghlkySgSD7rbqv0x1NhxQ1/M6oUi2fETfqDhjFwJW mp5A== 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=XkYVVhW39KnOCMbiuvmHaVlGfp3iwNvI4xwPtt4aJus=; b=GEwAqONjismSklQ71JsxCgBTfsEpzZRa8BPAG3RZXyQoYtRnQ956lxoHKD/pbaleDQ cj1S27p/b9Wr+8WRGjCrFIjdWvB6CJYUqzKnDZxkO5pGTBEiL24cQdg593qbpndGsusW LCWmvZ3HnvkoAg9wzVn5Rpc9ucdiAhRtIhWn0MVpT/pYKDwudqeXiBn+g1/ZfgMjyg1l T2Kvz/VPhRa9JYTOsimTYRK5zuoEfd2K+/iJu44KC1B2WLntOT/ot4Tf6q0u6GaAMQ9N GXF2uXRMs4PfZ+XYR1dHg6DlVVTgAKZXym35L9Pb7LtxhW4YM/2Ig00iinu49vuJcFLp sJ6Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2017-10-26 header.b=Tw+f0BEc; 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 f9si1333208pgt.106.2018.02.28.10.32.24; Wed, 28 Feb 2018 10:32:38 -0800 (PST) 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=Tw+f0BEc; 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 S933046AbeB1SbV (ORCPT + 99 others); Wed, 28 Feb 2018 13:31:21 -0500 Received: from userp2130.oracle.com ([156.151.31.86]:58968 "EHLO userp2130.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932278AbeB1SbT (ORCPT ); Wed, 28 Feb 2018 13:31:19 -0500 Received: from pps.filterd (userp2130.oracle.com [127.0.0.1]) by userp2130.oracle.com (8.16.0.22/8.16.0.22) with SMTP id w1SIQZJu030770; Wed, 28 Feb 2018 18:29:33 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=XkYVVhW39KnOCMbiuvmHaVlGfp3iwNvI4xwPtt4aJus=; b=Tw+f0BEcHCfQCU/u4QY/i6ysCKqN0JYd7SHOfpCLW6eHL+L4mvhlmNuomnRwJVxbqZkv ALr6ilbQHdRs5jadg5WJglZvbQRhVzi571vTWjEspiU0cST0d4T71EOT7Ipw96Vgdl9G 0ujDiQFSNO/Lbux/LJ41oR+uz3D5UA888C60b/8tJNVa6QGUOTKo1dn7aCbLEJ9MxvF6 V3bfdBICGlaBeqFN4q4ZL0/dyZ0u71TifsNlXzopuZS1PLnGh5+DEUSISX7jPXdtAm8W uFmKgi6bprMK+suwGD9nDjaN2DWuVxdOsySC9736jIS+/R3neZLn/1dWixkTkbDBpts9 Rg== Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp2130.oracle.com with ESMTP id 2gdygbrw2p-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 28 Feb 2018 18:29:33 +0000 Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.14.4) with ESMTP id w1SISnWh016650 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 28 Feb 2018 18:28:49 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id w1SISm2d012363; Wed, 28 Feb 2018 18:28:48 GMT Received: from marawils-linux.us.oracle.com (/10.141.197.9) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 28 Feb 2018 10:28:47 -0800 From: Maran Wilson To: pbonzini@redhat.com, jgross@suse.com, boris.ostrovsky@oracle.com, roger.pau@citrix.com, andrew.cooper3@citrix.com, hch@infradead.org, JBeulich@suse.com, x86@kernel.org, xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com, rkrcmar@redhat.com, jpoimboe@redhat.com, bp@suse.de, kirill.shutemov@linux.intel.com, thomas.lendacky@amd.com, luto@kernel.org, maran.wilson@oracle.com, dave.hansen@linux.intel.com, davem@davemloft.net, gregkh@linuxfoundation.org, mchehab@kernel.org, linus.walleij@linaro.org, rdunlap@infradead.org Subject: [RFC PATCH v4 7/7] KVM: x86: Allow Qemu/KVM to use PVH entry point Date: Wed, 28 Feb 2018 10:28:03 -0800 Message-Id: <1519842483-8887-8-git-send-email-maran.wilson@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1519842483-8887-1-git-send-email-maran.wilson@oracle.com> References: <1519842483-8887-1-git-send-email-maran.wilson@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=8818 signatures=668682 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 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-1802280224 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 --- arch/x86/Kbuild | 4 ++-- arch/x86/pvh.c | 43 ++++++++++++++++++++++++++++++++----------- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/arch/x86/Kbuild b/arch/x86/Kbuild index a4e5e3d348dc..e9dc0f1c9d32 100644 --- a/arch/x86/Kbuild +++ b/arch/x86/Kbuild @@ -7,8 +7,8 @@ obj-$(CONFIG_KVM) += kvm/ # Xen paravirtualization support obj-$(CONFIG_XEN) += xen/ -obj-$(CONFIG_XEN_PVH) += pvh.o -obj-$(CONFIG_XEN_PVH) += pvh-head.o +obj-$(CONFIG_PVH) += pvh.o +obj-$(CONFIG_PVH) += pvh-head.o # Hyper-V paravirtualization support obj-$(subst m,y,$(CONFIG_HYPERV)) += hyperv/ diff --git a/arch/x86/pvh.c b/arch/x86/pvh.c index 6e9f6a6e97b3..97042d11342f 100644 --- a/arch/x86/pvh.c +++ b/arch/x86/pvh.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