qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Filip Hejsek <filip.hejsek@gmail.com>
To: qemu-devel@nongnu.org
Cc: "Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	"Laurent Vivier" <lvivier@redhat.com>,
	"Amit Shah" <amit@kernel.org>,
	"Markus Armbruster" <armbru@redhat.com>,
	"Eric Blake" <eblake@redhat.com>,
	"Eduardo Habkost" <eduardo@habkost.net>,
	"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
	"Philippe Mathieu-Daudé" <philmd@linaro.org>,
	"Yanan Wang" <wangyanan55@huawei.com>,
	"Zhao Liu" <zhao1.liu@intel.com>,
	"Daniel P. Berrangé" <berrange@redhat.com>,
	"Maximilian Immanuel Brandtner" <maxbr@linux.ibm.com>,
	"Szymon Lukasz" <noh4hss@gmail.com>,
	"Filip Hejsek" <filip.hejsek@gmail.com>
Subject: [PATCH RFC v5 08/12] virtio-serial-bus: add terminal resize messages
Date: Sun, 21 Sep 2025 01:45:38 +0200	[thread overview]
Message-ID: <20250921-console-resize-v5-8-89e3c6727060@gmail.com> (raw)
In-Reply-To: <20250921-console-resize-v5-0-89e3c6727060@gmail.com>

From: Szymon Lukasz <noh4hss@gmail.com>

Implement the part of the virtio spec that allows to notify the virtio
driver about terminal resizes. The virtio spec contains two methods to
achieve that:

For legacy drivers, we have only one port and we put the terminal size
in the config space and inject the config changed interrupt.

For multiport devices, we use the control virtqueue to send a packet
containing the terminal size. Note that old versions of the Linux kernel
used an incorrect order for the fields (rows then cols instead of cols
then rows), until it was fixed by commit 5326ab737a47278dbd16ed3ee7380b26c7056ddd.

As a result, when using a Linux kernel older than 6.15, the number of rows
and columns will be swapped.

Signed-off-by: Szymon Lukasz <noh4hss@gmail.com>
[Filip: swap rows/cols, console-size affects multiport too,
        size config always updated, use use_multiport, move trace call]
Signed-off-by: Filip Hejsek <filip.hejsek@gmail.com>
---
 hw/char/trace-events              |  1 +
 hw/char/virtio-serial-bus.c       | 51 +++++++++++++++++++++++++++++++++++++--
 hw/core/machine.c                 |  4 ++-
 include/hw/virtio/virtio-serial.h |  5 ++++
 4 files changed, 58 insertions(+), 3 deletions(-)

