From: Eric Farman <farman@linux.ibm.com>
To: qemu-devel@nongnu.org
Cc: qemu-s390x@nongnu.org, Matthew Rosato <mjrosato@linux.ibm.com>,
Cornelia Huck <cohuck@redhat.com>,
Maximilian Immanuel Brandtner <maxbr@linux.ibm.com>,
"Jason J. Herne" <jjherne@linux.ibm.com>,
Eric Farman <farman@linux.ibm.com>
Subject: [PULL 3/6] s390x/sclpconsole: implement resizing for vt220 consoles
Date: Mon, 26 Oct 2026 10:01:50 -0400 [thread overview]
Message-ID: <20261026140153.2072253-4-farman@linux.ibm.com> (raw)
In-Reply-To: <20261026140153.2072253-1-farman@linux.ibm.com>
From: Maximilian Immanuel Brandtner <maxbr@linux.ibm.com>
Add a tty code to indicate a resize frame. The body contains two big
endian 16-bit integers rows and columns.
After reset, the guest must be informed of the terminal size again. A
chardev that doesn't report its size yields 0x0, which shouldn't replace
the guest's default.
Signed-off-by: Maximilian Immanuel Brandtner <maxbr@linux.ibm.com>
Reviewed-by: Jason J. Herne <jjherne@linux.ibm.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
Tested-by: Eric Farman <farman@linux.ibm.com>
Link: https://lore.kernel.org/qemu-devel/20260929152012.2696005-3-maxbr@linux.ibm.com
Signed-off-by: Eric Farman <farman@linux.ibm.com>
---
hw/char/sclpconsole.c | 76 ++++++++++++++++++++++++++++++++++++++++---
1 file changed, 72 insertions(+), 4 deletions(-)
diff --git a/hw/char/sclpconsole.c b/hw/char/sclpconsole.c
index 1ad39084d3..12033e1e46 100644
--- a/hw/char/sclpconsole.c
+++ b/hw/char/sclpconsole.c
@@ -33,6 +33,9 @@ typedef struct ASCIIConsoleData {
/* max size for ASCII data in 4K SCCB page */
#define SIZE_BUFFER_VT220 4080
+#define SCLP_CONSOLE_EVENT_TYPE_DATA 0x00
+#define SCLP_CONSOLE_EVENT_TYPE_RESIZE 0x08
+
struct SCLPConsole {
SCLPEvent event;
CharFrontend chr;
@@ -42,6 +45,8 @@ struct SCLPConsole {
uint32_t iov_data_len; /* length of byte stream in buffer */
uint32_t iov_sclp_rest; /* length of byte stream not read via SCLP */
bool notify; /* qemu_notify_event() req'd if true */
+ bool resize;
+ bool resize_init;
};
typedef struct SCLPConsole SCLPConsole;
@@ -49,6 +54,12 @@ typedef struct SCLPConsole SCLPConsole;
DECLARE_INSTANCE_CHECKER(SCLPConsole, SCLP_CONSOLE,
TYPE_SCLP_CONSOLE)
+typedef struct SCLPConsoleResizeData {
+ uint8_t type;
+ uint16_t rows;
+ uint16_t cols;
+} QEMU_PACKED SCLPConsoleResizeData;
+
/* character layer call-back functions */
/* Return number of bytes that fit into iov buffer */
@@ -81,6 +92,29 @@ static void chr_read(void *opaque, const uint8_t *buf, int size)
sclp_service_interrupt(0);
}
+static void chr_event(void *opaque, QEMUChrEvent event)
+{
+ SCLPConsole *scon = opaque;
+
+ assert(scon);
+
+ switch (event) {
+ case CHR_EVENT_RESIZE:
+ case CHR_EVENT_MUX_IN:
+ scon->resize = true;
+ scon->resize_init = false;
+ scon->event.event_pending = true;
+ sclp_service_interrupt(0);
+ break;
+ case CHR_EVENT_BREAK:
+ case CHR_EVENT_OPENED:
+ case CHR_EVENT_MUX_OUT:
+ case CHR_EVENT_CLOSED:
+ /* ignore */
+ break;
+ }
+}
+
/* functions to be called by event facility */
static bool can_handle_event(uint8_t type)
@@ -104,10 +138,37 @@ static sccb_mask_t receive_mask(void)
static void get_console_data(SCLPEvent *event, uint8_t *buf, size_t *size,
int avail)
{
+ SCLPConsoleResizeData resize_data;
SCLPConsole *cons = SCLP_CONSOLE(event);
+ uint16_t rows, cols;
- /* first byte is hex 0 saying an ascii string follows */
- *buf++ = '\0';
+ if (cons->resize) {
+ if (avail < sizeof(resize_data)) {
+ *size = 0;
+ return;
+ }
+
+ qemu_chr_fe_get_winsize(&cons->chr, &cols, &rows);
+
+ if (cons->resize_init && cols == 0 && rows == 0) {
+ *size = 0;
+ } else {
+ resize_data.type = SCLP_CONSOLE_EVENT_TYPE_RESIZE;
+ resize_data.rows = cpu_to_be16(rows);
+ resize_data.cols = cpu_to_be16(cols);
+
+ memcpy(buf, &resize_data, sizeof(resize_data));
+ *size = sizeof(resize_data);
+ }
+
+ cons->resize = false;
+ cons->resize_init = false;
+ event->event_pending = cons->iov_sclp_rest != 0;
+
+ return;
+ }
+
+ *buf++ = SCLP_CONSOLE_EVENT_TYPE_DATA;
avail--;
/* if all data fit into provided SCLP buffer */
if (avail >= cons->iov_sclp_rest) {
@@ -150,6 +211,9 @@ static int read_event_data(SCLPEvent *event, EventBufferHeader *evt_buf_hdr,
to = (uint8_t *)&acd->data;
avail = *slen - sizeof(ASCIIConsoleData);
get_console_data(event, to, &src_len, avail);
+ if (src_len == 0) {
+ return 0;
+ }
acd->ebh.length = cpu_to_be16(sizeof(ASCIIConsoleData) + src_len);
acd->ebh.type = SCLP_EVENT_ASCII_CONSOLE_DATA;
@@ -233,7 +297,7 @@ static int console_init(SCLPEvent *event)
}
console_available = true;
qemu_chr_fe_set_handlers(&scon->chr, chr_can_read,
- chr_read, NULL, NULL, scon, NULL, true);
+ chr_read, chr_event, NULL, scon, NULL, true);
return 0;
}
@@ -243,12 +307,16 @@ static void console_reset(DeviceState *dev)
SCLPEvent *event = SCLP_EVENT(dev);
SCLPConsole *scon = SCLP_CONSOLE(event);
- event->event_pending = false;
scon->iov_sclp = 0;
scon->iov_bs = 0;
scon->iov_data_len = 0;
scon->iov_sclp_rest = 0;
scon->notify = false;
+
+ /* the guest defaults its terminal size on reset, announce the real one */
+ scon->resize = true;
+ scon->resize_init = true;
+ event->event_pending = true;
}
static const Property console_properties[] = {
--
2.56.0
next prev parent reply other threads:[~2026-10-26 14:06 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-26 14:01 [PULL 0/6] s390x queue for 11.2 Eric Farman
2026-10-26 14:01 ` [PULL 1/6] target/s390x: externalize feat dependency array Eric Farman
2026-10-26 14:01 ` [PULL 2/6] target/s390x: mark feats dependent on deprecated feats as deprecated Eric Farman
2026-10-26 14:01 ` Eric Farman [this message]
2026-10-26 14:01 ` [PULL 4/6] s390x/pci: reclaim DMA slots upon IOMMU disable Eric Farman
2026-10-26 14:01 ` [PULL 5/6] MAINTAINERS: Add other s390x tree Eric Farman
2026-10-26 14:01 ` [PULL 6/6] MAINTAINERS: Update s390 boot reviewer Eric Farman
2026-10-27 22:25 ` [PULL 0/6] s390x queue for 11.2 Richard Henderson
-- strict thread matches above, loose matches on Subject: below --
2026-10-26 18:00 [PULL 3/6] s390x/sclpconsole: implement resizing for vt220 consoles Max Brandtner
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=20261026140153.2072253-4-farman@linux.ibm.com \
--to=farman@linux.ibm.com \
--cc=cohuck@redhat.com \
--cc=jjherne@linux.ibm.com \
--cc=maxbr@linux.ibm.com \
--cc=mjrosato@linux.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-s390x@nongnu.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.