summaryrefslogtreecommitdiffstats
path: root/common/cmd_nvedit.c
diff options
context:
space:
mode:
authorWolfgang Denk <wd@denx.de>2010-07-24 20:22:02 +0200
committerWolfgang Denk <wd@denx.de>2010-09-19 19:29:48 +0200
commit91a76751a090bf43c166fda0815c9b5b2bfccbe9 (patch)
tree08a984591270e574bcda8c2cd28bd4c6351c7b46 /common/cmd_nvedit.c
parent6d014adfa2ac4b1151d2b80a6943f59c3e254239 (diff)
downloadu-boot-91a76751a090bf43c166fda0815c9b5b2bfccbe9.tar.gz
u-boot-91a76751a090bf43c166fda0815c9b5b2bfccbe9.tar.xz
u-boot-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.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c
index dc15750b64..74a506979d 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)