From nobody Wed Nov 5 16:54:40 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 153645977483745.3176418947304; Sat, 8 Sep 2018 19:22:54 -0700 (PDT) Received: from localhost ([::1]:45820 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fypNF-0007BM-Ef for importer@patchew.org; Sat, 08 Sep 2018 22:22:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46780) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fypM4-0005go-Pt for qemu-devel@nongnu.org; Sat, 08 Sep 2018 22:21:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fypM3-0005cb-KI for qemu-devel@nongnu.org; Sat, 08 Sep 2018 22:21:40 -0400 Received: from mail-lj1-x243.google.com ([2a00:1450:4864:20::243]:33227) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fypM3-0005aP-B8 for qemu-devel@nongnu.org; Sat, 08 Sep 2018 22:21:39 -0400 Received: by mail-lj1-x243.google.com with SMTP id s12-v6so15133500ljj.0 for ; Sat, 08 Sep 2018 19:21:39 -0700 (PDT) Received: from octofox.hsd1.ca.comcast.net. (jcmvbkbc-1-pt.tunnel.tserv24.sto1.ipv6.he.net. [2001:470:27:1fa::2]) by smtp.gmail.com with ESMTPSA id b10-v6sm2004228lfa.6.2018.09.08.19.21.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 08 Sep 2018 19:21:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=S4oDXR2vTrrsXvKcEqD3nC9dmh+8WGePTEoQG8s1PW0=; b=XJkLnv3CrIruR9ho9N1pxX2Aye4f7ragBw3alpHQxKVxmiAR9juyIsN98g7boXsMC8 HulQ0wLD/IfXyIBdTM2Xe8wAtwMc5FGyZ6bA246I2/V0LGE1s3WQJDaAzDuj9nsU5oDb M0Ws5gMNb71YqikwJ2MREZ/+ryTliDGmaz2dJhPZXGks5gB+2F5dD0xY5CV82h3OJjgb sXp34HS+R5/WApjFbXC+ihBqxeGugA0FaepYoSLYRsl9f0eJhRJM+LHSKXZlaVdeDhd3 jjzcr/OO/QGGhOWZ2PU2CDnpiM6Ey9YlOx8pGn4Dn/yfHwy4Xk6+QSDS1V5w3BJqkvsv rBYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=S4oDXR2vTrrsXvKcEqD3nC9dmh+8WGePTEoQG8s1PW0=; b=qna6mKN1IVBmElpyf61vAQFN7rsfZS6GaciNFnebCcuRPgSlGIVtNDgcgOVDjqtQZY pK+FO+AEySVcQlD/nMOhMigeeCDdnBOyUKl9lQIzWpHQqwRxGRumJZFxpkB6oR1hq2dC wjr6wh3E/WXplFvWQ/VlNACyfz+5WUVzrpRK/OiTy4lNweydXNPvYYGFLozfO7CRLEKZ V/iT8j8g42OstJlO75QnoEZwPvEFJDQjDHYsrB+ez3u/C/ClwqB7fPr2dvWkz4rl3Nuh yBnAqmE9SL0IoLSmmOyRtlbqxDH/+QvU8pIUT85Z0f7e8A9C+PBHPDMeURcDaqQOhKGm gVlw== X-Gm-Message-State: APzg51Bwk7sPkTCi/xKssMnyV8NZ2FStZT/zNeXKOSBqF5yA5OmJpDxc p/+sOaASXGfRX3xk44tNDqvJMNmi X-Google-Smtp-Source: ANB0Vda8bOFpwGMcRsLbJALJYAeJojYdczLwUqEqA7IE+PmYxsB7qhoCIKzBq48eih8kdNV1c1wGVw== X-Received: by 2002:a2e:534e:: with SMTP id t14-v6mr9128574ljd.26.1536459697615; Sat, 08 Sep 2018 19:21:37 -0700 (PDT) From: Max Filippov To: qemu-devel@nongnu.org Date: Sat, 8 Sep 2018 19:21:04 -0700 Message-Id: <20180909022104.5939-1-jcmvbkbc@gmail.com> X-Mailer: git-send-email 2.11.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::243 Subject: [Qemu-devel] [PATCH] target/xtensa: support input from chardev console X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Max Filippov Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDMRC_1 RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Complete xtensa-semi chardev console implementation: allow reading input characters from file descriptor 0 and call sys_select_one simcall on it. Signed-off-by: Max Filippov --- target/xtensa/xtensa-semi.c | 55 +++++++++++++++++++++++++++++++++++++++++= +--- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/target/xtensa/xtensa-semi.c b/target/xtensa/xtensa-semi.c index 7aa1d1357bda..f3c23f8625c2 100644 --- a/target/xtensa/xtensa-semi.c +++ b/target/xtensa/xtensa-semi.c @@ -34,8 +34,6 @@ #include "qemu/log.h" #include "sysemu/sysemu.h" =20 -static CharBackend *xtensa_sim_console; - enum { TARGET_SYS_exit =3D 1, TARGET_SYS_read =3D 3, @@ -153,12 +151,45 @@ static uint32_t errno_h2g(int host_errno) } } =20 +typedef struct SimInputBuffer { + char buffer[16]; + size_t offset; +} SimInputBuffer; + +static CharBackend *xtensa_sim_console; +static SimInputBuffer sim_input_buffer; + +static IOCanReadHandler xtensa_sim_console_can_read; +static int xtensa_sim_console_can_read(void *opaque) +{ + SimInputBuffer *p =3D opaque; + + return sizeof(p->buffer) - p->offset; +} + +static IOReadHandler xtensa_sim_console_read; +static void xtensa_sim_console_read(void *opaque, const uint8_t *buf, int = size) +{ + SimInputBuffer *p =3D opaque; + size_t copy =3D sizeof(p->buffer) - p->offset; + + if (size < copy) { + copy =3D size; + } + memcpy(p->buffer + p->offset, buf, copy); + p->offset +=3D copy; +} + void xtensa_sim_open_console(Chardev *chr) { static CharBackend console; =20 qemu_chr_fe_init(&console, chr, &error_abort); - qemu_chr_fe_set_handlers(&console, NULL, NULL, NULL, NULL, NULL, NULL,= true); + qemu_chr_fe_set_handlers(&console, + xtensa_sim_console_can_read, + xtensa_sim_console_read, + NULL, NULL, &sim_input_buffer, + NULL, true); xtensa_sim_console =3D &console; } =20 @@ -200,6 +231,22 @@ void HELPER(simcall)(CPUXtensaState *env) io_done =3D qemu_chr_fe_write_all(xtensa_sim_c= onsole, buf, io_sz); regs[3] =3D errno_h2g(errno); + } else if (!is_write && fd =3D=3D 0) { + if (sim_input_buffer.offset) { + io_done =3D sim_input_buffer.offset; + if (io_sz < io_done) { + io_done =3D io_sz; + } + memcpy(buf, sim_input_buffer.buffer, io_do= ne); + memmove(sim_input_buffer.buffer, + sim_input_buffer.buffer + io_done, + sim_input_buffer.offset - io_done); + sim_input_buffer.offset -=3D io_done; + qemu_chr_fe_accept_input(xtensa_sim_consol= e); + } else { + io_done =3D -1; + regs[3] =3D TARGET_EAGAIN; + } } else { qemu_log_mask(LOG_GUEST_ERROR, "%s fd %d is not supported with = chardev console\n", @@ -295,6 +342,8 @@ void HELPER(simcall)(CPUXtensaState *env) if (fd < 3 && xtensa_sim_console) { if ((fd =3D=3D 1 || fd =3D=3D 2) && rq =3D=3D SELECT_ONE_W= RITE) { regs[2] =3D 1; + } else if (fd =3D=3D 0 && rq =3D=3D SELECT_ONE_READ) { + regs[2] =3D sim_input_buffer.offset > 0; } else { regs[2] =3D 0; } --=20 2.11.0