From patchwork Mon Apr 3 09:44:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bhupinder Thakur X-Patchwork-Id: 96600 Delivered-To: patch@linaro.org Received: by 10.140.89.233 with SMTP id v96csp18526qgd; Mon, 3 Apr 2017 02:47:08 -0700 (PDT) X-Received: by 10.107.143.3 with SMTP id r3mr15349821iod.187.1491212828078; Mon, 03 Apr 2017 02:47:08 -0700 (PDT) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id v7si14355049iod.13.2017.04.03.02.47.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 03 Apr 2017 02:47:08 -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 1cuyXY-0001M6-IT; Mon, 03 Apr 2017 09:44:48 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cuyXY-0001Lz-0W for xen-devel@lists.xenproject.org; Mon, 03 Apr 2017 09:44:48 +0000 Received: from [85.158.143.35] by server-3.bemta-6.messagelabs.com id BD/15-27751-F8912E85; Mon, 03 Apr 2017 09:44:47 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprFIsWRWlGSWpSXmKPExsXiVRtsrNsn+Sj C4PkzZYvvWyYzOTB6HP5whSWAMYo1My8pvyKBNePuiVWsBb1mFbs3fWZsYGzV6mLk4hASmMUo 8WHfHBYQh0WgnVni+fLJ7CCOhMA7Fom/v3pZuxg5gZwYifNPF7JB2GUSD26vYwaxhQS0JI6em s0KMaqVSWL5nKlA3RwcbAImErM6JEBqRASUJO6tmswEUsMsMJ9RYm/PWbChwgKmElOfngazWQ RUJXpP/2ICsXkFvCW+PJ7ADrFMTuLmuU7mCYx8CxgZVjGqF6cWlaUW6ZrqJRVlpmeU5CZm5ug aGpjp5aYWFyemp+YkJhXrJefnbmIEhgoDEOxgnH7Z/xCjJAeTkijvmzsPI4T4kvJTKjMSizPi i0pzUosPMcpwcChJ8D4XfxQhJFiUmp5akZaZAwxamLQEB4+SCO9DkDRvcUFibnFmOkTqFKM9x 5zZu98wcdxq2AMkP/QfBrH3H3nDJMSSl5+XKiXOewCkTQCkLaM0D24oLMouMcpKCfMyAp0pxF OQWpSbWYIq/4pRnINRSZg3XgJoCk9mXgnc7ldAZzEBnfUE5CPe4pJEhJRUA2PJwji3t0trrwV 9tfAQO1bGri13IHC1Rvf9Cv3zF/6eKdz63aHrsd2SB7MPaog/ubw8056vqmtBT3z6PdGYyuif LwLz7/09LBPK6nwprueh41Z3Lkaxt4E3tHqXe329emj7No+L4T/XB2rJBG4O0axNOcj46I+PY OaU5hVfDgfKzpxiYdHYt0GJpTgj0VCLuag4EQDtgw1jrQIAAA== X-Env-Sender: bhupinder.thakur@linaro.org X-Msg-Ref: server-14.tower-21.messagelabs.com!1491212685!55103355!1 X-Originating-IP: [74.125.83.51] X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG X-StarScan-Received: X-StarScan-Version: 9.2.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 22118 invoked from network); 3 Apr 2017 09:44:46 -0000 Received: from mail-pg0-f51.google.com (HELO mail-pg0-f51.google.com) (74.125.83.51) by server-14.tower-21.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 3 Apr 2017 09:44:46 -0000 Received: by mail-pg0-f51.google.com with SMTP id x125so115245294pgb.0 for ; Mon, 03 Apr 2017 02:44:46 -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=kwgxhXUmtbKiTknpBV105HpBxBAaon8hiX5mg5KcU+g=; b=JpHIkHbnD7Pk1B+dkvmlizTY25LBeNDT+bzbscPg9oAB2Fk1ADLoPfacw9auXajizX OU9EvZH++Ejm6K0WMgjv8m7heLdjOjHGAFtuIIIxn+yZgXOfWed+SWx7o5Cha5XPwdJI gDVvoHRCeD6uegtgbrEffFGdSyOyZBAnZWZ3k= 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=kwgxhXUmtbKiTknpBV105HpBxBAaon8hiX5mg5KcU+g=; b=rjIT1v8HdEzw972MehgFbdDNBW88oUNIw7LMlIQ5eau/dZCNZKkoz9glb2Nje3FXej nXigYBYjTxsociVg6zvQn+LpowJ1+6kOQZNMA1ACE6MLYjTNutPMSS5PsSec1WkznD8E GlRgcFonPDJP6AqZdrIyEdTJwxIUA2KnJ07QXZuGwXjHfkpBpcpihs4hUywzD6Fa47p6 agZ7E1ztsAlOh9jYyg3AodT+7Xqe4dLWqOml7XyJjyWDGxmu90xdsGbQDrK6QL+kjpEO ISHZuYYnCW4Bq0woHCMhwmcUQwmFqTkK0IyC2g1SGH3/dhXEvyglfpldlbPIWHhb7VY/ wo3g== X-Gm-Message-State: AFeK/H1kinRAUq2QhjSSYAteBnP4gz3gHn4p0tYXAjdDjfJxlLrN4b6YZbhtHV30pNdh/5iA X-Received: by 10.99.6.66 with SMTP id 63mr16413152pgg.83.1491212681915; Mon, 03 Apr 2017 02:44:41 -0700 (PDT) Received: from blr-ubuntu-linaro.wlan.qualcomm.com ([202.46.23.54]) by smtp.gmail.com with ESMTPSA id y7sm24751844pfk.93.2017.04.03.02.44.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 03 Apr 2017 02:44:41 -0700 (PDT) From: Bhupinder Thakur To: xen-devel@lists.xenproject.org Date: Mon, 3 Apr 2017 15:14:23 +0530 Message-Id: <1491212673-13476-1-git-send-email-bhupinder.thakur@linaro.org> X-Mailer: git-send-email 2.7.4 Cc: Wei Liu , Julien Grall , Stefano Stabellini , Ian Jackson Subject: [Xen-devel] [PATCH 00/10] 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 =================================== This feature allows the Xen guests to map their console to a SBSA compliant pl011 UART as specified in ARM Service Base System architecture, Appendix B. See https://static.docs.arm.com/den0029/a/Server_Base_System_Architecture_v3_1_ARM_DEN_0029A.pdf. 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/rx DMA. Currently, Xen supports paravirtualized (aka PV) and an emulated serial consoles. This feature will allow an emulated SBSA pl011 UART console, 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. The following changes were done: 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 HVM param handlers for - 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. - Add checks to disallow guest domains from using these new HVM params. 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 parameters 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. Modify the domain structure to support two console types: PV and a virtual console (VCON). 2. Modify different APIs such as buffer_append() to take a new parameter vconsole_type as input and operate on the corresponding data structures. 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 VCON events. The vpl011 changes available at the following repo: url: ssh://git@git.linaro.org:/people/bhupinder.thakur/xen.git branch: vpl011_v1 Bhupinder Thakur (10): xen/arm: vpl011: Add pl011 uart emulation in Xen xen/arm: vpl011: Add new virtual console hvm params in Xen xen/arm: vpl011: Enable pl011 emulation for a guest domain in Xen xen/arm: vpl011: Provide a knob in libxl to enable/disable pl011 emulation xen/arm: vpl011: Allocate a new PFN in the toolstack for the virtual console xen/arm: vpl011: Add new parameters to xenstore for the virtual console xen/arm: vpl011: Add a new console type to domain structure in xenconsole xen/arm: vpl011: Modify the APIs in xenconsole to acces both PV and VCON consoles xen/arm: vpl011: Add new virtual console to xenconsole client xen/arm: vpl011: Add a pl011 uart DT node in the guest device tree tools/console/client/main.c | 6 + tools/console/daemon/io.c | 532 +++++++++++++++++++++++++++------------ tools/libxc/include/xc_dom.h | 3 + tools/libxc/xc_dom_arm.c | 7 +- tools/libxc/xc_dom_boot.c | 3 + tools/libxc/xc_domain.c | 7 + tools/libxl/libxl.c | 10 + tools/libxl/libxl_arm.c | 48 +++- tools/libxl/libxl_create.c | 12 + tools/libxl/libxl_dom.c | 13 +- tools/libxl/libxl_internal.h | 5 + tools/libxl/libxl_types.idl | 2 + tools/libxl/xl_cmdimpl.c | 4 + xen/arch/arm/Kconfig | 5 + xen/arch/arm/Makefile | 1 + xen/arch/arm/domain.c | 11 + xen/arch/arm/hvm.c | 112 +++++++++ xen/arch/arm/vpl011.c | 339 +++++++++++++++++++++++++ xen/common/domctl.c | 3 + xen/include/asm-arm/domain.h | 5 + xen/include/asm-arm/pl011-uart.h | 2 + xen/include/public/arch-arm.h | 8 + xen/include/public/domctl.h | 2 + xen/include/public/hvm/params.h | 10 + xen/include/xen/sched.h | 4 + xen/include/xen/vpl011.h | 67 +++++ 26 files changed, 1056 insertions(+), 165 deletions(-) create mode 100644 xen/arch/arm/vpl011.c create mode 100644 xen/include/xen/vpl011.h