{"id":2230539,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2230539/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260430-qemu-vnc-v3-3-be96757428d0@redhat.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/1.1/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260430-qemu-vnc-v3-3-be96757428d0@redhat.com>","date":"2026-04-29T21:02:36","name":"[v3,03/26] ui/console: add vc encoding=utf8/cp437 option","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"535a3f663fa979a920631ecc6fa0a1875fda2c6e","submitter":{"id":66774,"url":"http://patchwork.ozlabs.org/api/1.1/people/66774/?format=json","name":"Marc-André Lureau","email":"marcandre.lureau@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260430-qemu-vnc-v3-3-be96757428d0@redhat.com/mbox/","series":[{"id":502150,"url":"http://patchwork.ozlabs.org/api/1.1/series/502150/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=502150","date":"2026-04-29T21:02:34","name":"ui: add standalone VNC server over D-Bus","version":3,"mbox":"http://patchwork.ozlabs.org/series/502150/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2230539/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2230539/checks/","tags":{},"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=OyhTkVYd;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g5VDP54Qmz1yJr\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 30 Apr 2026 07:04:36 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wIC4K-0003VT-8R; Wed, 29 Apr 2026 17:03:40 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <marcandre.lureau@redhat.com>)\n id 1wIC4I-0003Uz-3P\n for qemu-devel@nongnu.org; Wed, 29 Apr 2026 17:03:38 -0400","from us-smtp-delivery-124.mimecast.com ([170.10.133.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <marcandre.lureau@redhat.com>)\n id 1wIC4G-0003Dp-7p\n for qemu-devel@nongnu.org; Wed, 29 Apr 2026 17:03:37 -0400","from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-74-_FgDjdECOwO9IYYMQNCqXQ-1; Wed,\n 29 Apr 2026 17:03:32 -0400","from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 8DD8E19560B5\n for <qemu-devel@nongnu.org>; Wed, 29 Apr 2026 21:03:31 +0000 (UTC)","from localhost (unknown [10.44.22.2])\n by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id 5476619560AB; Wed, 29 Apr 2026 21:03:29 +0000 (UTC)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1777496615;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=Cno5h8iE+Ze095lareXK4yoKI0EkSMjjNdtAoCEZ2Xk=;\n b=OyhTkVYdua8x3jN8ykDQfsZZFFnIthWVLiDKCOijwPmnaZdZpDCNMScF170D172Xj6Dmgh\n VpIUzO4MaLaoYbjgKzduAatJ2Hf91w/wEo2/V01EbCC3KumaqZGkY5EGjufvJPaAwbbYzn\n gAqRN8cBj/fLhFNP/HsiLLF/4sy9J04=","X-MC-Unique":"_FgDjdECOwO9IYYMQNCqXQ-1","X-Mimecast-MFC-AGG-ID":"_FgDjdECOwO9IYYMQNCqXQ_1777496611","From":"=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>","Date":"Thu, 30 Apr 2026 01:02:36 +0400","Subject":"[PATCH v3 03/26] ui/console: add vc encoding=utf8/cp437 option","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"8bit","Message-Id":"<20260430-qemu-vnc-v3-3-be96757428d0@redhat.com>","References":"<20260430-qemu-vnc-v3-0-be96757428d0@redhat.com>","In-Reply-To":"<20260430-qemu-vnc-v3-0-be96757428d0@redhat.com>","To":"qemu-devel@nongnu.org","Cc":"=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>","X-Developer-Signature":"v=1; a=openpgp-sha256; l=8065;\n i=marcandre.lureau@redhat.com; h=from:subject:message-id;\n bh=plQyXHsWEQ86pudBX8gWIrgkqQYgfrJswIQWOyKUTEg=;\n b=owEBbQKS/ZANAwAKAdro4Ql1lpzlAcsmYgBp8nILCnWPdXZvxRFodwIiAEjcj560A237mj203\n +Rn6d3eGJuJAjMEAAEKAB0WIQSHqb2TP4fGBtJ29i3a6OEJdZac5QUCafJyCwAKCRDa6OEJdZac\n 5W6hD/sFj10bw7CDXeBmjVTHNo26HWvtO23JSWXQGZQXam2FPfmBAM56ZwQmaQuy29iWroCml5n\n 7Eig9FrXdhYUVUCy9gk2rSHs3ggpzauAlrUHWvs11WAVD+Tw5VEHEHCOdxsL9hE/wKqYaQhxwV/\n MHtMAb6qSqurz3jliIh47pVsteGatdFeFSl2Z4ywZESlcdeXgIAwLpughd1GPMeAAkzmP7QcNBU\n xlTZ1hMCDBekQsKYXkC45LD0QhKDIWOffAxykjg8JwMlAPC+qDXiK9VuGY/0fBT7LbDS0DbGYBP\n yEMWPrhz/yrOWrF79CVV+zuukJjmORhvP34oGQ0wf4lE2y/HorTpmrWI8pMkTCw2FwmjmAW/W15\n nyesSW/OKDhsbIwR+zCLLd+pjwmE4cBjRgDusRYrMSjyWSTB4d1bqYgMp4Nni3jETtLF06ym/Oj\n z260OJGPQq9hXNuAEw5oidz5s1yE5JmI2acGwznKmPDpZZYyt8yaLt4pkdgovP2C+SfjyupnbAx\n DY/H+LVDSyd1jC6VmaNqxw+7VFV3OiTc5g8T/Fhn58iZ1PFkgVCg26Vq0/f4qN3lLpveKklaUHb\n rykXnEBeoqCoDgO5RFEjUBxYwWfoEXwi0cmk4G7G/pIinWCJlfuynO/ha3YYGgB4d7NR3ZOQImV\n ftUreP4q8QZZ9BQ==","X-Developer-Key":"i=marcandre.lureau@redhat.com; a=openpgp;\n fpr=87A9BD933F87C606D276F62DDAE8E10975969CE5","X-Scanned-By":"MIMEDefang 3.0 on 10.30.177.12","Received-SPF":"pass client-ip=170.10.133.124;\n envelope-from=marcandre.lureau@redhat.com;\n helo=us-smtp-delivery-124.mimecast.com","X-Spam_score_int":"12","X-Spam_score":"1.2","X-Spam_bar":"+","X-Spam_report":"(1.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001,\n RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001,\n SPF_PASS=-0.001 autolearn=no autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"},"content":"Expose a new \"encoding\" QemuOpt option.\n\nAdd the corresponding QAPI type and properties.\n\nThis is going to be wired in the following commits.\n\nSigned-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>\n---\n qapi/char.json         | 30 ++++++++++++++++++++++++++++--\n include/chardev/char.h |  1 +\n chardev/char.c         | 10 ++++++++++\n ui/console-vc.c        | 12 ++++++++++++\n ui/dbus.c              | 13 +++++++++++++\n qemu-options.hx        |  7 +++++--\n 6 files changed, 69 insertions(+), 4 deletions(-)","diff":"diff --git a/qapi/char.json b/qapi/char.json\nindex a4abafa6803..aa5ee9ffcd0 100644\n--- a/qapi/char.json\n+++ b/qapi/char.json\n@@ -377,6 +377,24 @@\n   'base': 'ChardevCommon',\n   'if': 'CONFIG_SPICE' }\n \n+##\n+# @ChardevVCEncoding:\n+#\n+# Character encoding expected from the guest on a virtual console.\n+#\n+# @cp437: CP437 (8-bit Extended ASCII / VGA).  Every byte maps\n+#     directly to a glyph; suitable for DOS or other guests that\n+#     output raw CP437.\n+#\n+# @utf8: UTF-8.  Multi-byte sequences are decoded and then mapped\n+#     back to CP437 glyphs for display; unmappable codepoints are\n+#     shown as '?'.  Suitable for modern Linux guests.\n+#\n+# Since: 11.1\n+##\n+{ 'enum': 'ChardevVCEncoding',\n+  'data': [ 'cp437', 'utf8' ] }\n+\n ##\n # @ChardevDBus:\n #\n@@ -384,10 +402,14 @@\n #\n # @name: name of the channel (following docs/spice-port-fqdn.txt)\n #\n+# @encoding: character encoding the guest is expected to use\n+#     (since 11.1)\n+#\n # Since: 7.0\n ##\n { 'struct': 'ChardevDBus',\n-  'data': { 'name': 'str' },\n+  'data': { 'name': 'str',\n+            '*encoding': 'ChardevVCEncoding' },\n   'base': 'ChardevCommon',\n   'if': 'CONFIG_DBUS_DISPLAY' }\n \n@@ -404,6 +426,9 @@\n #\n # @rows: console height, in chars\n #\n+# @encoding: character encoding the guest is expected to use\n+#     (since 11.1)\n+#\n # .. note:: The options are only effective when the VNC or SDL\n #    graphical display backend is active.  They are ignored with the\n #    GTK, Spice, VNC and D-Bus display backends.\n@@ -414,7 +439,8 @@\n   'data': { '*width': 'int',\n             '*height': 'int',\n             '*cols': 'int',\n-            '*rows': 'int' },\n+            '*rows': 'int',\n+            '*encoding': 'ChardevVCEncoding' },\n   'base': 'ChardevCommon' }\n \n ##\ndiff --git a/include/chardev/char.h b/include/chardev/char.h\nindex 51995f06a82..f05e8dba0a9 100644\n--- a/include/chardev/char.h\n+++ b/include/chardev/char.h\n@@ -255,6 +255,7 @@ struct ChardevClass {\n     bool internal; /* TODO: eventually use TYPE_USER_CREATABLE */\n     bool supports_yank;\n     bool supports_size_opts;\n+    bool supports_encoding_opts;\n \n     /* parse command line options and populate QAPI @backend */\n     void (*chr_parse)(QemuOpts *opts, ChardevBackend *backend, Error **errp);\ndiff --git a/chardev/char.c b/chardev/char.c\nindex 55dce9725e8..ca8b37ed8d7 100644\n--- a/chardev/char.c\n+++ b/chardev/char.c\n@@ -650,6 +650,13 @@ ChardevBackend *qemu_chr_parse_opts(QemuOpts *opts, Error **errp)\n             return NULL;\n         }\n     }\n+    if (!cc->supports_encoding_opts) {\n+        if (qemu_opt_get(opts, \"encoding\")) {\n+            error_setg(errp, \"chardev '%s' does not support encoding option\",\n+                       qemu_opts_id(opts));\n+            return NULL;\n+        }\n+    }\n \n     backend = g_new0(ChardevBackend, 1);\n     backend->type = CHARDEV_BACKEND_KIND_NULL;\n@@ -972,6 +979,9 @@ QemuOptsList qemu_chardev_opts = {\n         },{\n             .name = \"rows\",\n             .type = QEMU_OPT_NUMBER,\n+        },{\n+            .name = \"encoding\",\n+            .type = QEMU_OPT_STRING,\n         },{\n             .name = \"mux\",\n             .type = QEMU_OPT_BOOL,\ndiff --git a/ui/console-vc.c b/ui/console-vc.c\nindex 62a5e3caf57..7bb6a483753 100644\n--- a/ui/console-vc.c\n+++ b/ui/console-vc.c\n@@ -1211,6 +1211,7 @@ static bool vc_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)\n static void vc_chr_parse(QemuOpts *opts, ChardevBackend *backend, Error **errp)\n {\n     int val;\n+    const char *str;\n     ChardevVC *vc;\n \n     backend->type = CHARDEV_BACKEND_KIND_VC;\n@@ -1240,6 +1241,16 @@ static void vc_chr_parse(QemuOpts *opts, ChardevBackend *backend, Error **errp)\n         vc->has_rows = true;\n         vc->rows = val;\n     }\n+\n+    str = qemu_opt_get(opts, \"encoding\");\n+    if (str) {\n+        int cs = qapi_enum_parse(&ChardevVCEncoding_lookup, str, -1, errp);\n+        if (cs < 0) {\n+            return;\n+        }\n+        vc->has_encoding = true;\n+        vc->encoding = cs;\n+    }\n }\n \n static void char_vc_class_init(ObjectClass *oc, const void *data)\n@@ -1252,6 +1263,7 @@ static void char_vc_class_init(ObjectClass *oc, const void *data)\n     cc->chr_accept_input = vc_chr_accept_input;\n     cc->chr_set_echo = vc_chr_set_echo;\n     cc->supports_size_opts = true;\n+    cc->supports_encoding_opts = true;\n }\n \n static const TypeInfo char_vc_type_info = {\ndiff --git a/ui/dbus.c b/ui/dbus.c\nindex 794b65c4ada..721cc71d39b 100644\n--- a/ui/dbus.c\n+++ b/ui/dbus.c\n@@ -471,6 +471,8 @@ dbus_vc_parse(QemuOpts *opts, ChardevBackend *backend,\n     DBusVCClass *klass = DBUS_VC_CLASS(object_class_by_name(TYPE_CHARDEV_VC));\n     const char *name = qemu_opt_get(opts, \"name\");\n     const char *id = qemu_opts_id(opts);\n+    const char *str;\n+    ChardevDBus *dbus;\n \n     if (name == NULL) {\n         if (g_str_has_prefix(id, \"compat_monitor\")) {\n@@ -486,6 +488,16 @@ dbus_vc_parse(QemuOpts *opts, ChardevBackend *backend,\n     }\n \n     klass->parent_parse(opts, backend, errp);\n+    dbus = backend->u.dbus.data;\n+    str = qemu_opt_get(opts, \"encoding\");\n+    if (str) {\n+        int cs = qapi_enum_parse(&ChardevVCEncoding_lookup, str, -1, errp);\n+        if (cs < 0) {\n+            return;\n+        }\n+        dbus->has_encoding = true;\n+        dbus->encoding = cs;\n+    }\n }\n \n static void\n@@ -496,6 +508,7 @@ dbus_vc_class_init(ObjectClass *oc, const void *data)\n \n     klass->parent_parse = cc->chr_parse;\n     cc->chr_parse = dbus_vc_parse;\n+    cc->supports_encoding_opts = true;\n }\n \n static const TypeInfo dbus_vc_type_info = {\ndiff --git a/qemu-options.hx b/qemu-options.hx\nindex efffeaaf55e..44aa3a4cd3b 100644\n--- a/qemu-options.hx\n+++ b/qemu-options.hx\n@@ -4044,7 +4044,7 @@ DEF(\"chardev\", HAS_ARG, QEMU_OPTION_chardev,\n     \"         [,logfile=PATH][,logappend=on|off]\\n\"\n     \"-chardev msmouse,id=id[,mux=on|off][,logfile=PATH][,logappend=on|off]\\n\"\n     \"-chardev vc,id=id[[,width=width][,height=height]][[,cols=cols][,rows=rows]]\\n\"\n-    \"         [,mux=on|off][,logfile=PATH][,logappend=on|off]\\n\"\n+    \"         [,mux=on|off][,logfile=PATH][,logappend=on|off][,encoding=ENCODING]\\n\"\n     \"-chardev ringbuf,id=id[,size=size][,logfile=PATH][,logappend=on|off]\\n\"\n     \"-chardev file,id=id,path=path[,input-path=input-file][,mux=on|off][,logfile=PATH][,logappend=on|off]\\n\"\n     \"-chardev pipe,id=id,path=path[,mux=on|off][,logfile=PATH][,logappend=on|off]\\n\"\n@@ -4276,7 +4276,7 @@ The available backends are:\n     Several frontend devices is not supported. Stacking of multiplexers\n     and hub devices is not supported as well.\n \n-``-chardev vc,id=id[[,width=width][,height=height]][[,cols=cols][,rows=rows]]``\n+``-chardev vc,id=id[[,width=width][,height=height]][[,cols=cols][,rows=rows]][,encoding=ENCODING]``\n     Connect to a QEMU text console. The implementation and supported feature\n     set depend on the selected display backend.\n \n@@ -4295,6 +4295,9 @@ The available backends are:\n     ``cols`` and ``rows`` specify that the console be sized to fit a\n     text console with the given dimensions.\n \n+    ``encoding`` specifies the character set expected from the guest:\n+    ``utf8`` or ``cp437`` (8-bit Extended ASCII / VGA).\n+\n ``-chardev ringbuf,id=id[,size=size]``\n     Create a ring buffer with fixed size ``size``. size must be a power\n     of two and defaults to ``64K``.\n","prefixes":["v3","03/26"]}