From patchwork Tue Apr 2 16:42:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 161640 Delivered-To: patch@linaro.org Received: by 2002:a02:c6d8:0:0:0:0:0 with SMTP id r24csp1963937jan; Tue, 2 Apr 2019 09:44:22 -0700 (PDT) X-Google-Smtp-Source: APXvYqwTkshKZjbxy1QE6zSxfgVWWUUH0w+ydzwLsCsGSQWVEs216NsSoGSM4wx1l18Wy3kph4sy X-Received: by 2002:a81:99cc:: with SMTP id q195mr15653823ywg.148.1554223462810; Tue, 02 Apr 2019 09:44:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554223462; cv=none; d=google.com; s=arc-20160816; b=IBBT2vDZksJ8nJssrGzVF6a8f5f1gOdU/skHb4Zwvincja5zjeSFiZxkDlEJ+VaoM4 f2Ctq7mE2idsZZpcjKKPPqiHPYhMVLIVf6YvpPv1KnxOyZuGBsBGgsP8tnXClYf+TQre 6a1vGo/V+0hKUzfjWH9o6CuIYlOu2LVP3WuKZIfJx14m0lUMHWOTAtloQsMdcPQPzjWR csM5IUXi2f1rggo5GjdBc+RWUvk9c/Mzn0EPOmHSg5fRYet0glU9h7ceGGpCl+wHos7j NuN3ghXCmb2bvgJYtyC4SxqImLSdpxBamNXKKefB5OqEZRr3XSs/MbnZVfda1qr1czWa dwmA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-unsubscribe:list-id :precedence:subject:references:in-reply-to:message-id:date:to:from; bh=6pJfehEtlmsIxO8D0RNxY4VPG5SNaCo8zwnZzO3jR/E=; b=iuQwHv9mijt2R2e3nu1HtAlCjMMkh8UPRajOqyDFEPUY37HZljYCGv10Q002zNZl5d HvV9rjZ2BJui0KWzlu/OQWM7pg4QUPPxQtLCHURp2t3Gx6fRNwj9juHqOT4XpHxqdy/M gULB1IXdDf4xq2ggTGoRp3sTwAHeOAdtP4GGUjT09r1KzcPTnc4WLDKLFLde3xG5bie4 SmLS01rhw5CyguVArIAVn09ydYRyxRSEhB6AajV0tWWCwGPBds0o2XZpK2zGvEH5Lyew yZtcDggSY/7g/8TP3nAuKzyktAR9pjdwv5v4JwxrErI51vpPyRkJoZUvy63U9QVU8eDx 4w5g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id x135si8264287ywx.266.2019.04.02.09.44.22 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 02 Apr 2019 09:44:22 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hBMUz-0005xN-HK; Tue, 02 Apr 2019 16:42:57 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hBMUx-0005xE-Ci for xen-devel@lists.xenproject.org; Tue, 02 Apr 2019 16:42:55 +0000 X-Inumbo-ID: 5c966952-5566-11e9-b7e8-d3463b65a21f Received: from foss.arm.com (unknown [217.140.101.70]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTP id 5c966952-5566-11e9-b7e8-d3463b65a21f; Tue, 02 Apr 2019 16:42:54 +0000 (UTC) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 953A315AD; Tue, 2 Apr 2019 09:42:53 -0700 (PDT) Received: from e108454-lin.cambridge.arm.com (e108454-lin.cambridge.arm.com [10.1.196.50]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id C86163F721; Tue, 2 Apr 2019 09:42:51 -0700 (PDT) From: Julien Grall To: xen-devel@lists.xenproject.org Date: Tue, 2 Apr 2019 17:42:35 +0100 Message-Id: <20190402164238.1815-2-julien.grall@arm.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190402164238.1815-1-julien.grall@arm.com> References: <20190402164238.1815-1-julien.grall@arm.com> Subject: [Xen-devel] [PATCH 1/4] xen/console: Properly buffer domU output when using CONSOLEIO_write X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" The output will be buffered if the buffer provided by the DomU does not contain a newline. This can also happen if buffer provided by DomU is split in multiple part (Xen can only process 127 characters at the time). As Xen will remove any non-printable characters, the output buffer may be smaller than the buffer provided. However, Xen will buffer using the original length. This means that the NUL character and garbagge will be copied in the internal buffer. Once the newline is found or the internal buffer is full, only part of the internal buffer will end up to be printed. An easy way to reproduce it is: HYPERVISOR_consoleio(CONSOLEIO_write, "\33", 1); HYPERVISOR_consoleio(CONSOLEIO_write, "d", 1); HYPERVISOR_consoleio(CONSOLEIO_write, "\n", 1); In the current code, the character 'd' will not be printed. This problem can be solved by computing the size of the output buffer (i.e the buffer without the non-printable characters). Signed-off-by: Julien Grall Acked-by: Wei Liu --- I is possible to compute (kout - kbuf) only once. I didn't do it because I wasn't able to find a good name. --- xen/drivers/char/console.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index 5f0f54201b..9bbcb0f57a 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -592,11 +592,11 @@ static long guest_console_write(XEN_GUEST_HANDLE_PARAM(char) buffer, int count) guest_printk(cd, XENLOG_G_DEBUG "%s%s\n", cd->pbuf, kbuf); cd->pbuf_idx = 0; } - else if ( cd->pbuf_idx + kcount < (DOMAIN_PBUF_SIZE - 1) ) + else if ( cd->pbuf_idx + (kout - kbuf) < (DOMAIN_PBUF_SIZE - 1) ) { /* buffer the output until a newline */ - memcpy(cd->pbuf + cd->pbuf_idx, kbuf, kcount); - cd->pbuf_idx += kcount; + memcpy(cd->pbuf + cd->pbuf_idx, kbuf, kout - kbuf); + cd->pbuf_idx += (kout - kbuf); } else { From patchwork Tue Apr 2 16:42:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 161642 Delivered-To: patch@linaro.org Received: by 2002:a02:c6d8:0:0:0:0:0 with SMTP id r24csp1964021jan; Tue, 2 Apr 2019 09:44:26 -0700 (PDT) X-Google-Smtp-Source: APXvYqxljtwdSVhtioZjcv4iaAR/JYwUx1X+VbTuJOHxmMVeM69RQHSJu100T+bypO0Zpez8BUXw X-Received: by 2002:a25:7ac1:: with SMTP id v184mr57242561ybc.348.1554223466575; Tue, 02 Apr 2019 09:44:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554223466; cv=none; d=google.com; s=arc-20160816; b=bKlvaCX0AIyyhM/VJJgF2yLAfzVUKEUMy7CXrwzZInsJszWsfFALTVaXvkkK8D7AeB Jgqq/UHDTtHqowP+V0ruaOSrJMFzFhLdqVQpxktVXwiTRpR/jy0sIJI1MHEeJdeMAOal BNCknBJUp5ednmT6QqejcAcdCqt1uTWKydfxR7x9ixdyKDplCg0MkCTjZBjkNTzoNg9R AhmCOwL+EMzzsTV3xZ/xXaZML2KKRCBTDEeOgu/R5OxbVEqwomeNlsrrNX3BHENZQVvU vxJUyMRtwpy+6atZ28G2EGIY4e+5R4Tnfrgmq1mbi+4tqU6iuh2MgIrrevVHLxUhoZfn lY2Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-unsubscribe:list-id :precedence:subject:references:in-reply-to:message-id:date:to:from; bh=tNpP4E3dJ+kKtL/tgaP0Xetf+l3i4lt3ewC+7p4+cNo=; b=bAwCgx2oair+npm2cHu0p0KcKE2G6/5loEXuIkfztUHKoOtMMvHDEFBhM00KuZ3mOq cwDevS9Bo6MYigdILkzTYJ/Epuj5g3iW3CS03+lBfyCNbc/yeqjgv6ju+uXNYVA2seEX K6Mxps7vIQ0Z67l9pv4aIoEpVhuVIHKQJUYM8OU0niKwmAppnlH/BMbVSCpUoBQno92c SMtqavDWQVnGi6FEKntnOJiQ1hv9rPR9FZa8d1bc9mXP4+UcDNPTGYbu3jP4AKoF/FOF l9QSSA1UJUYJ5zae19XCu4tipcAD2M58Q4HvYMjTtD551mmVEcjzUq05/+eY/6BJVKQw 79Mw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id t5si8011041yba.279.2019.04.02.09.44.26 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 02 Apr 2019 09:44:26 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hBMV1-0005xo-1F; Tue, 02 Apr 2019 16:42:59 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hBMUz-0005xM-J4 for xen-devel@lists.xenproject.org; Tue, 02 Apr 2019 16:42:57 +0000 X-Inumbo-ID: 5de80504-5566-11e9-be92-cbe933e40cc4 Received: from foss.arm.com (unknown [217.140.101.70]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTP id 5de80504-5566-11e9-be92-cbe933e40cc4; Tue, 02 Apr 2019 16:42:56 +0000 (UTC) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id F2E1C80D; Tue, 2 Apr 2019 09:42:55 -0700 (PDT) Received: from e108454-lin.cambridge.arm.com (e108454-lin.cambridge.arm.com [10.1.196.50]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id D51D23F721; Tue, 2 Apr 2019 09:42:53 -0700 (PDT) From: Julien Grall To: xen-devel@lists.xenproject.org Date: Tue, 2 Apr 2019 17:42:36 +0100 Message-Id: <20190402164238.1815-3-julien.grall@arm.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190402164238.1815-1-julien.grall@arm.com> References: <20190402164238.1815-1-julien.grall@arm.com> Subject: [Xen-devel] [PATCH 2/4] xen/console: Don't treat NUL character as the end of the buffer X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" After upgrading Debian to Buster, I have began to notice console mangling when using zsh in Dom0. This is happenning because output sent by zsh to the console may contain NULs in the middle of the buffer. The actual implementation of CONSOLEIO_write considers that a buffer always terminate with a NUL and therefore will ignore anything after it. In general, NULs are perfectly legitimate in terminal streams. For instance, this could be used for padding slow terminals. See terminfo(5) section `Delays and Padding`, or search for the pcre '\bpad'. Other use cases includes using the console for dumping non-human readable information (e.g debugger, file if no network...). With the current behavior, the resulting stream will end up to be corrupted. The documentation for CONSOLEIO_write is pretty limited (to not say inexistent). From the declaration, the hypercall takes a buffer and size. So this could lead to think the NUL character is allowed in the middle of the buffer. This patch updates the console API to pass the size along the buffer down so we can remove the reliance on buffer terminating by a NUL character. Signed-off-by: Julien Grall --- This patch was originally sent standalone [1]. But the series grows to include another bug found in the console code and documentation. Change since the standalone version: - Fix early printk on Arm - Fix gdbstub - Remove unecessary leading NUL character added by Xen - Handle DomU console - Rework the commit message Below a small C program to repro the bug on Xen: int main(void) { write(1, "\r\33[0m\0\0\0\0\0\0\0\0\33[27m\33[24m\33[j\33[32mjulien\33[31m@\33[00m\33[36mjuno2-julieng:~\33[37m>", 75); write(1, "\33[K\33[32C\33[01;33m--juno2-julieng-13:44--\33[00m\33[37m\33[55D", 54); write(1, "\33[?2004h", 8); return 0; } Without this patch, the only --juno2-julieng-13:44-- will be printed in yellow. This patch was tested on Arm using serial console. I am not entirely sure whether the video and PV console is correct. I would appreciate help for testing here. [1] https://lists.xenproject.org/archives/html/xen-devel/2019-02/msg01932.html --- xen/arch/arm/early_printk.c | 5 ++-- xen/common/gdbstub.c | 6 ++-- xen/drivers/char/console.c | 58 +++++++++++++++++++-------------------- xen/drivers/char/consoled.c | 7 ++--- xen/drivers/char/serial.c | 8 ++++-- xen/drivers/char/xen_pv_console.c | 10 +++---- xen/drivers/video/lfb.c | 14 ++++++---- xen/drivers/video/lfb.h | 4 +-- xen/drivers/video/vga.c | 14 ++++++---- xen/include/xen/console.h | 2 +- xen/include/xen/early_printk.h | 2 +- xen/include/xen/pv_console.h | 4 +-- xen/include/xen/serial.h | 4 +-- xen/include/xen/video.h | 4 +-- 14 files changed, 73 insertions(+), 69 deletions(-) diff --git a/xen/arch/arm/early_printk.c b/xen/arch/arm/early_printk.c index 97466a12b1..35a47c7229 100644 --- a/xen/arch/arm/early_printk.c +++ b/xen/arch/arm/early_printk.c @@ -17,9 +17,10 @@ void early_putch(char c); void early_flush(void); -void early_puts(const char *s) +void early_puts(const char *s, unsigned int nr) { - while (*s != '\0') { + while ( nr-- > 0 ) + { if (*s == '\n') early_putch('\r'); early_putch(*s); diff --git a/xen/common/gdbstub.c b/xen/common/gdbstub.c index 07095e1ec7..08a4dda9f3 100644 --- a/xen/common/gdbstub.c +++ b/xen/common/gdbstub.c @@ -68,7 +68,7 @@ static void gdb_smp_resume(void); static char __initdata opt_gdb[30]; string_param("gdb", opt_gdb); -static void gdbstub_console_puts(const char *str); +static void gdbstub_console_puts(const char *str, unsigned int nr); /* value <-> char (de)serialzers */ static char @@ -546,14 +546,14 @@ __gdb_ctx = { static struct gdb_context *gdb_ctx = &__gdb_ctx; static void -gdbstub_console_puts(const char *str) +gdbstub_console_puts(const char *str, unsigned int nr) { const char *p; gdb_start_packet(gdb_ctx); gdb_write_to_packet_char('O', gdb_ctx); - for ( p = str; *p != '\0'; p++ ) + for ( p = str; nr > 0; p++, nr-- ) { gdb_write_to_packet_char(hex2char((*p>>4) & 0x0f), gdb_ctx ); gdb_write_to_packet_char(hex2char((*p) & 0x0f), gdb_ctx ); diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index 9bbcb0f57a..b119bf980b 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -325,9 +325,9 @@ long read_console_ring(struct xen_sysctl_readconsole *op) static char serial_rx_ring[SERIAL_RX_SIZE]; static unsigned int serial_rx_cons, serial_rx_prod; -static void (*serial_steal_fn)(const char *) = early_puts; +static void (*serial_steal_fn)(const char *, unsigned int nr) = early_puts; -int console_steal(int handle, void (*fn)(const char *)) +int console_steal(int handle, void (*fn)(const char *, unsigned int nr)) { if ( (handle == -1) || (handle != sercon_handle) ) return 0; @@ -345,15 +345,15 @@ void console_giveback(int id) serial_steal_fn = NULL; } -static void sercon_puts(const char *s) +static void sercon_puts(const char *s, unsigned int nr) { if ( serial_steal_fn != NULL ) - (*serial_steal_fn)(s); + (*serial_steal_fn)(s, nr); else - serial_puts(sercon_handle, s); + serial_puts(sercon_handle, s, nr); /* Copy all serial output into PV console */ - pv_console_puts(s); + pv_console_puts(s, nr); } static void dump_console_ring_key(unsigned char key) @@ -388,8 +388,8 @@ static void dump_console_ring_key(unsigned char key) } buf[sofar] = '\0'; - sercon_puts(buf); - video_puts(buf); + sercon_puts(buf, sofar); + video_puts(buf, sofar); free_xenheap_pages(buf, order); } @@ -527,7 +527,7 @@ static inline void xen_console_write_debug_port(const char *buf, size_t len) static long guest_console_write(XEN_GUEST_HANDLE_PARAM(char) buffer, int count) { char kbuf[128]; - int kcount = 0; + unsigned int kcount = 0; struct domain *cd = current->domain; while ( count > 0 ) @@ -540,25 +540,22 @@ static long guest_console_write(XEN_GUEST_HANDLE_PARAM(char) buffer, int count) kcount = min_t(int, count, sizeof(kbuf)-1); if ( copy_from_guest(kbuf, buffer, kcount) ) return -EFAULT; - kbuf[kcount] = '\0'; if ( is_hardware_domain(cd) ) { /* Use direct console output as it could be interactive */ spin_lock_irq(&console_lock); - sercon_puts(kbuf); - video_puts(kbuf); + sercon_puts(kbuf, kcount); + video_puts(kbuf, kcount); #ifdef CONFIG_X86 if ( opt_console_xen ) { - size_t len = strlen(kbuf); - if ( xen_guest ) - xen_hypercall_console_write(kbuf, len); + xen_hypercall_console_write(kbuf, kcount); else - xen_console_write_debug_port(kbuf, len); + xen_console_write_debug_port(kbuf, kcount); } #endif @@ -575,19 +572,20 @@ static long guest_console_write(XEN_GUEST_HANDLE_PARAM(char) buffer, int count) char *kin = kbuf, *kout = kbuf, c; /* Strip non-printable characters */ - for ( ; ; ) + do { c = *kin++; - if ( c == '\0' || c == '\n' ) + if ( c == '\n' ) break; if ( isprint(c) || c == '\t' ) *kout++ = c; - } + } while ( --kcount > 0 ); + *kout = '\0'; spin_lock(&cd->pbuf_lock); + kcount = kin - kbuf; if ( c == '\n' ) { - kcount = kin - kbuf; cd->pbuf[cd->pbuf_idx] = '\0'; guest_printk(cd, XENLOG_G_DEBUG "%s%s\n", cd->pbuf, kbuf); cd->pbuf_idx = 0; @@ -666,16 +664,16 @@ static bool_t console_locks_busted; static void __putstr(const char *str) { + size_t len = strlen(str); + ASSERT(spin_is_locked(&console_lock)); - sercon_puts(str); - video_puts(str); + sercon_puts(str, len); + video_puts(str, len); #ifdef CONFIG_X86 if ( opt_console_xen ) { - size_t len = strlen(str); - if ( xen_guest ) xen_hypercall_console_write(str, len); else @@ -1246,6 +1244,7 @@ void debugtrace_printk(const char *fmt, ...) char cntbuf[24]; va_list args; unsigned long flags; + unsigned int nr; if ( debugtrace_bytes == 0 ) return; @@ -1257,14 +1256,15 @@ void debugtrace_printk(const char *fmt, ...) ASSERT(debugtrace_buf[debugtrace_bytes - 1] == 0); va_start(args, fmt); - vsnprintf(buf, sizeof(buf), fmt, args); + nr = vscnprintf(buf, sizeof(buf), fmt, args); va_end(args); if ( debugtrace_send_to_console ) { - snprintf(cntbuf, sizeof(cntbuf), "%u ", ++count); - serial_puts(sercon_handle, cntbuf); - serial_puts(sercon_handle, buf); + unsigned int n = snprintf(cntbuf, sizeof(cntbuf), "%u ", ++count); + + serial_puts(sercon_handle, cntbuf, n); + serial_puts(sercon_handle, buf, nr); } else { @@ -1377,7 +1377,7 @@ void panic(const char *fmt, ...) * ************************************************************** */ -static void suspend_steal_fn(const char *str) { } +static void suspend_steal_fn(const char *str, unsigned int nr) { } static int suspend_steal_id; int console_suspend(void) diff --git a/xen/drivers/char/consoled.c b/xen/drivers/char/consoled.c index 552abf5766..222e018442 100644 --- a/xen/drivers/char/consoled.c +++ b/xen/drivers/char/consoled.c @@ -77,16 +77,13 @@ size_t consoled_guest_rx(void) if ( idx >= BUF_SZ ) { - pv_console_puts(buf); + pv_console_puts(buf, BUF_SZ); idx = 0; } } if ( idx ) - { - buf[idx] = '\0'; - pv_console_puts(buf); - } + pv_console_puts(buf, idx); /* No need for a mem barrier because every character was already consumed */ barrier(); diff --git a/xen/drivers/char/serial.c b/xen/drivers/char/serial.c index 221a14c092..7498299807 100644 --- a/xen/drivers/char/serial.c +++ b/xen/drivers/char/serial.c @@ -223,11 +223,11 @@ void serial_putc(int handle, char c) spin_unlock_irqrestore(&port->tx_lock, flags); } -void serial_puts(int handle, const char *s) +void serial_puts(int handle, const char *s, unsigned int nr) { struct serial_port *port; unsigned long flags; - char c; + unsigned int i; if ( handle == -1 ) return; @@ -238,8 +238,10 @@ void serial_puts(int handle, const char *s) spin_lock_irqsave(&port->tx_lock, flags); - while ( (c = *s++) != '\0' ) + for ( i = 0; i < nr; i++ ) { + char c = s[i]; + if ( (c == '\n') && (handle & SERHND_COOKED) ) __serial_putc(port, '\r' | ((handle & SERHND_HI) ? 0x80 : 0x00)); diff --git a/xen/drivers/char/xen_pv_console.c b/xen/drivers/char/xen_pv_console.c index cc1c1d743f..5bb303d4c8 100644 --- a/xen/drivers/char/xen_pv_console.c +++ b/xen/drivers/char/xen_pv_console.c @@ -129,13 +129,13 @@ size_t pv_console_rx(struct cpu_user_regs *regs) return recv; } -static size_t pv_ring_puts(const char *buf) +static size_t pv_ring_puts(const char *buf, unsigned int nr) { XENCONS_RING_IDX cons, prod; size_t sent = 0, avail; bool put_r = false; - while ( buf[sent] != '\0' || put_r ) + while ( sent < nr || put_r ) { cons = ACCESS_ONCE(cons_ring->out_cons); prod = cons_ring->out_prod; @@ -156,7 +156,7 @@ static size_t pv_ring_puts(const char *buf) continue; } - while ( avail && (buf[sent] != '\0' || put_r) ) + while ( avail && (sent < nr || put_r) ) { if ( put_r ) { @@ -185,7 +185,7 @@ static size_t pv_ring_puts(const char *buf) return sent; } -void pv_console_puts(const char *buf) +void pv_console_puts(const char *buf, unsigned int nr) { unsigned long flags; @@ -193,7 +193,7 @@ void pv_console_puts(const char *buf) return; spin_lock_irqsave(&tx_lock, flags); - pv_ring_puts(buf); + pv_ring_puts(buf, nr); spin_unlock_irqrestore(&tx_lock, flags); } diff --git a/xen/drivers/video/lfb.c b/xen/drivers/video/lfb.c index d0c8c492b0..93b6a33a41 100644 --- a/xen/drivers/video/lfb.c +++ b/xen/drivers/video/lfb.c @@ -59,14 +59,15 @@ static void lfb_show_line( } /* Fast mode which redraws all modified parts of a 2D text buffer. */ -void lfb_redraw_puts(const char *s) +void lfb_redraw_puts(const char *s, unsigned int nr) { unsigned int i, min_redraw_y = lfb.ypos; - char c; /* Paste characters into text buffer. */ - while ( (c = *s++) != '\0' ) + for ( i = 0; i < nr; i++ ) { + char c = s[i]; + if ( (c == '\n') || (lfb.xpos >= lfb.lfbp.text_columns) ) { if ( ++lfb.ypos >= lfb.lfbp.text_rows ) @@ -103,13 +104,14 @@ void lfb_redraw_puts(const char *s) } /* Slower line-based scroll mode which interacts better with dom0. */ -void lfb_scroll_puts(const char *s) +void lfb_scroll_puts(const char *s, unsigned int nr) { unsigned int i; - char c; - while ( (c = *s++) != '\0' ) + for ( i = 0; i < nr; i++ ) { + char c = s[i]; + if ( (c == '\n') || (lfb.xpos >= lfb.lfbp.text_columns) ) { unsigned int bytes = (lfb.lfbp.width * diff --git a/xen/drivers/video/lfb.h b/xen/drivers/video/lfb.h index ac40a66379..15599e22ef 100644 --- a/xen/drivers/video/lfb.h +++ b/xen/drivers/video/lfb.h @@ -35,8 +35,8 @@ struct lfb_prop { unsigned int text_rows; }; -void lfb_redraw_puts(const char *s); -void lfb_scroll_puts(const char *s); +void lfb_redraw_puts(const char *s, unsigned int nr); +void lfb_scroll_puts(const char *s, unsigned int nr); void lfb_carriage_return(void); void lfb_free(void); diff --git a/xen/drivers/video/vga.c b/xen/drivers/video/vga.c index 6a64fd9013..01f12aae42 100644 --- a/xen/drivers/video/vga.c +++ b/xen/drivers/video/vga.c @@ -18,9 +18,9 @@ static int vgacon_keep; static unsigned int xpos, ypos; static unsigned char *video; -static void vga_text_puts(const char *s); -static void vga_noop_puts(const char *s) {} -void (*video_puts)(const char *) = vga_noop_puts; +static void vga_text_puts(const char *s, unsigned int nr); +static void vga_noop_puts(const char *s, unsigned int nr) {} +void (*video_puts)(const char *, unsigned int nr) = vga_noop_puts; /* * 'vga=[,keep]' where is one of: @@ -177,12 +177,14 @@ void __init video_endboot(void) } } -static void vga_text_puts(const char *s) +static void vga_text_puts(const char *s, unsigned int nr) { - char c; + unsigned int i; - while ( (c = *s++) != '\0' ) + for ( i = 0; i < nr; i++ ) { + char c = s[i]; + if ( (c == '\n') || (xpos >= columns) ) { if ( ++ypos >= lines ) diff --git a/xen/include/xen/console.h b/xen/include/xen/console.h index b4f9463936..dafa53ba6b 100644 --- a/xen/include/xen/console.h +++ b/xen/include/xen/console.h @@ -38,7 +38,7 @@ struct domain *console_input_domain(void); * Steal output from the console. Returns +ve identifier, else -ve error. * Takes the handle of the serial line to steal, and steal callback function. */ -int console_steal(int handle, void (*fn)(const char *)); +int console_steal(int handle, void (*fn)(const char *, unsigned int nr)); /* Give back stolen console. Takes the identifier returned by console_steal. */ void console_giveback(int id); diff --git a/xen/include/xen/early_printk.h b/xen/include/xen/early_printk.h index 2c3e1b3519..22f8009a5f 100644 --- a/xen/include/xen/early_printk.h +++ b/xen/include/xen/early_printk.h @@ -5,7 +5,7 @@ #define __XEN_EARLY_PRINTK_H__ #ifdef CONFIG_EARLY_PRINTK -void early_puts(const char *s); +void early_puts(const char *s, unsigned int nr); #else #define early_puts NULL #endif diff --git a/xen/include/xen/pv_console.h b/xen/include/xen/pv_console.h index cb92539666..41144890e4 100644 --- a/xen/include/xen/pv_console.h +++ b/xen/include/xen/pv_console.h @@ -8,7 +8,7 @@ void pv_console_init(void); void pv_console_set_rx_handler(serial_rx_fn fn); void pv_console_init_postirq(void); -void pv_console_puts(const char *buf); +void pv_console_puts(const char *buf, unsigned int nr); size_t pv_console_rx(struct cpu_user_regs *regs); evtchn_port_t pv_console_evtchn(void); @@ -17,7 +17,7 @@ evtchn_port_t pv_console_evtchn(void); static inline void pv_console_init(void) {} static inline void pv_console_set_rx_handler(serial_rx_fn fn) { } static inline void pv_console_init_postirq(void) { } -static inline void pv_console_puts(const char *buf) { } +static inline void pv_console_puts(const char *buf, unsigned int nr) { } static inline size_t pv_console_rx(struct cpu_user_regs *regs) { return 0; } evtchn_port_t pv_console_evtchn(void) { diff --git a/xen/include/xen/serial.h b/xen/include/xen/serial.h index f2994d4093..e11d6d3ebc 100644 --- a/xen/include/xen/serial.h +++ b/xen/include/xen/serial.h @@ -114,8 +114,8 @@ int serial_parse_handle(char *conf); /* Transmit a single character via the specified COM port. */ void serial_putc(int handle, char c); -/* Transmit a NULL-terminated string via the specified COM port. */ -void serial_puts(int handle, const char *s); +/* Transmit a string via the specified COM port. */ +void serial_puts(int handle, const char *s, unsigned int nr); /* * An alternative to registering a character-receive hook. This function diff --git a/xen/include/xen/video.h b/xen/include/xen/video.h index 2e897f9df5..ddd21f374d 100644 --- a/xen/include/xen/video.h +++ b/xen/include/xen/video.h @@ -13,11 +13,11 @@ #ifdef CONFIG_VIDEO void video_init(void); -extern void (*video_puts)(const char *); +extern void (*video_puts)(const char *, unsigned int nr); void video_endboot(void); #else #define video_init() ((void)0) -#define video_puts(s) ((void)0) +#define video_puts(s, nr) ((void)0) #define video_endboot() ((void)0) #endif From patchwork Tue Apr 2 16:42:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 161641 Delivered-To: patch@linaro.org Received: by 2002:a02:c6d8:0:0:0:0:0 with SMTP id r24csp1963956jan; Tue, 2 Apr 2019 09:44:23 -0700 (PDT) X-Google-Smtp-Source: APXvYqyXygRTln/JDnAn4VF/zbMVUj83/vp3aQgxBQaopxtRvy+pixUx4PuKD+SVPzDnoWJl/Xto X-Received: by 2002:a81:848f:: with SMTP id u137mr25149525ywf.22.1554223463629; Tue, 02 Apr 2019 09:44:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554223463; cv=none; d=google.com; s=arc-20160816; b=W77I8S2yKMZpmU1phBUebpqLzZJvt/IZfWUQNNvYTVhRQ81oMK3A82YUcBnx9FHaYT vXIvmO8QIWEtaF9dWmN08FoTbtUz/dJsm+4tL/mCRIpL/CXBlDVKmQpff2HFU+Datw5M 2LkcyciYDvGaJbC2VxAiyfVEY4GEwRlvqRNg1JR9cBFcOjJZ6VEeE0E6nlue451PU3V2 zMFXipr4q4QOWxwBQtXgI4QwdeBRRpnFQfGD/L8lPHSX+zx2QjGrpxZLmxE2HmUDpMT/ pRaokEuT4MS4HY13iu63Tx5XGgVqMNm2nGOks3B4VXIvihU08aS6d+B681rXLTFo7hsR rTnA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-unsubscribe:list-id :precedence:subject:references:in-reply-to:message-id:date:to:from; bh=IlRySa64K7Jpz7i+DRcOj4YXDyBEL5zV3DI+V7tCfJU=; b=FDcfX50N9QXXRIHPwqjFrqocxVdIgKrAh/mPbxtOI3ZdRPRlcRDSblym0OUvUtv/n8 Hkqih+D5QAyvBNqSDOZMK7ibacVcdACo0TURCDyDyUCnnY+kotGWtRNHmfk51vIe5j9/ EKzycbErYspvRBJZOZt3luhp50UaviQ3mytyoOU3DLuAdfEGC20KACKZ4LvED2x6f9kG QnZQMs2BLzFLo7FlzQATabZcqO3CQxed9dqmiGKWJs8cs1ZM+i1lDPbVT288eH1eh41Y y6UrafoyUT92OwPHi5sopEqOibBwP9dw0oHPC4+sB5E4msXTqny92DJJjnHeD1b/T+p+ EnWg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id n7si8707549ybp.58.2019.04.02.09.44.23 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 02 Apr 2019 09:44:23 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hBMV2-0005yE-Bm; Tue, 02 Apr 2019 16:43:00 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hBMV1-0005xu-Cv for xen-devel@lists.xenproject.org; Tue, 02 Apr 2019 16:42:59 +0000 X-Inumbo-ID: 5f1c9570-5566-11e9-9c4a-87eae8392637 Received: from foss.arm.com (unknown [217.140.101.70]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTP id 5f1c9570-5566-11e9-9c4a-87eae8392637; Tue, 02 Apr 2019 16:42:58 +0000 (UTC) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 08BF21688; Tue, 2 Apr 2019 09:42:58 -0700 (PDT) Received: from e108454-lin.cambridge.arm.com (e108454-lin.cambridge.arm.com [10.1.196.50]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 3C20A3F721; Tue, 2 Apr 2019 09:42:56 -0700 (PDT) From: Julien Grall To: xen-devel@lists.xenproject.org Date: Tue, 2 Apr 2019 17:42:37 +0100 Message-Id: <20190402164238.1815-4-julien.grall@arm.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190402164238.1815-1-julien.grall@arm.com> References: <20190402164238.1815-1-julien.grall@arm.com> Subject: [Xen-devel] [PATCH 3/4] xen/public: Document HYPERCALL_console_io() X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Currently, OS developpers will have to look at Xen code in order to know the parameters of an hypercall and how it is meant to work. This is not a trivial task as you may need to have a deep understanding of Xen internal. This patch attempts to document the behavior of HYPERCALL_console_io() to help OS developer. Signed-off-by: Julien Grall Acked-by: Wei Liu --- This is a first attempt to address the lack on documentation for hypercalls. We may want to decide a format to use in every hypercall so it can be readable for the OS developer and easily consummed by documentation tools. --- xen/include/public/xen.h | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h index ccdffc0ad1..7c119c6782 100644 --- a/xen/include/public/xen.h +++ b/xen/include/public/xen.h @@ -97,6 +97,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_ulong_t); #define __HYPERVISOR_set_timer_op 15 #define __HYPERVISOR_event_channel_op_compat 16 /* compat since 0x00030202 */ #define __HYPERVISOR_xen_version 17 +/* HYPERVISOR_console_io(int cmd, int count, XEN_GUEST_HANDLE(char) buffer); */ #define __HYPERVISOR_console_io 18 #define __HYPERVISOR_physdev_op_compat 19 /* compat since 0x00030202 */ #define __HYPERVISOR_grant_table_op 20 @@ -486,7 +487,25 @@ DEFINE_XEN_GUEST_HANDLE(mmuext_op_t); /* ` } */ /* - * Commands to HYPERVISOR_console_io(). + * Commands to HYPERVISOR_console_io() + * + * @cmd: Command (see below) + * @count: Size of the buffer to read/write + * @buffer: Pointer in the guest memory + * + * List of commands: + * + * * CONSOLEIO_write: Write the buffer on Xen console. + * For the hardware domain, all the characters in the buffer will + * be written. Characters will be printed to directly to the + * console. + * For all the other domains, only the printable characters will be + * written. Characters may be buffered until a newline (i.e '\n') is + * found. + * Return 0 on success, otherwise return an error code. + * * CONSOLE_read: Attempts to read up @count characters from Xen console. + * Return the number of character read on success, otherwise return + * an error code. */ #define CONSOLEIO_write 0 #define CONSOLEIO_read 1 From patchwork Tue Apr 2 16:42:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 161638 Delivered-To: patch@linaro.org Received: by 2002:a02:c6d8:0:0:0:0:0 with SMTP id r24csp1963924jan; Tue, 2 Apr 2019 09:44:21 -0700 (PDT) X-Google-Smtp-Source: APXvYqw2WtJjjAa/ie/mpGWLdOoa505FI8nLFgbl7FiGziCvp6IcXFbWKs4tE1i96D399ntW9N1f X-Received: by 2002:a25:6942:: with SMTP id e63mr2328943ybc.470.1554223461773; Tue, 02 Apr 2019 09:44:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554223461; cv=none; d=google.com; s=arc-20160816; b=VeoglpsEZzFBAScyhNPeY10RthvLvd6Ta1XGym9KM0kM1FvR2GcppPM7wULT4PG/1z m3arPcbDOhv8kuNkPaVB/sVceOBHYkdMURwko8/BCh7/JstGtdJzdGf+0/vwLG/Y/H0p J8F+UlPKo09vc8OG9J7FIf3OhnzdHTzPv2guNqss4hOdAp6hln55ouGxqN7JmJpK6Gn6 t23085Qzn0lA6Mh+0gN7xBbB1+58PjGWUvqu0Ra4eecPdKpfQ3B0FSaCtXjUCZqG8aCi A5F9NzO30Rmp5ce+BVpsRRcM1JuVIyRfOAbKO2gnmmbfMOyu3gbECC4CSTipiU1z39xV xl6Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-unsubscribe:list-id :precedence:subject:references:in-reply-to:message-id:date:to:from; bh=Aht7Po8VW5djS/RWLKjrqjh/KFfWBBC29k6/osP6qz4=; b=jjnWURv3iQhQDJyBnisIRhaNC/EePwY2s13oawpYRUkT0PMhW6dBOFhukL1THkUERr rrj+usJdbGcaI0vaK3l/4X2f3Qhth+XCnmn4us12PL76mMNwJBLpXEAgvGPz+K/ni6nV /O3yyWQ2+HDlwHKecLw2DlH9FdEmiQmv7Ptyramoly+51PHleCOp1pstVSfhauFUDwfG f1Bv4dRwdaKu4ja/OE5YzYaVh5UtV9iLbm+2sRvA0rFCqrRuMtOM4E1S3fmWe7jpVf4v 9p3F5bS0TBo+/jB6tXMsbURRfWJLMRGNImETfry2ngn9ki/5SHezbMqQpAN9s+nhsFQ2 GSQw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id a77si8090141ywa.135.2019.04.02.09.44.21 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 02 Apr 2019 09:44:21 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hBMV4-0005zb-Mx; Tue, 02 Apr 2019 16:43:02 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hBMV2-0005yz-Sa for xen-devel@lists.xenproject.org; Tue, 02 Apr 2019 16:43:00 +0000 X-Inumbo-ID: 605738a0-5566-11e9-9a61-6fe3d858de2e Received: from foss.arm.com (unknown [217.140.101.70]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTP id 605738a0-5566-11e9-9a61-6fe3d858de2e; Tue, 02 Apr 2019 16:43:00 +0000 (UTC) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 148BA15AD; Tue, 2 Apr 2019 09:43:00 -0700 (PDT) Received: from e108454-lin.cambridge.arm.com (e108454-lin.cambridge.arm.com [10.1.196.50]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 467C33F721; Tue, 2 Apr 2019 09:42:58 -0700 (PDT) From: Julien Grall To: xen-devel@lists.xenproject.org Date: Tue, 2 Apr 2019 17:42:38 +0100 Message-Id: <20190402164238.1815-5-julien.grall@arm.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190402164238.1815-1-julien.grall@arm.com> References: <20190402164238.1815-1-julien.grall@arm.com> Subject: [Xen-devel] [PATCH 4/4] xen/console: Simplify domU console handling in guest_console_write X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" 2 paths in the domU console handling are now the same. So they can be merged to make the code simpler. Signed-off-by: Julien Grall Acked-by: Wei Liu Reviewed-by: Stefano Stabellini --- xen/drivers/char/console.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index b119bf980b..5483d66512 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -584,13 +584,8 @@ static long guest_console_write(XEN_GUEST_HANDLE_PARAM(char) buffer, int count) *kout = '\0'; spin_lock(&cd->pbuf_lock); kcount = kin - kbuf; - if ( c == '\n' ) - { - cd->pbuf[cd->pbuf_idx] = '\0'; - guest_printk(cd, XENLOG_G_DEBUG "%s%s\n", cd->pbuf, kbuf); - cd->pbuf_idx = 0; - } - else if ( cd->pbuf_idx + (kout - kbuf) < (DOMAIN_PBUF_SIZE - 1) ) + if ( c != '\n' && + (cd->pbuf_idx + (kout - kbuf) < (DOMAIN_PBUF_SIZE - 1)) ) { /* buffer the output until a newline */ memcpy(cd->pbuf + cd->pbuf_idx, kbuf, kout - kbuf);