Received: by 2002:ac0:a679:0:0:0:0:0 with SMTP id p54csp964916imp; Wed, 20 Feb 2019 12:23:58 -0800 (PST) X-Google-Smtp-Source: AHgI3IbaIVUVq1hlxnCEnoORytGob+yMfYTcG8xLJ3gV4VxK+6AVHtbSdUpgm9B7l/2+QSRrGTg3 X-Received: by 2002:a63:545f:: with SMTP id e31mr24802084pgm.409.1550694238483; Wed, 20 Feb 2019 12:23:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1550694238; cv=none; d=google.com; s=arc-20160816; b=ySsArybB1gkTtZrh0RSNpZcUQlV2X+/jBI09ZoVhH7qISZeAvjsMOtPBtp7Vsbb2v1 6yKS2DlLOcujQpH3nMMIg6sDvV3BJizUqAUkEyK0uQwQJ4l2A7fSt8Zj0fBmq22oydfX RN0m0HFLuQOUuS9Sv25BvGYOVsOADTUXWM2imP5XjRpjgU3mcV7Y5mc47cY+yEqTmJFs RQTcjPmSvdtBPzVJbShy0GCJfvZGF1yw3rBkRDzwld1dgDM+qpbMgY0QOt5J+XjLdD03 Jyam27WLBn7R69Ez4aeU+yggxFUKkuxvPW5PNErJzZqEdm7xvSS5D0pMBGbXZAyyimJ1 Ccbw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=pffK+Le697AXpCX5r1dpNPWwhi9QEZtzB5OYbGD69mM=; b=Uta7xrIt+gJs+QUblTxSut0L4X9FrZ4y5ILRDFQIHSDvfZGV7QpdnX/fmJVy24/Das 6nKHeLW1Y0K553FtBx1qYj4t9Pu0vP8F5w/+fgTnv0viFUIyPEXO3EtJc/nPIfRVxv3h Zamevs4lw5wMdvhWqXQr1d/r5eHSjQki3hqnImiQYdLtEg69ow8TNBsbnnZwaz/5u59h YYGi5TCxwYkBOz3vlQeIpfNcHhGV7o9AqweXhq9yDtd06LoioFu9Y8nEpjqBMQd871A+ hbIkC+9y20wY+18uIiLYOPVDMsZJSAxfvU0DWY8Oifymp8S8LLmRDtA1nmpNkjuwM2Id 91Gg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2018-07-02 header.b=APBXlS8P; 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 e8si18802822pgc.174.2019.02.20.12.23.43; Wed, 20 Feb 2019 12:23:58 -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-2018-07-02 header.b=APBXlS8P; 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 S1727255AbfBTURd (ORCPT + 99 others); Wed, 20 Feb 2019 15:17:33 -0500 Received: from aserp2130.oracle.com ([141.146.126.79]:60890 "EHLO aserp2130.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726602AbfBTUR1 (ORCPT ); Wed, 20 Feb 2019 15:17:27 -0500 Received: from pps.filterd (aserp2130.oracle.com [127.0.0.1]) by aserp2130.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x1KK95Wa088088; Wed, 20 Feb 2019 20:17:00 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : mime-version : content-type : content-transfer-encoding; s=corp-2018-07-02; bh=pffK+Le697AXpCX5r1dpNPWwhi9QEZtzB5OYbGD69mM=; b=APBXlS8Pc3BJLn7RTbHnebcHzMbJbjzz5uPJNOzW7EWT8gdAUO/jjoewlphU9EdMX08N p5b7PLrIu71uZ5URaNYLdwHl5AMSvptmzTXi7aanlmKgIRTvBw835cLT3Cw1ZJo5AvBO lGzrXbVZAqrRfNWplwR6XzvitYobxE51w779WRqoGEFvBKUCTfGB8tkS8GK/U4og+x6t /TAhRHT962osWhFze/f+lnL4a0uqvRoHdE1M2ysUSfnEMQQeDf0CZStptwatOWwolmGQ 3X8CdhZvpfhdPgf+yRiXSoOpLn3ARSExdi7iIrnjU5rkaL17aBkidjAhjVOo6Xwf7gZ5 /A== Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp2130.oracle.com with ESMTP id 2qp81ec36q-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 20 Feb 2019 20:16:59 +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 x1KKGr94019808 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 20 Feb 2019 20:16:54 GMT Received: from abhmp0022.oracle.com (abhmp0022.oracle.com [141.146.116.28]) by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id x1KKGqD7015069; Wed, 20 Feb 2019 20:16:52 GMT Received: from paddy.lan (/94.61.137.133) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 20 Feb 2019 12:16:52 -0800 From: Joao Martins To: kvm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Ankur Arora , Boris Ostrovsky , Joao Martins , Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , Thomas Gleixner , Ingo Molnar , Borislav Petkov , "H. Peter Anvin" , x86@kernel.org, Juergen Gross , Stefano Stabellini , xen-devel@lists.xenproject.org Subject: [PATCH RFC 00/39] x86/KVM: Xen HVM guest support Date: Wed, 20 Feb 2019 20:15:30 +0000 Message-Id: <20190220201609.28290-1-joao.m.martins@oracle.com> X-Mailer: git-send-email 2.11.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=9173 signatures=668683 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1011 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1902200138 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hey, Presented herewith a series that allows KVM to boot Xen x86 HVM guests (with their respective frontends and backends). On the hypervisor side, the approach is to keep the implementation similar to how HyperV was done on x86 KVM. On the backend driver side, the intent is to reuse Xen support. Note that this is an RFC so there are bugs and room for improvement. The intent is to get overall feedback before proceeding further. Running Xen guests on KVM, enables the following use-cases: * Run unmodified Xen HVM images; * Facilitate development/testing of Xen guests and Xen PV drivers; There has been a similar proposal in the past with Xenner, albeit this work has the following advantages over it: * Allows use of existing Xen PV drivers such as block, net etc, both as frontends and backends; * Xen tooling will see the same UABI as on Xen. This means things like xenstored, xenstore-list, xenstore-read run unmodified. Optionally, userspace VMM can emulate xenstore operations; This work is divided in two parts: 1. Xen HVM ABI support (patches 1 - 16) Support the necessary mechanisms to allow HVM guests to boot *without* PV frontends exposed to the guest. We start by intercepting hypercalls made by the guest, followed by event channel IPIs/VIRQs (for PV IPI, timers, spinlocks), pvclock and steal clock. Ankur Arora (1): KVM: x86/xen: support upcall vector Boris Ostrovsky (1): KVM: x86/xen: handle PV spinlocks slowpath Joao Martins (14): KVM: x86: fix Xen hypercall page msr handling KVM: x86/xen: intercept xen hypercalls if enabled KVM: x86/xen: register shared_info page KVM: x86/xen: setup pvclock updates KVM: x86/xen: update wallclock region KVM: x86/xen: register vcpu info KVM: x86/xen: register vcpu time info region KVM: x86/xen: register steal clock KVM: x86: declare Xen HVM guest capability KVM: x86/xen: evtchn signaling via eventfd KVM: x86/xen: store virq when assigning evtchn KVM: x86/xen: handle PV timers oneshot mode KVM: x86/xen: handle PV IPI vcpu yield KVM: x86: declare Xen HVM evtchn offload capability Documentation/virtual/kvm/api.txt | 23 ++ arch/x86/include/asm/kvm_host.h | 46 ++++ arch/x86/kvm/Makefile | 2 +- arch/x86/kvm/irq.c | 25 ++- arch/x86/kvm/irq_comm.c | 11 + arch/x86/kvm/trace.h | 33 +++ arch/x86/kvm/x86.c | 60 +++++- arch/x86/kvm/x86.h | 1 + arch/x86/kvm/xen.c | 1025 +++++++++++++++++++++++++++++ arch/x86/kvm/xen.h | 48 +++++ include/linux/kvm_host.h | 24 +++ include/uapi/linux/kvm.h | 73 ++++++- 12 files changed, 1361 insertions(+), 10 deletions(-) 2. PV Driver support (patches 17 - 39) We start by redirecting hypercalls from the backend to routines which emulate the behaviour that PV backends expect i.e. grant table and interdomain events. Next, we add support for late initialization of xenbus, followed by implementing frontend/backend communication mechanisms (i.e. grant tables and interdomain event channels). Finally, introduce xen-shim.ko, which will setup a limited Xen environment. This uses the added functionality of Xen specific shared memory (grant tables) and notifications (event channels). Note that patch 19 is useful to Xen on its own. Ankur Arora (11): x86/xen: export vcpu_info and shared_info x86/xen: make hypercall_page generic KVM: x86/xen: backend hypercall support KVM: x86/xen: grant map support KVM: x86/xen: grant unmap support KVM: x86/xen: interdomain evtchn support KVM: x86/xen: evtchn unmask support KVM: x86/xen: add additional evtchn ops xen-shim: introduce shim domain driver xen/gntdev: xen_shim_domain() support xen/xenbus: xen_shim_domain() support Joao Martins (12): xen/xenbus: xenbus uninit support xen-blkback: module_exit support KVM: x86/xen: domid allocation KVM: x86/xen: grant table init KVM: x86/xen: grant table grow support KVM: x86/xen: grant copy support xen/balloon: xen_shim_domain() support xen/grant-table: xen_shim_domain() support drivers/xen: xen_shim_domain() support xen-netback: xen_shim_domain() support xen-blkback: xen_shim_domain() support KVM: x86: declare Xen HVM Dom0 capability [See the entire series diffstat at the end] There are additional Qemu patches to take advantage of this (and they are available here[0][1]). An example on how you could run it would be: $ ./x86_64-softmmu/qemu-system-x86_64 -nodefaults -serial mon:stdio \ -machine xenfv,accel=kvm \ -cpu host,-kvm,+xen,xen-major-version=4,xen-minor-version=4,+xen-vapic,+xen-pvclock \ -kernel /path/to/kernel -m 16G -smp 16,sockets=1,cores=16,threads=1,maxcpus=16 \ -append "earlyprintk=ttyS0 console=tty0 console=ttyS0" \ -device xen-platform -device usb-ehci -device usb-tablet,bus=usb-bus.0 -vnc :0 -k pt \ -netdev type=tap,id=net1,ifname=vif1.0,script=qemu-ifup \ -device xen-nic,netdev=net1,mac=52:54:00:12:34:56,backendtype=vif,backend=0 \ -drive file=/path/to/image.img,format=raw,id=legacy,if=ide \ -blockdev file,node-name=drive,filename=/path/to/image.img,locking=off \ -device xen-disk,vdev=xvda,drive=drive,backendtype=vbd Naturally other options are still at your disposal (e.g. booting with q35 platform, or with virtio, etc). Thoughts? Cheers, Joao [0] https://www.github.com/jpemartins/qemu xen-shim-rfc [1] https://www.github.com/jpemartins/linux xen-shim-rfc Documentation/virtual/kvm/api.txt | 33 + arch/x86/include/asm/kvm_host.h | 88 ++ arch/x86/include/asm/xen/hypercall.h | 12 +- arch/x86/kvm/Kconfig | 10 + arch/x86/kvm/Makefile | 3 +- arch/x86/kvm/irq.c | 25 +- arch/x86/kvm/irq_comm.c | 11 + arch/x86/kvm/trace.h | 33 + arch/x86/kvm/x86.c | 66 +- arch/x86/kvm/x86.h | 1 + arch/x86/kvm/xen-asm.S | 66 + arch/x86/kvm/xen-shim.c | 138 ++ arch/x86/kvm/xen.c | 2262 ++++++++++++++++++++++++++++++ arch/x86/kvm/xen.h | 55 + arch/x86/xen/enlighten.c | 49 + arch/x86/xen/enlighten_hvm.c | 3 +- arch/x86/xen/enlighten_pv.c | 1 + arch/x86/xen/enlighten_pvh.c | 3 +- arch/x86/xen/xen-asm_32.S | 2 +- arch/x86/xen/xen-asm_64.S | 2 +- arch/x86/xen/xen-head.S | 8 +- drivers/block/xen-blkback/blkback.c | 27 +- drivers/block/xen-blkback/common.h | 2 + drivers/block/xen-blkback/xenbus.c | 19 +- drivers/net/xen-netback/netback.c | 25 +- drivers/xen/balloon.c | 15 +- drivers/xen/events/events_2l.c | 4 +- drivers/xen/events/events_base.c | 6 +- drivers/xen/events/events_fifo.c | 2 +- drivers/xen/evtchn.c | 4 +- drivers/xen/features.c | 1 + drivers/xen/gntdev.c | 10 +- drivers/xen/grant-table.c | 15 +- drivers/xen/privcmd.c | 5 +- drivers/xen/xenbus/xenbus.h | 2 + drivers/xen/xenbus/xenbus_client.c | 28 +- drivers/xen/xenbus/xenbus_dev_backend.c | 4 +- drivers/xen/xenbus/xenbus_dev_frontend.c | 6 +- drivers/xen/xenbus/xenbus_probe.c | 57 +- drivers/xen/xenbus/xenbus_xs.c | 40 +- drivers/xen/xenfs/super.c | 7 +- drivers/xen/xenfs/xensyms.c | 4 + include/linux/kvm_host.h | 24 + include/uapi/linux/kvm.h | 104 +- include/xen/balloon.h | 7 + include/xen/xen-ops.h | 2 +- include/xen/xen.h | 5 + include/xen/xenbus.h | 3 + 48 files changed, 3232 insertions(+), 67 deletions(-) create mode 100644 arch/x86/kvm/xen-asm.S create mode 100644 arch/x86/kvm/xen-shim.c create mode 100644 arch/x86/kvm/xen.c create mode 100644 arch/x86/kvm/xen.h -- 2.11.0