From patchwork Mon Apr 4 19:45:18 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kim Phillips X-Patchwork-Id: 89701 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 80AF2B6F8D for ; Tue, 5 Apr 2011 05:45:59 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id C548B280AC; Mon, 4 Apr 2011 21:45:57 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 3Ka7HpT-b4Qy; Mon, 4 Apr 2011 21:45:57 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 83B0C280AE; Mon, 4 Apr 2011 21:45:55 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id AC15A280AE for ; Mon, 4 Apr 2011 21:45:52 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id yXlxl+lx2AUt for ; Mon, 4 Apr 2011 21:45:49 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from ch1outboundpool.messaging.microsoft.com (ch1outboundpool.messaging.microsoft.com [216.32.181.185]) by theia.denx.de (Postfix) with ESMTPS id 7BF83280AC for ; Mon, 4 Apr 2011 21:45:46 +0200 (CEST) Received: from mail122-ch1-R.bigfish.com (216.32.181.171) by CH1EHSOBE002.bigfish.com (10.43.70.52) with Microsoft SMTP Server id 14.1.225.8; Mon, 4 Apr 2011 19:45:43 +0000 Received: from mail122-ch1 (localhost.localdomain [127.0.0.1]) by mail122-ch1-R.bigfish.com (Postfix) with ESMTP id CFEB915A80DC; Mon, 4 Apr 2011 19:45:42 +0000 (UTC) X-SpamScore: 0 X-BigFish: VS0(zzzz1202hzz8275bhz2dh2a8h668h839h61h) X-Spam-TCS-SCL: 0:0 X-Forefront-Antispam-Report: KIP:(null); UIP:(null); IPVD:NLI; H:mail.freescale.net; RD:none; EFVD:NLI Received: from mail122-ch1 (localhost.localdomain [127.0.0.1]) by mail122-ch1 (MessageSwitch) id 1301946333181671_23615; Mon, 4 Apr 2011 19:45:33 +0000 (UTC) Received: from CH1EHSMHS027.bigfish.com (snatpool1.int.messaging.microsoft.com [10.43.68.246]) by mail122-ch1.bigfish.com (Postfix) with ESMTP id 76221E10181; Mon, 4 Apr 2011 19:45:22 +0000 (UTC) Received: from mail.freescale.net (70.37.183.190) by CH1EHSMHS027.bigfish.com (10.43.70.27) with Microsoft SMTP Server (TLS) id 14.1.225.8; Mon, 4 Apr 2011 19:45:20 +0000 Received: from az33smr02.freescale.net (10.64.34.200) by 039-SN1MMR1-002.039d.mgd.msft.net (10.84.1.15) with Microsoft SMTP Server id 14.1.270.2; Mon, 4 Apr 2011 14:45:19 -0500 Received: from widmer (widmer.am.freescale.net [10.82.123.5]) by az33smr02.freescale.net (8.13.1/8.13.0) with SMTP id p34JjJ5R018174; Mon, 4 Apr 2011 14:45:19 -0500 (CDT) Date: Mon, 4 Apr 2011 14:45:18 -0500 From: Kim Phillips To: Mike Frysinger , Wolfgang Denk Message-ID: <20110404144518.41716465.kim.phillips@freescale.com> In-Reply-To: References: <20110401174658.eaa8d773.kim.phillips@freescale.com> Organization: Freescale Semiconductor, Inc. X-Mailer: Sylpheed 3.0.2 (GTK+ 2.20.1; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-OriginatorOrg: freescale.com Cc: u-boot@lists.denx.de, Kumar Gala , Andy@theia.denx.de, Fleming Subject: [U-Boot] [PATCH v3] common: add a grepenv command X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.9 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de u-boot environments, esp. when boards are shared across multiple users, can get pretty large and time consuming to visually parse. The grepenv command this patch adds can be used in lieu of printenv to facilitate searching. grepenv works like printenv but limits its output only to environment strings (variable name and value pairs) that match the user specified substring. the following examples are on a board with a 5313 byte environment that spans multiple screen pages: Example 1: summarize ethernet configuration: => grepenv eth TSEC etact=FM1@DTSEC2 eth=FM1@DTSEC4 ethact=FM1@DTSEC2 eth1addr=00:E0:0C:00:8b:01 eth2addr=00:E0:0C:00:8b:02 eth3addr=00:E0:0C:00:8b:03 eth4addr=00:E0:0C:00:8b:04 eth5addr=00:E0:0C:00:8b:05 eth6addr=00:E0:0C:00:8b:06 eth7addr=00:E0:0C:00:8b:07 eth8addr=00:E0:0C:00:8b:08 eth9addr=00:E0:0C:00:8b:09 ethaddr=00:E0:0C:00:8b:00 netdev=eth0 uprcw=setenv ethact $eth;setenv filename p4080ds/R_PPSXX_0xe/rcw_0xe_2sgmii_rev2_high.bin;setenv start 0xe8000000;protect off all;run upimage;protect on all upuboot=setenv ethact $eth;setenv filename u-boot.bin;setenv start eff80000;protect off all;run upimage;protect on all upucode=setenv ethact $eth;setenv filename fsl_fman_ucode_P4080_101_6.bin;setenv start 0xef000000;protect off all;run upimage;protect on all usdboot=setenv ethact $eth;tftp 1000000 $dir/$bootfile;tftp 2000000 $dir/initramfs.cpio.gz.uboot;tftp c00000 $dir/p4080ds-usdpaa.dtb;setenv bootargs root=/dev/ram rw console=ttyS0,115200 $othbootargs;bootm 1000000 2000000 c00000; => Example 2: detect unused env vars: => grepenv etact etact=FM1@DTSEC2 => Example 3: reveal hardcoded variables; e.g., for fdtaddr: => grepenv fdtaddr fdtaddr=c00000 nfsboot=setenv bootargs root=/dev/nfs rw nfsroot=$serverip:$rootpath ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off console=$consoledev,$baudrate $othbootargs;tftp $loadaddr $bootfile;tftp $fdtaddr $fdtfile;bootm $loadaddr - $fdtaddr ramboot=setenv bootargs root=/dev/ram rw console=$consoledev,$baudrate $othbootargs;tftp $ramdiskaddr $ramdiskfile;tftp $loadaddr $bootfile;tftp $fdtaddr $fdtfile;bootm $loadaddr $ramdiskaddr $fdtaddr => grep $fdtaddr fdtaddr=c00000 my_boot=bootm 0x40000000 0x41000000 0x00c00000 my_dtb=tftp 0x00c00000 $prefix/p4080ds.dtb nohvboot=tftp 1000000 $dir/$bootfile;tftp 2000000 $dir/$ramdiskfile;tftp c00000 $dir/$fdtfile;setenv bootargs root=/dev/ram rw ramdisk_size=0x10000000 console=ttyS0,115200;bootm 1000000 2000000 c00000; => This patch also enables the grepenv command by default on corenet_ds based boards (and repositions the DHCP command entry to keep the list sorted). Signed-off-by: Kim Phillips Cc: Kumar Gala Cc: Andy Fleming --- v2: rebase v3: address comments from Mike Frysinger, Wolfgang Denk: - hexport first, so as to always get current environment - handle multiple strings per invocation, in an OR fashion, uniquify output - add a proper #ifdef like CONFIG_CMD_GREPENV, only enabled by default on corenet_ds systems - don't use dubious CONFIG_SYS_CBSIZE - use hexported memory - assign index variables better names than i,j,k. - provide usage examples in commit text - add copyright README | 1 + common/cmd_nvedit.c | 70 +++++++++++++++++++++++++++++++++++++++++- include/configs/corenet_ds.h | 3 +- 3 files changed, 72 insertions(+), 2 deletions(-) diff --git a/README b/README index 21cd71b..a66ce73 100644 --- a/README +++ b/README @@ -643,6 +643,7 @@ The following options need to be configured: CONFIG_CMD_FDOS * Dos diskette Support CONFIG_CMD_FLASH flinfo, erase, protect CONFIG_CMD_FPGA FPGA device initialization support + CONFIG_CMD_GREPENV * search environment CONFIG_CMD_HWFLOW * RTS/CTS hw flow control CONFIG_CMD_I2C * I2C serial bus support CONFIG_CMD_IDE * IDE harddisk support diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c index fb69c24..2eb0a6d 100644 --- a/common/cmd_nvedit.c +++ b/common/cmd_nvedit.c @@ -4,7 +4,9 @@ * * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH * Andreas Heppel - + * + * Copyright 2011 Freescale Semiconductor, Inc. + * * See file CREDITS for list of people who contributed to this * project. * @@ -160,6 +162,62 @@ int do_env_print (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return rcode; } +#ifdef CONFIG_CMD_GREPENV +static int do_env_grep (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + char *searchstr, *res = NULL; + int len, envidx, beginline, lineidx, matchidx; + int rcode = 1; + + if (argc < 2) { + cmd_usage(cmdtp); + return 1; + } + + len = hexport_r(&env_htab, '\0', &res, 0); + + while (--argc) { + envidx = 0; beginline = 0; lineidx = 0; matchidx = 0; + searchstr = argv[argc]; + + /* find and print matching env vars */ + do { + if (res[lineidx] == searchstr[matchidx]) { + matchidx++; + if (searchstr[matchidx] == '\0') { + /* match complete */ + rcode = 0; + puts(&res[beginline]); + puts("\n"); + /* uniquify multiple argv hits */ + while (res[beginline]) + res[beginline++] = '\0'; + envidx = beginline; + lineidx = envidx + 1; + beginline = lineidx; + matchidx = 0; + } else + lineidx++; + } else { + matchidx = 0; + if (res[lineidx] == '\0') { + lineidx = envidx + 1; + beginline = lineidx; + if (ctrlc()) + return -1; + } else + lineidx++; + } + envidx++; + } while (envidx < len); + } + + free(res); + + return rcode; +} +#endif + /* * Set a new environment variable, * or replace or delete an existing one. @@ -903,6 +961,16 @@ U_BOOT_CMD_COMPLETE( var_complete ); +#ifdef CONFIG_CMD_GREPENV +U_BOOT_CMD_COMPLETE( + grepenv, CONFIG_SYS_MAXARGS, 0, do_env_grep, + "search environment variables", + "string ...\n" + " - list environment name=value pairs matching 'string'", + var_complete +); +#endif + U_BOOT_CMD_COMPLETE( setenv, CONFIG_SYS_MAXARGS, 0, do_env_set, "set environment variables", diff --git a/include/configs/corenet_ds.h b/include/configs/corenet_ds.h index bff212e..53facf2 100644 --- a/include/configs/corenet_ds.h +++ b/include/configs/corenet_ds.h @@ -473,14 +473,15 @@ */ #include +#define CONFIG_CMD_DHCP #define CONFIG_CMD_ELF #define CONFIG_CMD_ERRATA +#define CONFIG_CMD_GREPENV #define CONFIG_CMD_IRQ #define CONFIG_CMD_I2C #define CONFIG_CMD_MII #define CONFIG_CMD_PING #define CONFIG_CMD_SETEXPR -#define CONFIG_CMD_DHCP #ifdef CONFIG_PCI #define CONFIG_CMD_PCI