From patchwork Fri Apr 28 16:01:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bhupinder Thakur X-Patchwork-Id: 98371 Delivered-To: patch@linaro.org Received: by 10.182.236.104 with SMTP id ut8csp392055obc; Fri, 28 Apr 2017 09:03:46 -0700 (PDT) X-Received: by 10.36.54.149 with SMTP id l143mr10698984itl.38.1493395426185; Fri, 28 Apr 2017 09:03:46 -0700 (PDT) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id r141si41552itb.57.2017.04.28.09.03.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 28 Apr 2017 09:03:46 -0700 (PDT) Received-SPF: neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) client-ip=192.237.175.120; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org; spf=neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) smtp.mailfrom=xen-devel-bounces@lists.xen.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1d48Kv-0008VN-2z; Fri, 28 Apr 2017 16:01:37 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1d48Kt-0008VF-N5 for xen-devel@lists.xenproject.org; Fri, 28 Apr 2017 16:01:35 +0000 Received: from [85.158.143.35] by server-6.bemta-6.messagelabs.com id BD/92-03920-F5763095; Fri, 28 Apr 2017 16:01:35 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprPIsWRWlGSWpSXmKPExsVyMfTANt24dOZ Igwedihbft0xmcmD0OPzhCksAYxRrZl5SfkUCa8b5h0+YC05ZVtzrq2pgfKzTxcjFISQwg1Fi 2pseRhCHRaCdWaLz51p2EEdC4B2LxLSrO1i6GDmAnDiJyXesuxg5gcwqiWkHNzKC2EICWhJHT 81mhZjUzCRx4tNfZpB6NgETiVkdEiA1IgJKEvdWTWYCqWEWeMso0f/xFCtIQljAQuLzxC4WEJ tFQFVi3bWJ7CA2r4C3xN+fe1gglslJ3DzXyTyBkW8BI8MqRo3i1KKy1CJdI0O9pKLM9IyS3MT MHF1DAzO93NTi4sT01JzEpGK95PzcTYzAQGEAgh2Mf5YFHGKU5GBSEuWtdGeOFOJLyk+pzEgs zogvKs1JLT7EKMPBoSTBOzUNKCdYlJqeWpGWmQMMWZi0BAePkgivBEiat7ggMbc4Mx0idYrRl ePF5ffvmTjeLf0AJPs6PgLJJyt/gMiHP98zCbHk5eelSonzRoA0C4A0Z5TmwY2GxdslRlkpYV 5GoGOFeApSi3IzS1DlXzGKczAqCfPyAaNXiCczrwTugldAxzEBHcfiwgByXEkiQkqqgVHqYPO 7FN37zXf6TYR/XExZLWQjaPiiQcuyofjI8xytHk2XdT7bck9NMKsNFlnS01itF91SmSvecPjd hgvL3xgtN1+/rf7BvTLVmY9ZNCRPa389f6OzYwdv9IVsx8UrDn5MniB4conllu8OERbnfI4mi 25VEy1b5ez2yr2rJcqUcS6rx0NGYSWW4oxEQy3mouJEAGcE4/GyAgAA X-Env-Sender: bhupinder.thakur@linaro.org X-Msg-Ref: server-16.tower-21.messagelabs.com!1493395293!61356257!1 X-Originating-IP: [209.85.192.182] X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG X-StarScan-Received: X-StarScan-Version: 9.4.12; banners=-,-,- X-VirusChecked: Checked Received: (qmail 13158 invoked from network); 28 Apr 2017 16:01:34 -0000 Received: from mail-pf0-f182.google.com (HELO mail-pf0-f182.google.com) (209.85.192.182) by server-16.tower-21.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 28 Apr 2017 16:01:34 -0000 Received: by mail-pf0-f182.google.com with SMTP id i4so13945530pfc.0 for ; Fri, 28 Apr 2017 09:01:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=b0NvomULZwBv6Sqngo/F7ZUOUguvXVHiJiE+GyJwpEo=; b=icVr7lScjEUHC3yw5/04YPgNcagPKBf+nNs+uErfoKjws1np+8J5LH5sFn6ipWEzBl QOXZh+zNlWgdzdJ9IaDupgCmDtNxWoxXm71yf+HhTHBk/UgyonFmfRAfedc/CYnHCii/ 4BzZklgujwLQzUCfqgT4EnWyb8ourjQLmrTzU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=b0NvomULZwBv6Sqngo/F7ZUOUguvXVHiJiE+GyJwpEo=; b=JG6u8mAuG+8cJXRoNTj9jtY7ttWA/fGC/5gxy//QE1tLjVRo24OqCqafw1S7Rtwq1r 7hke0NK5sauGRWIKU7gMds1+NXa1r4zH0efuRvo1o7r+LIpJXHfXRE56FbSp/cp0llur ZS2a+KoW9eGwdxBAMkMnD5IMWQyjUzTd1Gqt901OlAZ9goT7TblikYuwbUHhFgSxWXWb KCoU11u7uRiIa6dkcyW7wBcjvhzNA1+XfVirJrI12DwcCh/KK6F+qqA3GyGahGxRiXYZ PfhH63sVlhvhjIx9Ujfmvx8ltCItvFaIhM4hBpn8sQlhedaavN9PWC6ZyL4qKP6RwWuh JmNg== X-Gm-Message-State: AN3rC/4bPBe6Ei45f75pcwnYspmWq1c4Ktandbh1nr3M3OJOHognO6pb 4zaVGB+xTDRaN2rZ X-Received: by 10.98.155.20 with SMTP id r20mr12453378pfd.198.1493395292468; Fri, 28 Apr 2017 09:01:32 -0700 (PDT) Received: from blr-ubuntu-linaro.wlan.qualcomm.com ([103.5.19.18]) by smtp.gmail.com with ESMTPSA id n65sm9870239pga.8.2017.04.28.09.01.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 28 Apr 2017 09:01:31 -0700 (PDT) From: Bhupinder Thakur To: xen-devel@lists.xenproject.org Date: Fri, 28 Apr 2017 21:31:14 +0530 Message-Id: <1493395284-18430-1-git-send-email-bhupinder.thakur@linaro.org> X-Mailer: git-send-email 2.7.4 Cc: Stefano Stabellini , Wei Liu , Andrew Cooper , Ian Jackson , Julien Grall , Jan Beulich Subject: [Xen-devel] [PATCH 00/10 v2] pl011 emulation support in Xen X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" PL011 emulation for guests in Xen =================================== Linaro has published VM System specification for ARM Processors, which provides a set of guidelines for both guest OS and hypervisor implementations, such that building OS images according to these guidelines guarantees that those images can also run on hypervisors compliant with this specification. One of the spec requirements is that the hypervisor must provide an emulated PL011 UART as a serial console which meets the minimum requirements in SBSA UART as defined in appendix B of the following ARM Server Base Architecture Document: https://static.docs.arm.com/den0029/a/Server_Base_System_Architecture_v3_1_ARM_DEN_0029A.pdf. This feature allows the Xen guests to use SBSA compliant pl011 UART as as a console. Note that SBSA pl011 UART is a subset of full featured ARM pl011 UART and supports only a subset of registers as mentioned below. It does not support rx/tx DMA. Currently, Xen supports paravirtualized (aka PV console) and an emulated serial consoles. This feature will expose an emulated SBSA pl011 UART console to the guest, which a user can access using xenconsole. The device tree passed to the guest VM will contain the pl011 MMIO address range and an irq for receiving rx/tx pl011 interrupts. The device tree format is specified in Documentation/devicetree/bindings/serial/arm_sbsa_uart.txt. The Xen hypervisor will expose two types of interfaces to the backend and domU. The interface exposed to domU will be an emulated pl011 UART by emulating the access to the following pl011 registers by the guest. - Data register (DR) - RW - Raw interrupt status register (RIS) - RO - Masked interrupt status register (MIS)- RO - Interrupt Mask (IMSC) - RW - Interrupt Clear (ICR) - WO It will also inject the pl011 interrupts to the guest in the following conditions: - incoming data in the rx buffer for the guest - there is space in the tx buffer for the guest to write more data The interface exposed to the backend will be the same PV console interface, which minimizes the changes required in xenconsole to support a new pl011 console. This interface has rx and tx ring buffers and an event channel for sending/receiving events from the backend. So essentially Xen handles the data on behalf of domU and the backend. Any data written by domU is captured by Xen and written to the TX (OUT) ring buffer and a pl011 event is raised to the backend to read the TX ring buffer. Similarly on reciving a pl011 event, Xen injects an interrupt to guest to indicate there is data available in the RX (IN) ring buffer. Note that the pl011 UART state is completely captured in the set of registers mentioned above and this state is updated everytime there is an event from the backend or there is register read/write access from domU. For example, if domU has masked the rx interrupt in the IMSC register, then Xen will not inject an interrupt to guest and will just update the RIS register. Once the interrupt is unmasked by guest, the interrupt will be delivered to the guest. Changes summary: Xen Hypervisor =============== 1. Add emulation code to emulate read/write access to pl011 registers and pl011 interrupts: - It emulates DR read/write by reading and writing from/to the IN and OUT ring buffers and raising an event to dom0 when there is data in the OUT ring buffer and injecting an interrupt to the guest when there is data in the IN ring buffer. - Other registers are related to interrupt management and essentially control when interrupts are delivered to the guest. 2. Add two new domctl API to set and get pfn and evtchn respectively - Allocate a new event channel for sending/receiving events from Xen and return to the toolstack. - Map the PFN allocted by the toolstack to be used as IN/OUT ring buffers. 3. Enable vpl011 emulation for a domain based on a libxl option passed during domain creation. Toolstack ========== 1. Create a sbsa uart DT node in the guest device tree. It uses a fixed vpl011 SPI IRQ number and MMIO address. 2. Allocate a new PFN and pass it on to Xen though a hvm call to be used as the IN/OUT ring buffers. 3. Add two new keys to the xen store - Allocate a PFN to be used as IN/OUT ring buffer by xenconsoled - Read new event channel from Xen using a hvm call to be used by xenconsoled for sending/receiving events. Xenconsoled ============ 1. Split the domain structure to support multiple consoles. 2. Modify different APIs such as buffer_append() etc. to operate on the console structure. 3. Modfications in domain_create_ring(): - Bind to the vpl011 event channel obtained from the xen store as a new parameter - Map the PFN to its address space to be used as IN/OUT ring buffers. It obtains the PFN from the xen store as a new parameter 4. Modifications in handle_ring_read() to handle both PV and VUART events. The vpl011 changes available at the following repo: url: ssh://git@git.linaro.org:/people/bhupinder.thakur/xen.git branch: vpl011_v2 Bhupinder Thakur (10): xen/arm: vpl011: Add pl011 uart emulation in Xen xen/arm: vpl011: Add new vuart domctl interface to setup pfn and evtchn xen/arm: vpl011: Enable pl011 emulation for a guest domain in Xen xen/arm: vpl011: Add support for vuart in libxl xen/arm: vpl011: Allocate a new PFN in the toolstack for vuart xen/arm: vpl011: Add vuart ring-buf and evtchn to xenstore xen/arm: vpl011: Add support for vuart in xenconsole xen/arm: vpl011: Add a new vuart console type to xenconsole client xen/arm: vpl011: Add a pl011 uart DT node in the guest device tree xen/arm: vpl011: Update documentation for vuart console support docs/man/xl.cfg.pod.5.in | 8 + docs/misc/console.txt | 14 +- tools/console/client/main.c | 8 +- tools/console/daemon/io.c | 514 +++++++++++++++++++++++++++------------ tools/libxc/include/xc_dom.h | 2 + tools/libxc/include/xenctrl.h | 26 ++ tools/libxc/xc_dom_arm.c | 7 +- tools/libxc/xc_dom_boot.c | 2 + tools/libxc/xc_domain.c | 39 +++ tools/libxl/libxl.h | 6 + tools/libxl/libxl_arm.c | 54 +++- tools/libxl/libxl_console.c | 10 + tools/libxl/libxl_create.c | 10 + tools/libxl/libxl_dom.c | 4 + tools/libxl/libxl_internal.h | 4 + tools/libxl/libxl_types.idl | 2 + tools/xl/xl_console.c | 4 +- tools/xl/xl_parse.c | 3 + xen/arch/arm/Kconfig | 5 + xen/arch/arm/Makefile | 1 + xen/arch/arm/domain.c | 6 + xen/arch/arm/domctl.c | 20 ++ xen/arch/arm/vpl011.c | 340 ++++++++++++++++++++++++++ xen/arch/x86/domctl.c | 4 + xen/common/domctl.c | 3 + xen/include/asm-arm/domain.h | 3 + xen/include/asm-arm/pl011-uart.h | 2 + xen/include/public/arch-arm.h | 8 + xen/include/public/domctl.h | 13 + xen/include/xen/sched.h | 4 + xen/include/xen/vpl011.h | 74 ++++++ 31 files changed, 1045 insertions(+), 155 deletions(-) create mode 100644 xen/arch/arm/vpl011.c create mode 100644 xen/include/xen/vpl011.h