mbox series

[Xen-devel,00/10] pl011 emulation support in Xen

Message ID 1491212673-13476-1-git-send-email-bhupinder.thakur@linaro.org
Headers show
Series pl011 emulation support in Xen | expand

Message

Bhupinder Thakur April 3, 2017, 9:44 a.m. UTC
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

Comments

Julien Grall April 20, 2017, 12:47 p.m. UTC | #1
Hi Bhupinder,

On 03/04/17 10:44, Bhupinder Thakur wrote:
>  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 +++++

I was expecting an update of the documentation for the new options 
introduced and the expected behavior for IRQ numbering when using both 
pl011 and assign physical IRQ.

Please add the documentation in the next version.

Cheers,
Bhupinder Thakur April 26, 2017, 3:21 p.m. UTC | #2
Hi Julien,


>>  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 +++++
>
>
> I was expecting an update of the documentation for the new options
> introduced and the expected behavior for IRQ numbering when using both pl011
> and assign physical IRQ.
>
> Please add the documentation in the next version.
>
I have added details on the vuart console option in docs/misc/console.txt.

I have added a check that if user tries to allocate a physical IRQ
which is same as the pl011 SPI then domain creation would fail. Is
there any IRQ specific document where I can add this behavior?

Regards,
Bhupinder
Stefano Stabellini April 26, 2017, 5:09 p.m. UTC | #3
On Wed, 26 Apr 2017, Bhupinder Thakur wrote:
> Hi Julien,
> 
> 
> >>  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 +++++
> >
> >
> > I was expecting an update of the documentation for the new options
> > introduced and the expected behavior for IRQ numbering when using both pl011
> > and assign physical IRQ.
> >
> > Please add the documentation in the next version.
> >
> I have added details on the vuart console option in docs/misc/console.txt.
> 
> I have added a check that if user tries to allocate a physical IRQ
> which is same as the pl011 SPI then domain creation would fail. Is
> there any IRQ specific document where I can add this behavior?

I don't think so. Maybe you could add an line about this to the xl.cfg
man page under the irqs= section?