diff options
| author | Wolfgang Denk <wd@denx.de> | 2010-07-24 20:22:02 +0200 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2010-09-19 19:29:48 +0200 | 
| commit | 91a76751a090bf43c166fda0815c9b5b2bfccbe9 (patch) | |
| tree | 08a984591270e574bcda8c2cd28bd4c6351c7b46 /common/cmd_nvedit.c | |
| parent | 6d014adfa2ac4b1151d2b80a6943f59c3e254239 (diff) | |
| download | olio-uboot-2014.01-91a76751a090bf43c166fda0815c9b5b2bfccbe9.tar.xz olio-uboot-2014.01-91a76751a090bf43c166fda0815c9b5b2bfccbe9.zip | |
Make getenv() work before relocation.
So far, getenv() would work before relocation is most cases, even
though it was not intended to be used that way.  When switching to a
hash table based implementation, this would break a number of boards.
For convenience, we make getenv() check if it's running before
relocation and, if so, use getenv_f() internally.
Note that this is limited to simple cases, as we use a small static
buffer (32 bytes) in the global data for this purpose.
For this reason, it is also not a good idea to convert all current
uses of getenv_f() into getenv() - some of the existing use cases need
to be able to deal with longer variable values, so getenv_f() is still
needed and recommended for use before relocation.
Signed-off-by: Wolfgang Denk <wd@denx.de>
Diffstat (limited to 'common/cmd_nvedit.c')
| -rw-r--r-- | common/cmd_nvedit.c | 29 | 
1 files changed, 18 insertions, 11 deletions
| diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c index dc15750b6..74a506979 100644 --- a/common/cmd_nvedit.c +++ b/common/cmd_nvedit.c @@ -511,24 +511,31 @@ int do_editenv(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  char *getenv (char *name)  { -	int i, nxt; +	if (gd->flags & GD_FLG_RELOC) {	/* full C runtime after reloc */ +		int i, nxt; -	WATCHDOG_RESET(); +		WATCHDOG_RESET(); -	for (i=0; env_get_char(i) != '\0'; i=nxt+1) { -		int val; +		for (i=0; env_get_char(i) != '\0'; i=nxt+1) { +			int val; -		for (nxt=i; env_get_char(nxt) != '\0'; ++nxt) { -			if (nxt >= CONFIG_ENV_SIZE) { -				return (NULL); +			for (nxt=i; env_get_char(nxt) != '\0'; ++nxt) { +				if (nxt >= CONFIG_ENV_SIZE) { +					return (NULL); +				}  			} +			if ((val=envmatch((uchar *)name, i)) < 0) +				continue; +			return ((char *)env_get_addr(val));  		} -		if ((val=envmatch((uchar *)name, i)) < 0) -			continue; -		return ((char *)env_get_addr(val)); + +		return (NULL);  	} -	return (NULL); +	/* restricted C runtime before reloc */ + +	return ((getenv_f(name,gd->env_buf,sizeof(gd->env_buf)) > 0) ? +		gd->env_buf : NULL);  }  int getenv_f(char *name, char *buf, unsigned len) |