diff --git a/hw/char/trace-events b/hw/char/trace-events
index 05a33036c12070242c2b193c19011839d623bec4..9a975ab1e2a525a9391d0f0a85ddbe80aa6361fc 100644
--- a/hw/char/trace-events
+++ b/hw/char/trace-events
@@ -11,6 +11,7 @@ serial_update_parameters(uint64_t baudrate, char parity, int data_bits, int stop
 
 # virtio-serial-bus.c
 virtio_serial_send_control_event(unsigned int port, uint16_t event, uint16_t value) "port %u, event %u, value %u"
+virtio_serial_send_console_resize(unsigned int port, uint16_t cols, uint16_t rows) "port %u, cols %u, rows %u"
 virtio_serial_throttle_port(unsigned int port, bool throttle) "port %u, throttle %d"
 virtio_serial_handle_control_message(uint16_t event, uint16_t value) "event %u, value %u"
 virtio_serial_handle_control_message_port(unsigned int port) "port %u"
diff --git a/hw/char/virtio-serial-bus.c b/hw/char/virtio-serial-bus.c
index 673c50f0be08ef9b7142c16eaf8e6e31c7a00ca5..30e3ec73a1733449b2505f231a3d2b3516ae4b4e 100644
--- a/hw/char/virtio-serial-bus.c
+++ b/hw/char/virtio-serial-bus.c
@@ -260,6 +260,51 @@ static size_t send_control_event(VirtIOSerial *vser, uint32_t port_id,
     return send_control_msg(vser, &cpkt, sizeof(cpkt));
 }
 
+/*
+ * This struct should be added to the Linux kernel uapi headers
+ * and later imported to standard-headers/linux/virtio_console.h
+ */
+struct virtio_console_resize {
+    __virtio16 cols;
+    __virtio16 rows;
+};
+
+void virtio_serial_send_console_resize(VirtIOSerialPort *port,
+                                       uint16_t cols, uint16_t rows)
+{
+    VirtIOSerial *vser = port->vser;
+    VirtIODevice *vdev = VIRTIO_DEVICE(vser);
+
+    if (!virtio_has_feature(vser->host_features, VIRTIO_CONSOLE_F_SIZE)) {
+        return;
+    }
+
+    trace_virtio_serial_send_console_resize(port->id, cols, rows);
+
+    if (port->id == 0) {
+        vser->port0_cols = cols;
+        vser->port0_rows = rows;
+        if (!use_multiport(vser) &&
+            virtio_vdev_has_feature(vdev, VIRTIO_CONSOLE_F_SIZE)) {
+            virtio_notify_config(vdev);
+        }
+    }
+
+    if (use_multiport(vser)) {
+        struct {
+            struct virtio_console_control control;
+            struct virtio_console_resize resize;
+        } buffer;
+
+        virtio_stl_p(vdev, &buffer.control.id, port->id);
+        virtio_stw_p(vdev, &buffer.control.event, VIRTIO_CONSOLE_RESIZE);
+        virtio_stw_p(vdev, &buffer.resize.cols, cols);
+        virtio_stw_p(vdev, &buffer.resize.rows, rows);
+
+        send_control_msg(vser, &buffer, sizeof(buffer));
+    }
+}
+
 /* Functions for use inside qemu to open and read from/write to ports */
 int virtio_serial_open(VirtIOSerialPort *port)
 {
@@ -571,8 +616,8 @@ static void get_config(VirtIODevice *vdev, uint8_t *config_data)
     struct virtio_console_config *config =
         (struct virtio_console_config *)config_data;
 
-    config->cols = 0;
-    config->rows = 0;
+    config->cols = virtio_tswap16(vdev, vser->port0_cols);
+    config->rows = virtio_tswap16(vdev, vser->port0_rows);
     config->max_nr_ports = virtio_tswap32(vdev,
                                           vser->serial.max_virtserial_ports);
 }
@@ -1158,6 +1203,8 @@ static const Property virtio_serial_properties[] = {
                                                   31),
     DEFINE_PROP_BIT64("emergency-write", VirtIOSerial, host_features,
                       VIRTIO_CONSOLE_F_EMERG_WRITE, true),
+    DEFINE_PROP_BIT64("console-size", VirtIOSerial, host_features,
+                      VIRTIO_CONSOLE_F_SIZE, true),
 };
 
 static void virtio_serial_class_init(ObjectClass *klass, const void *data)
diff --git a/hw/core/machine.c b/hw/core/machine.c
index 38c949c4f2ce4a117cbfca62f56919711ce392b4..74a747ec6578c958b35e1f9712e5dbed7bca72e8 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -37,7 +37,9 @@
 #include "hw/virtio/virtio-iommu.h"
 #include "audio/audio.h"
 
