The goal of this series is to have a resizable terminal into a guest
without having to set up networking and using, e.g. ssh.

The virtio spec allows a virtio-console device to notify the guest about
terminal resizes in the host. Linux Kernel implements the driver part of
the spec. This series implement the device part in QEMU.

This series adds support for a resizable terminal if a virtio console
device is connected to the stdio backend.

This series also introduces resize messages that can be sent over QMP to
notify QEMU about the size of the terminal connented to some chardev.
In the libvirt setting, it will allow to implement a resizable terminal
for virsh console and other libvirt clients.

This patch series was originally authored by Szymon Lukasz and submitted
to qemu-devel about 5 years ago. The previous submission can be found at
<https://lists.nongnu.org/archive/html/qemu-devel/2020-06/msg09591.html>.
I have updated the patches to be compatible with latest master and made
a few small changes of my own, including the addition of Windows support.

Probably the most important change I made is the swapping of rows and
cols fields in resize messages. I would like to hear some feedback on
this change from reviewers. The problem is that for a long time, the
Linux kernel used a different field order from what was specified in the
virtio spec. The kernel implementation was apparently merged around 2010,
while the virtio spec came in 2014, so when a previous version of this
patch series was being discussed here on this mailing list in 2020, it
was decided that QEMU should match the Linux implementation, and ideally,
the virtio spec should be changed.

However, recently, the Linux kernel implementation was changed to conform
to the spec: 
<https://git.kernel.org/linus/5326ab737a47278dbd16ed3ee7380b26c7056ddd>.
As a result, to be compatible with latest kernel releases, QEMU needs to
also use the field order matching the specification. I have changed the
patch to use the spec-compliant order, so it works correctly with latest
kernels now.

That leaves the issue of older kernels. There are about 15 years' worth
of kernel versions with the swapped field order, including the kernel
currently shipped in Debian stable. The effects of the swapped dimensions
can sometimes be quite annoying - e.g. if you have a terminal with
24 rows, this will be interpreted as 24 columns, and your shell may limit 
line editing to this small space, most of which will be taken by your
prompt. The patch series in its current form provides no way to disable
the console size functionality, so users may end up worse off than if
the functionality were not implemented at all.

PS: One of the patches adds one additional noop switch case
    to a bunch of files. I didn't include the maintainers of these files
    in the Cc list. I hope that's OK. :)

v4:
changed order of rows and cols fields
added support for terminal size on Windows
trace event is also emitted for legacy (non-multiport) drivers
minor fixes required because of changes in QEMU (DECLARE_INSTANCE_CHECKER, 
qmp-example)
updated version numbers ('Since: 10.2', hw_compat_10_1)

v3:
add resize messages over QMP, as suggested by Daniel

v2:
fix adding a new virtio feature bit to the virtio console device

---
Filip Hejsek (1):
      char-win-stdio: add support for terminal size

Szymon Lukasz (9):
      chardev: add cols, rows fields
      chardev: add CHR_EVENT_RESIZE
      chardev: add qemu_chr_resize()
      char-mux: add support for the terminal size
      main-loop: change the handling of SIGWINCH
      char-stdio: add support for the terminal size
      qmp: add chardev-resize command
      virtio-serial-bus: add terminal resize messages
      virtio-console: notify the guest about terminal resizes

 backends/cryptodev-vhost-user.c   |  1 +
 chardev/char-fe.c                 | 13 ++++++++
 chardev/char-mux.c                | 18 ++++++++++-
 chardev/char-stdio.c              | 30 +++++++++++++++++++
 chardev/char-win-stdio.c          | 19 ++++++++++++
 chardev/char.c                    | 26 ++++++++++++++++
 hw/block/vhost-user-blk.c         |  1 +
 hw/char/terminal3270.c            |  1 +
 hw/char/trace-events              |  1 +
 hw/char/virtio-console.c          | 63 ++++++++++++++++++++++++++++++++++++---
 hw/char/virtio-serial-bus.c       | 43 ++++++++++++++++++++++++--
 hw/core/machine.c                 |  4 ++-
 hw/ipmi/ipmi_bmc_extern.c         |  1 +
 hw/scsi/vhost-user-scsi.c         |  1 +
 hw/usb/ccid-card-passthru.c       |  1 +
 hw/usb/dev-serial.c               |  1 +
 hw/usb/redirect.c                 |  1 +
 hw/virtio/vhost-user-base.c       |  1 +
 hw/virtio/vhost-user-scmi.c       |  1 +
 include/chardev/char-fe.h         | 10 +++++++
 include/chardev/char.h            |  7 +++++
 include/hw/virtio/virtio-serial.h |  5 ++++
 include/qemu/main-loop.h          |  4 +++
 monitor/hmp.c                     |  1 +
 monitor/qmp.c                     |  1 +
 net/passt.c                       |  1 +
 net/vhost-user.c                  |  1 +
 qapi/char.json                    | 22 ++++++++++++++
 ui/curses.c                       | 11 +++----
 util/main-loop.c                  | 21 +++++++++++++
 30 files changed, 298 insertions(+), 13 deletions(-)
---
base-commit: 190d5d7fd725ff754f94e8e0cbfb69f279c82b5d
change-id: 20250912-console-resize-96c42140ba08

Best regards,
-- 
Filip Hejsek <filip.hej...@gmail.com>


Reply via email to