Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp4457492yba; Tue, 9 Apr 2019 20:19:31 -0700 (PDT) X-Google-Smtp-Source: APXvYqxYSwwCBeRxhVrw+FcY2YQWaK9UB1EV/KDZIWROyFKCJol94Oyvefivna9hbKCyfe6mcMV5 X-Received: by 2002:a62:6444:: with SMTP id y65mr40622853pfb.56.1554866371908; Tue, 09 Apr 2019 20:19:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554866371; cv=none; d=google.com; s=arc-20160816; b=cdO49uMU/oQbjvBBl285ObD1ZmkNyMqGUyofAzA7aFtY08+QBBcSDocg5E23Jnhqdv UBBiHxWfVGT/66GRf0UYjqvc3vO3DkI/zPaUOQMHa17YTyB/dAF2z0IsJ9IxQpq3cfgC 9uJejpnu5njk9JpSdckGhS6tbFlGbqu/OgTbi6V9qeiriyiJNmEqUqsEZi1QeG+ZJ6DI UEVDoQTikklM0QANw/cahLf6nkYGAeKHQkGYNq7+QNsh6KjRTB1uCAMwVFbYFC5efIEa tcKGxdr9MPFpS1BYn3yHYfL0qZwmNj7u+0WBDRuoHeVQOrwBiTSivJ6TeStOJePze9Jt odUQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:content-transfer-encoding :mime-version:references:in-reply-to:date:subject:cc:to:from; bh=bUfsEPDlxCfa3rJfjYsIfJUT3SyJovdtr9/1KBgxM84=; b=BG5efhsq+ZPTlGgj73ozRHVXk0f8wvx5+LWCniZZZTPt05cvRw42qF0CaZq09EQwFp WvuDbGIgphxWRVf8rKT7d40rAND2bopM2B9MQ7bKGEwO95/X2gHUfzrLNArxththwSx8 nWou4Mqr1lKOQB6oCn1awg1G4I7veBQW2XFxEwBg5pur2D1n5Rl2Vl8Law548Bt/Lr8I 8lucxP5Ri1EsTWfmAiLxAfB0GDkxqw40HzNcsSJvzeM22mEIoX3A8NJsw3FV07ipIcLx QfX+/+1UIp2Fqsbr6lsRNQS/dGZR2Rfx/OSDYPYV+bXYxrxW6FO1eB1xNokjd5CjuIXk 1nFQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g7si11490072pgc.313.2019.04.09.20.19.16; Tue, 09 Apr 2019 20:19:31 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727201AbfDJDSF (ORCPT + 99 others); Tue, 9 Apr 2019 23:18:05 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:53432 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727074AbfDJDSE (ORCPT ); Tue, 9 Apr 2019 23:18:04 -0400 Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.27/8.16.0.27) with SMTP id x3A3BkHR039636 for ; Tue, 9 Apr 2019 23:18:03 -0400 Received: from e06smtp03.uk.ibm.com (e06smtp03.uk.ibm.com [195.75.94.99]) by mx0a-001b2d01.pphosted.com with ESMTP id 2rs4wypytw-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 09 Apr 2019 23:18:03 -0400 Received: from localhost by e06smtp03.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 10 Apr 2019 04:17:59 +0100 Received: from b06cxnps3074.portsmouth.uk.ibm.com (9.149.109.194) by e06smtp03.uk.ibm.com (192.168.101.133) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Wed, 10 Apr 2019 04:17:50 +0100 Received: from b06wcsmtp001.portsmouth.uk.ibm.com (b06wcsmtp001.portsmouth.uk.ibm.com [9.149.105.160]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id x3A3Hn8G59048058 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 10 Apr 2019 03:17:49 GMT Received: from b06wcsmtp001.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AE565A4060; Wed, 10 Apr 2019 03:17:49 +0000 (GMT) Received: from b06wcsmtp001.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 177F6A405F; Wed, 10 Apr 2019 03:17:49 +0000 (GMT) Received: from ozlabs.au.ibm.com (unknown [9.192.253.14]) by b06wcsmtp001.portsmouth.uk.ibm.com (Postfix) with ESMTP; Wed, 10 Apr 2019 03:17:49 +0000 (GMT) Received: from adsilva.ozlabs.ibm.com (haven.au.ibm.com [9.192.254.114]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.au.ibm.com (Postfix) with ESMTPSA id F261FA038B; Wed, 10 Apr 2019 13:17:47 +1000 (AEST) From: "Alastair D'Silva" To: alastair@d-silva.org Cc: Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , David Airlie , Daniel Vetter , Karsten Keil , Jassi Brar , Tom Lendacky , "David S. Miller" , Jose Abreu , Kalle Valo , Stanislaw Gruszka , Benson Leung , Enric Balletbo i Serra , "James E.J. Bottomley" , "Martin K. Petersen" , Greg Kroah-Hartman , Alexander Viro , Petr Mladek , Sergey Senozhatsky , Steven Rostedt , Andrew Morton , intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, ath10k@lists.infradead.org, linux-wireless@vger.kernel.org, linux-scsi@vger.kernel.org, linux-fbdev@vger.kernel.org, devel@driverdev.osuosl.org, linux-fsdevel@vger.kernel.org Subject: [PATCH 4/4] lib/hexdump.c: Allow multiple groups to be separated by lines '|' Date: Wed, 10 Apr 2019 13:17:20 +1000 X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190410031720.11067-1-alastair@au1.ibm.com> References: <20190410031720.11067-1-alastair@au1.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 x-cbid: 19041003-0012-0000-0000-0000030D210A X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 19041003-0013-0000-0000-000021454317 Message-Id: <20190410031720.11067-5-alastair@au1.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2019-04-10_02:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=1 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1904100022 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Alastair D'Silva With the wider display format, it can become hard to identify how many bytes into the line you are looking at. The patch adds new flags to hex_dump_to_buffer() and print_hex_dump() to print vertical lines to separate every N groups of bytes. eg. buf:00000000: 454d414e 43415053|4e495f45 00584544 NAMESPAC|E_INDEX. buf:00000010: 00000000 00000002|00000000 00000000 ........|........ Signed-off-by: Alastair D'Silva --- include/linux/printk.h | 3 +++ lib/hexdump.c | 50 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/include/linux/printk.h b/include/linux/printk.h index 82975853c400..d9e407e59059 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h @@ -485,6 +485,9 @@ enum { #define HEXDUMP_SUPPRESS_0XFF (1 << 2) #define HEXDUMP_SUPPRESS_FIRST (1 << 3) #define HEXDUMP_SUPPRESS_LAST (1 << 4) +#define HEXDUMP_2_GRP_LINES (1 << 5) +#define HEXDUMP_4_GRP_LINES (1 << 6) +#define HEXDUMP_8_GRP_LINES (1 << 7) #define HEXDUMP_QUIET (HEXDUMP_SUPPRESS_0X00 | \ HEXDUMP_SUPPRESS_0XFF | \ diff --git a/lib/hexdump.c b/lib/hexdump.c index 79db784577e7..d42f34b93b2c 100644 --- a/lib/hexdump.c +++ b/lib/hexdump.c @@ -76,6 +76,20 @@ char *bin2hex(char *dst, const void *src, size_t count) } EXPORT_SYMBOL(bin2hex); +static const char *group_separator(int group, u64 flags) +{ + if ((flags & HEXDUMP_8_GRP_LINES) && ((group - 1) % 8)) + return "|"; + + if ((flags & HEXDUMP_4_GRP_LINES) && ((group - 1) % 4)) + return "|"; + + if ((flags & HEXDUMP_2_GRP_LINES) && ((group - 1) % 2)) + return "|"; + + return " "; +} + /** * hex_dump_to_buffer - convert a blob of data to "hex ASCII" in memory * @buf: data blob to dump @@ -86,6 +100,9 @@ EXPORT_SYMBOL(bin2hex); * @linebuflen: total size of @linebuf, including space for terminating NUL * @flags: A bitwise OR of the following flags: * HEXDUMP_ASCII: include ASCII after the hex output + * HEXDUMP_2_GRP_LINES: insert a '|' after every 2 groups + * HEXDUMP_4_GRP_LINES: insert a '|' after every 4 groups + * HEXDUMP_8_GRP_LINES: insert a '|' after every 8 groups * * hex_dump_to_buffer() works on one "line" of output at a time, i.e., * 16, 32 or 64 bytes of input data converted to hex + ASCII output. @@ -116,6 +133,7 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, int j, lx = 0; int ascii_column; int ret; + int line_chars = 0; if (rowsize != 16 && rowsize != 32 && rowsize != 64) rowsize = 16; @@ -141,7 +159,8 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, for (j = 0; j < ngroups; j++) { ret = snprintf(linebuf + lx, linebuflen - lx, - "%s%16.16llx", j ? " " : "", + "%s%16.16llx", + j ? group_separator(j, flags) : "", get_unaligned(ptr8 + j)); if (ret >= linebuflen - lx) goto overflow1; @@ -152,7 +171,8 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, for (j = 0; j < ngroups; j++) { ret = snprintf(linebuf + lx, linebuflen - lx, - "%s%8.8x", j ? " " : "", + "%s%8.8x", + j ? group_separator(j, flags) : "", get_unaligned(ptr4 + j)); if (ret >= linebuflen - lx) goto overflow1; @@ -163,7 +183,8 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, for (j = 0; j < ngroups; j++) { ret = snprintf(linebuf + lx, linebuflen - lx, - "%s%4.4x", j ? " " : "", + "%s%4.4x", + j ? group_separator(j, flags) : "", get_unaligned(ptr2 + j)); if (ret >= linebuflen - lx) goto overflow1; @@ -193,11 +214,26 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, goto overflow2; linebuf[lx++] = ' '; } + + if (flags & HEXDUMP_2_GRP_LINES) + line_chars = groupsize * 2; + if (flags & HEXDUMP_4_GRP_LINES) + line_chars = groupsize * 4; + if (flags & HEXDUMP_8_GRP_LINES) + line_chars = groupsize * 8; + for (j = 0; j < len; j++) { if (linebuflen < lx + 2) goto overflow2; ch = ptr[j]; linebuf[lx++] = (isascii(ch) && isprint(ch)) ? ch : '.'; + + if (line_chars && ((j + 1) < len) && + ((j + 1) % line_chars == 0)) { + if (linebuflen < lx + 2) + goto overflow2; + linebuf[lx++] = '|'; + } } nil: linebuf[lx] = '\0'; @@ -205,7 +241,8 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, overflow2: linebuf[lx++] = '\0'; overflow1: - return (flags & HEXDUMP_ASCII) ? ascii_column + len : + return (flags & HEXDUMP_ASCII) ? ascii_column + len + + (len - 1) / line_chars : (groupsize * 2 + 1) * ngroups - 1; } EXPORT_SYMBOL(hex_dump_to_buffer); @@ -246,6 +283,9 @@ static bool buf_is_all(const u8 *buf, size_t len, u8 val) * HEXDUMP_SUPPRESS_LAST: allows the last line to be suppressed * If the first and last line may be suppressed, * an empty buffer will not produce any output + * HEXDUMP_2_GRP_LINES: insert a '|' after every 2 groups + * HEXDUMP_4_GRP_LINES: insert a '|' after every 4 groups + * HEXDUMP_8_GRP_LINES: insert a '|' after every 8 groups * * Given a buffer of u8 data, print_hex_dump() prints a hex + ASCII dump * to the kernel log at the specified kernel log level, with an optional @@ -271,7 +311,7 @@ void print_hex_dump_ext(const char *level, const char *prefix_str, { const u8 *ptr = buf; int i, remaining = len; - unsigned char linebuf[64 * 3 + 2 + 64 + 1]; + unsigned char linebuf[64 * 3 + 2 + 64 + 31 + 1]; bool first_line = true; if (rowsize != 16 && rowsize != 32 && rowsize != 64) -- 2.20.1