-GlobalProperty hw_compat_10_1[] = {};
+GlobalProperty hw_compat_10_1[] = {
+    { "virtio-serial-device", "console-size", "off" },
+};
 const size_t hw_compat_10_1_len = G_N_ELEMENTS(hw_compat_10_1);
 
 GlobalProperty hw_compat_10_0[] = {
diff --git a/include/hw/virtio/virtio-serial.h b/include/hw/virtio/virtio-serial.h
index d87c62eab7a270809daf47f932a73dd1fa3d5a6e..81efa853f804a52866890a9ec2c71bfbcabca4a0 100644
--- a/include/hw/virtio/virtio-serial.h
+++ b/include/hw/virtio/virtio-serial.h
@@ -187,6 +187,8 @@ struct VirtIOSerial {
     virtio_serial_conf serial;
 
     uint64_t host_features;
+
+    uint16_t port0_cols, port0_rows;
 };
 
 /* Interface to the virtio-serial bus */
@@ -221,6 +223,9 @@ size_t virtio_serial_guest_ready(VirtIOSerialPort *port);
  */
 void virtio_serial_throttle_port(VirtIOSerialPort *port, bool throttle);
 
+void virtio_serial_send_console_resize(VirtIOSerialPort *port,
+                                       uint16_t cols, uint16_t rows);
+
 #define TYPE_VIRTIO_SERIAL "virtio-serial-device"
 OBJECT_DECLARE_SIMPLE_TYPE(VirtIOSerial, VIRTIO_SERIAL)
 

-- 
2.51.0



  parent reply	other threads:[~2025-09-20 23:47 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-20 23:45 [PATCH RFC v5 00/12] virtio-console: notify about the terminal size Filip Hejsek
2025-09-20 23:45 ` [PATCH RFC v5 01/12] chardev: add cols, rows fields Filip Hejsek
2025-09-22  8:13   ` Daniel P. Berrangé
2025-10-13  5:09   ` Dominique Martinet
2025-09-20 23:45 ` [PATCH RFC v5 02/12] chardev: add CHR_EVENT_RESIZE Filip Hejsek
2025-09-22  8:16   ` Daniel P. Berrangé
2025-10-13  5:11   ` Dominique Martinet
2025-09-20 23:45 ` [PATCH RFC v5 03/12] chardev: add qemu_chr_resize() Filip Hejsek
2025-09-22  8:19   ` Daniel P. Berrangé
2025-10-13  5:12   ` Dominique Martinet
2025-09-20 23:45 ` [PATCH RFC v5 04/12] char-mux: add support for the terminal size Filip Hejsek
2025-09-22  8:21   ` Daniel P. Berrangé
2025-10-13  5:13   ` Dominique Martinet
2025-09-20 23:45 ` [PATCH RFC v5 05/12] main-loop: change the handling of SIGWINCH Filip Hejsek
2025-09-22  8:29   ` Daniel P. Berrangé
2025-10-13  5:13   ` Dominique Martinet
2025-09-20 23:45 ` [PATCH RFC v5 06/12] char-stdio: add support for the terminal size Filip Hejsek
2025-09-22  8:33   ` Daniel P. Berrangé
2025-10-13  5:14   ` Dominique Martinet
2025-09-20 23:45 ` [PATCH RFC v5 07/12] qmp: add chardev-window-size-changed command Filip Hejsek
2025-09-22  6:45   ` Markus Armbruster
2025-09-22  8:52     ` Filip Hejsek
2025-09-22  9:38       ` Markus Armbruster
2025-09-22  8:35   ` Daniel P. Berrangé
2025-10-13  5:18   ` Dominique Martinet
2025-10-13  5:23   ` Dominique Martinet
2025-09-20 23:45 ` Filip Hejsek [this message]
2025-09-22  8:53   ` [PATCH RFC v5 08/12] virtio-serial-bus: add terminal resize messages Daniel P. Berrangé
2025-10-13  5:19   ` Dominique Martinet
2025-09-20 23:45 ` [PATCH RFC v5 09/12] virtio-console: notify the guest about terminal resizes Filip Hejsek
2025-09-22  8:45   ` Daniel P. Berrangé
2025-10-13  5:28   ` Dominique Martinet
2025-09-20 23:45 ` [PATCH RFC v5 10/12] char-win-stdio: add support for terminal size Filip Hejsek
2025-09-22  8:38   ` Daniel P. Berrangé
2025-10-13  5:29   ` Dominique Martinet
2025-09-20 23:45 ` [PATCH RFC v5 11/12] ui/console-vc: forward text console size to vc chardev Filip Hejsek
2025-09-22  8:41   ` Daniel P. Berrangé
2025-10-13  5:29   ` Dominique Martinet
2025-09-20 23:45 ` [PATCH RFC v5 12/12] ui/gtk: forward gtk " Filip Hejsek
2025-09-22  8:41   ` Daniel P. Berrangé
2025-10-13  5:44   ` Dominique Martinet

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250921-console-resize-v5-8-89e3c6727060@gmail.com \
    --to=filip.hejsek@gmail.com \
    --cc=amit@kernel.org \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=eblake@redhat.com \
    --cc=eduardo@habkost.net \
    --cc=lvivier@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=maxbr@linux.ibm.com \
    --cc=mst@redhat.com \
    --cc=noh4hss@gmail.com \
    --cc=pbonzini@redhat.com \
    --cc=philmd@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=wangyanan55@huawei.com \
    --cc=zhao1.liu@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).