mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-14 00:47:26 +00:00
common: add a grepenv command
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 <kim.phillips@freescale.com> Cc: Kumar Gala <kumar.gala@freescale.com> Cc: Andy Fleming <afleming@freescale.com>
This commit is contained in:
parent
1fade70203
commit
a000b7950d
5 changed files with 84 additions and 4 deletions
1
README
1
README
|
@ -646,6 +646,7 @@ The following options need to be configured:
|
||||||
CONFIG_CMD_FLASH flinfo, erase, protect
|
CONFIG_CMD_FLASH flinfo, erase, protect
|
||||||
CONFIG_CMD_FPGA FPGA device initialization support
|
CONFIG_CMD_FPGA FPGA device initialization support
|
||||||
CONFIG_CMD_GO * the 'go' command (exec code)
|
CONFIG_CMD_GO * the 'go' command (exec code)
|
||||||
|
CONFIG_CMD_GREPENV * search environment
|
||||||
CONFIG_CMD_HWFLOW * RTS/CTS hw flow control
|
CONFIG_CMD_HWFLOW * RTS/CTS hw flow control
|
||||||
CONFIG_CMD_I2C * I2C serial bus support
|
CONFIG_CMD_I2C * I2C serial bus support
|
||||||
CONFIG_CMD_IDE * IDE harddisk support
|
CONFIG_CMD_IDE * IDE harddisk support
|
||||||
|
|
|
@ -4,7 +4,9 @@
|
||||||
*
|
*
|
||||||
* (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com>
|
* (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com>
|
||||||
* Andreas Heppel <aheppel@sysgo.de>
|
* Andreas Heppel <aheppel@sysgo.de>
|
||||||
|
*
|
||||||
|
* Copyright 2011 Freescale Semiconductor, Inc.
|
||||||
|
*
|
||||||
* See file CREDITS for list of people who contributed to this
|
* See file CREDITS for list of people who contributed to this
|
||||||
* project.
|
* project.
|
||||||
*
|
*
|
||||||
|
@ -160,6 +162,37 @@ int do_env_print (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
return rcode;
|
return rcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_CMD_GREPENV
|
||||||
|
static int do_env_grep (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
|
{
|
||||||
|
ENTRY *match;
|
||||||
|
unsigned char matched[env_htab.size / 8];
|
||||||
|
int rcode = 1, arg = 1, idx;
|
||||||
|
|
||||||
|
if (argc < 2)
|
||||||
|
return cmd_usage(cmdtp);
|
||||||
|
|
||||||
|
memset(matched, 0, env_htab.size / 8);
|
||||||
|
|
||||||
|
while (arg <= argc) {
|
||||||
|
idx = 0;
|
||||||
|
while ((idx = hstrstr_r(argv[arg], idx, &match, &env_htab))) {
|
||||||
|
if (!(matched[idx / 8] & (1 << (idx & 7)))) {
|
||||||
|
puts(match->key);
|
||||||
|
puts("=");
|
||||||
|
puts(match->data);
|
||||||
|
puts("\n");
|
||||||
|
}
|
||||||
|
matched[idx / 8] |= 1 << (idx & 7);
|
||||||
|
rcode = 0;
|
||||||
|
}
|
||||||
|
arg++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rcode;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set a new environment variable,
|
* Set a new environment variable,
|
||||||
* or replace or delete an existing one.
|
* or replace or delete an existing one.
|
||||||
|
@ -829,6 +862,9 @@ static cmd_tbl_t cmd_env_sub[] = {
|
||||||
#if defined(CONFIG_CMD_EXPORTENV)
|
#if defined(CONFIG_CMD_EXPORTENV)
|
||||||
U_BOOT_CMD_MKENT(export, 4, 0, do_env_export, "", ""),
|
U_BOOT_CMD_MKENT(export, 4, 0, do_env_export, "", ""),
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(CONFIG_CMD_GREPENV)
|
||||||
|
U_BOOT_CMD_MKENT(grep, CONFIG_SYS_MAXARGS, 1, do_env_grep, "", ""),
|
||||||
|
#endif
|
||||||
#if defined(CONFIG_CMD_IMPORTENV)
|
#if defined(CONFIG_CMD_IMPORTENV)
|
||||||
U_BOOT_CMD_MKENT(import, 5, 0, do_env_import, "", ""),
|
U_BOOT_CMD_MKENT(import, 5, 0, do_env_import, "", ""),
|
||||||
#endif
|
#endif
|
||||||
|
@ -878,8 +914,11 @@ U_BOOT_CMD(
|
||||||
#if defined(CONFIG_CMD_EDITENV)
|
#if defined(CONFIG_CMD_EDITENV)
|
||||||
"env edit name - edit environment variable\n"
|
"env edit name - edit environment variable\n"
|
||||||
#endif
|
#endif
|
||||||
"env export [-t | -b | -c] addr [size] - export environmnt\n"
|
"env export [-t | -b | -c] addr [size] - export environment\n"
|
||||||
"env import [-d] [-t | -b | -c] addr [size] - import environmnt\n"
|
#if defined(CONFIG_CMD_GREPENV)
|
||||||
|
"env grep string [...] - search environment\n"
|
||||||
|
#endif
|
||||||
|
"env import [-d] [-t | -b | -c] addr [size] - import environment\n"
|
||||||
"env print [name ...] - print environment\n"
|
"env print [name ...] - print environment\n"
|
||||||
#if defined(CONFIG_CMD_RUN)
|
#if defined(CONFIG_CMD_RUN)
|
||||||
"env run var [...] - run commands in an environment variable\n"
|
"env run var [...] - run commands in an environment variable\n"
|
||||||
|
@ -911,6 +950,16 @@ U_BOOT_CMD_COMPLETE(
|
||||||
var_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(
|
U_BOOT_CMD_COMPLETE(
|
||||||
setenv, CONFIG_SYS_MAXARGS, 0, do_env_set,
|
setenv, CONFIG_SYS_MAXARGS, 0, do_env_set,
|
||||||
"set environment variables",
|
"set environment variables",
|
||||||
|
|
|
@ -476,14 +476,15 @@
|
||||||
*/
|
*/
|
||||||
#include <config_cmd_default.h>
|
#include <config_cmd_default.h>
|
||||||
|
|
||||||
|
#define CONFIG_CMD_DHCP
|
||||||
#define CONFIG_CMD_ELF
|
#define CONFIG_CMD_ELF
|
||||||
#define CONFIG_CMD_ERRATA
|
#define CONFIG_CMD_ERRATA
|
||||||
|
#define CONFIG_CMD_GREPENV
|
||||||
#define CONFIG_CMD_IRQ
|
#define CONFIG_CMD_IRQ
|
||||||
#define CONFIG_CMD_I2C
|
#define CONFIG_CMD_I2C
|
||||||
#define CONFIG_CMD_MII
|
#define CONFIG_CMD_MII
|
||||||
#define CONFIG_CMD_PING
|
#define CONFIG_CMD_PING
|
||||||
#define CONFIG_CMD_SETEXPR
|
#define CONFIG_CMD_SETEXPR
|
||||||
#define CONFIG_CMD_DHCP
|
|
||||||
|
|
||||||
#ifdef CONFIG_PCI
|
#ifdef CONFIG_PCI
|
||||||
#define CONFIG_CMD_PCI
|
#define CONFIG_CMD_PCI
|
||||||
|
|
|
@ -80,6 +80,12 @@ extern int hsearch_r(ENTRY __item, ACTION __action, ENTRY ** __retval,
|
||||||
*/
|
*/
|
||||||
extern int hmatch_r(const char *__match, int __last_idx, ENTRY ** __retval,
|
extern int hmatch_r(const char *__match, int __last_idx, ENTRY ** __retval,
|
||||||
struct hsearch_data *__htab);
|
struct hsearch_data *__htab);
|
||||||
|
/*
|
||||||
|
* Search for an entry whose key or data contains `MATCH'. Otherwise,
|
||||||
|
* Same semantics as hsearch_r().
|
||||||
|
*/
|
||||||
|
extern int hstrstr_r(const char *__match, int __last_idx, ENTRY ** __retval,
|
||||||
|
struct hsearch_data *__htab);
|
||||||
|
|
||||||
/* Search and delete entry matching ITEM.key in internal hash table. */
|
/* Search and delete entry matching ITEM.key in internal hash table. */
|
||||||
extern int hdelete_r(const char *__key, struct hsearch_data *__htab);
|
extern int hdelete_r(const char *__key, struct hsearch_data *__htab);
|
||||||
|
|
|
@ -202,6 +202,29 @@ void hdestroy_r(struct hsearch_data *htab)
|
||||||
* example for functions like hdelete().
|
* example for functions like hdelete().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* hstrstr_r - return index to entry whose key and/or data contains match
|
||||||
|
*/
|
||||||
|
int hstrstr_r(const char *match, int last_idx, ENTRY ** retval,
|
||||||
|
struct hsearch_data *htab)
|
||||||
|
{
|
||||||
|
unsigned int idx;
|
||||||
|
|
||||||
|
for (idx = last_idx + 1; idx < htab->size; ++idx) {
|
||||||
|
if (htab->table[idx].used <= 0)
|
||||||
|
continue;
|
||||||
|
if (strstr(htab->table[idx].entry.key, match) ||
|
||||||
|
strstr(htab->table[idx].entry.data, match)) {
|
||||||
|
*retval = &htab->table[idx].entry;
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__set_errno(ESRCH);
|
||||||
|
*retval = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int hmatch_r(const char *match, int last_idx, ENTRY ** retval,
|
int hmatch_r(const char *match, int last_idx, ENTRY ** retval,
|
||||||
struct hsearch_data *htab)
|
struct hsearch_data *htab)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue