mbox series

[v3,00/24] x86: introduce NS16550-compatible UART emulator

Message ID 20250103-vuart-ns8250-v3-v1-0-c5d36b31d66c@ford.com (mailing list archive)
Headers show
Series x86: introduce NS16550-compatible UART emulator | expand

Message

Denis Mukhin via B4 Relay Jan. 4, 2025, 1:58 a.m. UTC
x86 port of Xen lacks vUART facility similar to Arm's vpl011 to support x86
guest OS bring up in the embedded setups.

This patch series introduces initial in-hypervisor emulator for
NS8250/NS16x50-compatible UARTs under CONFIG_VUART_NS16550.

In parallel domain creation scenario (hyperlaunch), NS16550 emulator helps
early guest firmware and OS bringup debugging, because it eliminates dependency
on the external emulator (qemu) being operational by the time domains are
created.

The emulator also allows to forward the physical console input to the x86
domain which is useful when a system has only one physical UART for early
debugging and this UART is owned by Xen.

By default, CONFIG_VUART_NS16550 enables emulation of NS16550 at I/O port
0x3f8, IRQ#4 in guest OS (legacy COM1).

Legacy COM resources can be selected at built-time and cannot be configured
per-domain yet.

The NS16550 emulator is disabled by default.

Series
======
- patches 1-17: preparation patches. That covers existing UART emulators
  cleanup, UART emulation framework, console driver cleanups and fixes.

- patches 18-24: initial NS16550 emulator. That adds the I/O port emulator
  for legacy PC COM UARTs, Kconfig option and enabling emulator for HVM
  domains globally and build-time.

Limitations
===========
- Only x86;
- Only HVM domains support (build-time), PVH domains are not supported yet;
- Only legacy COM{1,2,3,4} resources via Kconfig, custom I/O ports/IRQs
  are not supported;
- Only Xen console as a backend, no inter-domain communication (similar to
  vpl011 on Arm);
- Only 8n1 emulation (8-bit data, no parity, 1 stop bit);
- No toolstack integration;
- No baud rate emulation (reports 115200 baud to the guest OS);
- No FIFO-less mode emulation;
- No RX FIFO interrupt moderation (FCR) emulation;
- No integration w/ VM snapshotting (HVM_REGISTER_SAVE_RESTORE() and
  friends);
- No ISA IRQ sharing allowed;
- No MMIO-based UART emulation.

Testing
=======

Gitlab CI
  https://gitlab.com/xen-project/people/dmukhin/xen/-/pipelines/1610989357

Manual Testing
  I tested boot of HVM linux guest w/ OVMF as the virtual firmware.

  The emulator, if enabled via CONFIG_VUART_NS16550=y, will use COM1
  (0x3f8) resources by default.

  To test w/ virtual COM1, the guest kernel parameters should contain
    earlycon=uart,io,0x3f8,115200n8 console=uart,io,0x3f8,115200n8

  Xen is able to forward physical console input to the domain w/ virtual
  NS16550. To switch the console focus press Ctrl+aaa. If console= is given to
  the HVM kernel, then the user shall be able to see the login prompt on xen
  console once console focus is switched to the HVM guest.

---
Changes in v3:
- renamed emulator s/NS8250/NS16550/g
- reduced the patch series after addressing v2 feedback
- introduced driver framework for UART emulators
- unified guest OS printouts across all available UART emulators
- Link to v2: https://lore.kernel.org/xen-devel/20241205-vuart-ns8250-v1-0-e9aa923127eb@ford.com/

Changes in v2:
- dropped kmalloc/kfree aliases
- fixed ECLAIR jobs (thanks Andrew Cooper)
- addressed console forwarding on arm32 and arm64 (thanks to Luca Fancellu)
- moved NS8250 debugging stubs into its own patch
- added fix for https://gitlab.com/xen-project/xen/-/issues/184
- Link to v1: https://lore.kernel.org/r/20241126-vuart-ns8250-v1-v1-0-87b9a8375b7a@ford.com
---

Signed-off-by: Denis Mukhin <dmukhin@ford.com>

