Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp4657304yba; Wed, 8 May 2019 00:03:29 -0700 (PDT) X-Google-Smtp-Source: APXvYqztgO04epogrt3a1jaotpbplTOF2njd9UERXyXULlIO9mhjz9fqpuLjugdc8qFA0cUdIi6h X-Received: by 2002:a17:902:7892:: with SMTP id q18mr45350689pll.163.1557299009621; Wed, 08 May 2019 00:03:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1557299009; cv=none; d=google.com; s=arc-20160816; b=soRfxYNBTQAOr3JiwNlba+P7sPuCUNvetineEMhelsjWx3E5yBtvUvElhFIxSYaTCh cygteF0gMIr17WyJO+AGQDrUZjQU5f34GjZIEs/3lq8GD7+5xFv0FMnDHdXc3GAk0i0Y 1YPIqkhsjaX221y+uL3aURU6Ifs8sIIUaWYmKF9rNKnX4MgPZW+v9IEFVu2KlneOVumf gsT07QJDw8thYWZDgOjEXn9V1VMoY1egaQ520GPevIAcRi4PKANWCgrAfPSiVf1GZZCB FSamoK3r/YxC6/tnbvkY+Jp/TXw5Y3Modf5lb6KkHNAC6hIRCTRblsHE1yYZee+If8bR 7YwA== 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=C++CNoldjI61CwWonnwjfISMzf1XzM82rQmiyk93+nc=; b=OIb/1NYRXiKRNnYAZY0OohbfHoGfcojy48b0h9KSUxsVWX5eE52D3V96duc5zQ3Bw7 J6a6FWmE4sWB/pue8psES2cI3UotmFx8ZTzQhRrQpZaRDM8l4l8JY+4qipVimWbu5HPE 273NDe5IpFAQFXsoet9SHzqe3ZXpluIslC4gv5TTQ57VznMlLPoDEGkwn3ocIJW/LGHz yp1ZBGw7AEhz5nN1MIOInzm2CIIcNGfDibzrs5FSckuX0k79aaMCGDVqvNwEnsDsK0am fteWl8v+Rcu0JNOFDX/q0ud6Raid55afSrx5yeHhrYQsaMWf5vNHarXXTAzFRyacM06W oVLw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-wireless-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-wireless-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 m13si7171696pgh.67.2019.05.08.00.03.03; Wed, 08 May 2019 00:03:29 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-wireless-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-wireless-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-wireless-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 S1726981AbfEHHC4 (ORCPT + 99 others); Wed, 8 May 2019 03:02:56 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:54170 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726877AbfEHHCz (ORCPT ); Wed, 8 May 2019 03:02:55 -0400 Received: from pps.filterd (m0098413.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.27/8.16.0.27) with SMTP id x48724ZC128042 for ; Wed, 8 May 2019 03:02:54 -0400 Received: from e06smtp05.uk.ibm.com (e06smtp05.uk.ibm.com [195.75.94.101]) by mx0b-001b2d01.pphosted.com with ESMTP id 2sbq4h89dq-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 08 May 2019 03:02:53 -0400 Received: from localhost by e06smtp05.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 8 May 2019 08:02:50 +0100 Received: from b06cxnps4075.portsmouth.uk.ibm.com (9.149.109.197) by e06smtp05.uk.ibm.com (192.168.101.135) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Wed, 8 May 2019 08:02:40 +0100 Received: from b06wcsmtp001.portsmouth.uk.ibm.com (b06wcsmtp001.portsmouth.uk.ibm.com [9.149.105.160]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id x4872dLI58195990 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 8 May 2019 07:02:39 GMT Received: from b06wcsmtp001.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C0235A405F; Wed, 8 May 2019 07:02:39 +0000 (GMT) Received: from b06wcsmtp001.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 28D9FA4062; Wed, 8 May 2019 07:02:39 +0000 (GMT) Received: from ozlabs.au.ibm.com (unknown [9.192.253.14]) by b06wcsmtp001.portsmouth.uk.ibm.com (Postfix) with ESMTP; Wed, 8 May 2019 07:02:39 +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 681BEA03BC; Wed, 8 May 2019 17:02:35 +1000 (AEST) From: "Alastair D'Silva" To: alastair@d-silva.org Cc: Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , David Airlie , Daniel Vetter , Dan Carpenter , 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 , David Laight , 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 v2 6/7] lib/hexdump.c: Allow multiple groups to be separated by spaces Date: Wed, 8 May 2019 17:01:46 +1000 X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190508070148.23130-1-alastair@au1.ibm.com> References: <20190508070148.23130-1-alastair@au1.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 x-cbid: 19050807-0020-0000-0000-0000033A6C76 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 19050807-0021-0000-0000-0000218D0BCB Message-Id: <20190508070148.23130-7-alastair@au1.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2019-05-08_05:,, 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=957 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1905080046 Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From: Alastair D'Silva Similar to the previous patch, this patch separates groups by 2 spaces for the hex fields, and 1 space for the ASCII field. 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 | 65 +++++++++++++++++++++++++++++++----------- 2 files changed, 52 insertions(+), 16 deletions(-) diff --git a/include/linux/printk.h b/include/linux/printk.h index dc693aec394c..5231a14e4593 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h @@ -485,6 +485,9 @@ enum { #define HEXDUMP_2_GRP_LINES (1 << 2) #define HEXDUMP_4_GRP_LINES (1 << 3) #define HEXDUMP_8_GRP_LINES (1 << 4) +#define HEXDUMP_2_GRP_SPACES (1 << 5) +#define HEXDUMP_4_GRP_SPACES (1 << 6) +#define HEXDUMP_8_GRP_SPACES (1 << 7) extern int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, char *linebuf, size_t linebuflen, diff --git a/lib/hexdump.c b/lib/hexdump.c index 6f4d1176c332..febd614406d1 100644 --- a/lib/hexdump.c +++ b/lib/hexdump.c @@ -91,9 +91,37 @@ static const char *group_separator(int group, u64 flags) if ((flags & HEXDUMP_2_GRP_LINES) && !((group) % 2)) return "|"; + if ((flags & HEXDUMP_8_GRP_SPACES) && !((group) % 8)) + return " "; + + if ((flags & HEXDUMP_4_GRP_SPACES) && !((group) % 4)) + return " "; + + if ((flags & HEXDUMP_2_GRP_SPACES) && !((group) % 2)) + return " "; + return " "; } +static void separator_parameters(u64 flags, int groupsize, int *sep_chars, + char *sep) +{ + if (flags & (HEXDUMP_2_GRP_LINES | HEXDUMP_2_GRP_SPACES)) + *sep_chars = groupsize * 2; + if (flags & (HEXDUMP_4_GRP_LINES | HEXDUMP_4_GRP_SPACES)) + *sep_chars = groupsize * 4; + if (flags & (HEXDUMP_8_GRP_LINES | HEXDUMP_8_GRP_SPACES)) + *sep_chars = groupsize * 8; + + if (flags & (HEXDUMP_2_GRP_LINES | HEXDUMP_4_GRP_LINES | + HEXDUMP_8_GRP_LINES)) + *sep = '|'; + + if (flags & (HEXDUMP_2_GRP_SPACES | HEXDUMP_4_GRP_SPACES | + HEXDUMP_8_GRP_SPACES)) + *sep = ' '; +} + /** * hex_dump_to_buffer - convert a blob of data to "hex ASCII" in memory * @buf: data blob to dump @@ -107,6 +135,9 @@ static const char *group_separator(int group, u64 flags) * 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 + * HEXDUMP_2_GRP_SPACES: insert a ' ' after every 2 groups + * HEXDUMP_4_GRP_SPACES: insert a ' ' after every 4 groups + * HEXDUMP_8_GRP_SPACES: insert a ' ' after every 8 groups * * hex_dump_to_buffer() works on one "line" of output at a time, converting * bytes of input to hexadecimal (and optionally printable ASCII) @@ -138,7 +169,8 @@ 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; + int sep_chars = 0; + char sep = 0; if (!is_power_of_2(groupsize) || groupsize > 8) groupsize = 1; @@ -152,8 +184,14 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, len = rowsize; ngroups = len / groupsize; + ascii_column = rowsize * 2 + rowsize / groupsize + 1; + // space separators use 2 spaces in the hex output + separator_parameters(flags, groupsize, &sep_chars, &sep); + if (sep == ' ') + ascii_column += rowsize / sep_chars; + if (!linebuflen) goto overflow1; @@ -221,24 +259,17 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, 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 (sep_chars && ((j + 1) < len) && + ((j + 1) % sep_chars == 0)) { if (linebuflen < lx + 2) goto overflow2; - linebuf[lx++] = '|'; + linebuf[lx++] = sep; } } nil: @@ -247,9 +278,11 @@ 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 + - (len - 1) / line_chars : - (groupsize * 2 + 1) * ngroups - 1; + if (flags & HEXDUMP_ASCII) + return ascii_column + len + (len - 1) / sep_chars; + + return groupsize * 2 * ngroups + + ((sep == ' ') ? 2 : 1) * (ngroups - 1); } EXPORT_SYMBOL(hex_dump_to_buffer); @@ -343,9 +376,9 @@ void print_hex_dump_ext(const char *level, const char *prefix_str, /* Worst case line length: * 2 hex chars + space per byte in, 2 spaces, 1 char per byte in, - * 1 char per N groups, NULL + * 2 char per N groups, NULL */ - linebuf_len = rowsize * 3 + 2 + rowsize + rowsize / groupsize + 1; + linebuf_len = rowsize * 3 + 2 + rowsize + 2 * rowsize / groupsize + 1; linebuf = kzalloc(linebuf_len, GFP_KERNEL); if (!linebuf) { printk("%s%shexdump: Could not alloc %u bytes for buffer\n", -- 2.21.0