---
Denis Mukhin (24):
      xen/ctype: introduce is_console_printable()
      arm/vuart: move vpl011-related code to vpl011 emulator
      arm/vuart: add hwdom prefix to UART emulator
      xen/console: introduce console_{get,put}_domain()
      xen/console: introduce consoled_is_enabled()
      xen/domain: introduce hardware emulation flags
      xen/console: introduce framework for UART emulators
      xen/console: rename switch_serial_input() to console_switch_input()
      xen/console: rename console_rx to console_owner
      xen/console: introduce use of 'is_console' flag
      xen/domain: move get_initial_domain_id() to arch-independent header
      xen/console: introduce console_{get,set}_owner()
      xen/console: introduce hwdom_crashconsole=
      xen/console: simplify console owner switch hint
      xen/console: make console buffer size configurable
      xen/console: introduce console_write()
      xen/console: flush console ring to physical console
      xen/include: introduce resource.h
      xen/8250-uart: add missing definitions
      x86/hvm: add HVM-specific Kconfig
      x86/hvm: introduce NS16550-compatible UART emulator
      x86/hvm: enable NS16550-compatible UART emulator
      docs/misc: update console documentation
      xen/console: unify printout behavior for UART emulators

 automation/eclair_analysis/ECLAIR/deviations.ecl |   1 +
 docs/misc/console.txt                            |  50 +-
 docs/misc/xen-command-line.pandoc                |  21 +-
 tools/helpers/init-xenstore-domain.c             |   1 +
 tools/libs/light/libxl_x86.c                     |   5 +-
 tools/ocaml/libs/xc/xenctrl.ml                   |   1 +
 tools/ocaml/libs/xc/xenctrl.mli                  |   1 +
 tools/ocaml/libs/xc/xenctrl_stubs.c              |   1 +
 tools/python/xen/lowlevel/xc/xc.c                |   5 +-
 tools/tests/paging-mempool/test-paging-mempool.c |   1 +
 tools/tests/resource/test-resource.c             |   1 +
 tools/tests/tsx/test-tsx.c                       |   1 +
 xen/arch/arm/Kconfig                             |   1 +
 xen/arch/arm/dom0less-build.c                    |  11 +-
 xen/arch/arm/domain.c                            |   6 +-
 xen/arch/arm/domain_build.c                      |   7 +-
 xen/arch/arm/domctl.c                            |  11 +-
 xen/arch/arm/include/asm/domain.h                |   2 +
 xen/arch/arm/include/asm/setup.h                 |   2 -
 xen/arch/arm/include/asm/vpl011.h                |  21 +-
 xen/arch/arm/setup.c                             |   2 -
 xen/arch/arm/vpl011.c                            |  57 +-
 xen/arch/arm/vuart.c                             |  49 +-
 xen/arch/arm/vuart.h                             |   8 +-
 xen/arch/arm/xen.lds.S                           |   1 +
 xen/arch/ppc/include/asm/domain.h                |   2 +
 xen/arch/ppc/include/asm/setup.h                 |   2 -
 xen/arch/ppc/xen.lds.S                           |   1 +
 xen/arch/riscv/include/asm/domain.h              |   2 +
 xen/arch/riscv/include/asm/setup.h               |   2 -
 xen/arch/riscv/xen.lds.S                         |   1 +
 xen/arch/x86/Kconfig                             |  76 +-
 xen/arch/x86/dom0_build.c                        |   2 +
 xen/arch/x86/domain.c                            |  21 +-
 xen/arch/x86/hvm/Kconfig                         | 122 +++
 xen/arch/x86/hvm/Makefile                        |   1 +
 xen/arch/x86/hvm/hvm.c                           |  14 +-
 xen/arch/x86/hvm/vuart-ns16550.c                 | 931 +++++++++++++++++++++++
 xen/arch/x86/include/asm/domain.h                |   8 +-
 xen/arch/x86/include/asm/hvm/domain.h            |   4 +
 xen/arch/x86/include/asm/pv/shim.h               |   5 +-
 xen/arch/x86/include/asm/setup.h                 |   2 -
 xen/arch/x86/pv/shim.c                           |   7 +-
 xen/arch/x86/xen.lds.S                           |   1 +
 xen/common/device-tree/device-tree.c             |  21 +-
 xen/common/domain.c                              |  31 +-
 xen/common/domctl.c                              |  11 +-
 xen/common/kernel.c                              |   8 +
 xen/common/keyhandler.c                          |   4 +
 xen/drivers/Kconfig                              |   5 +
 xen/drivers/Makefile                             |   1 +
 xen/drivers/char/Kconfig                         |  11 +
 xen/drivers/char/console.c                       | 377 +++++----
 xen/drivers/char/consoled.c                      |  17 +-
 xen/drivers/char/ns16550.c                       |   6 +-
 xen/drivers/passthrough/arm/smmu.c               |  15 +-
 xen/drivers/virtdev-uart.c                       |  68 ++
 xen/include/Makefile                             |   1 +
 xen/include/public/arch-x86/xen.h                |  30 +-
 xen/include/public/virtdev.h                     |  64 ++
 xen/include/xen/8250-uart.h                      |  78 +-
 xen/include/xen/console.h                        |   3 +-
 xen/include/xen/consoled.h                       |  32 +-
 xen/include/xen/ctype.h                          |   7 +
 xen/include/xen/domain.h                         |   9 +
 xen/include/xen/lib.h                            |   3 +
 xen/include/xen/resource.h                       |  37 +
 xen/include/xen/virtdev-uart.h                   |  72 ++
 xen/include/xen/xen.lds.h                        |  10 +
 69 files changed, 1913 insertions(+), 479 deletions(-)
---
base-commit: 7e6edeaee38c66266a941bfa66d17eeeeb492fbe
change-id: 20250103-vuart-ns8250-v3-f8e1110777fe

Best regards,