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 | |
| 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>
| -rw-r--r-- | arch/arm/include/asm/global_data.h | 11 | ||||
| -rw-r--r-- | arch/avr32/include/asm/global_data.h | 3 | ||||
| -rw-r--r-- | arch/blackfin/include/asm/global_data.h | 7 | ||||
| -rw-r--r-- | arch/i386/include/asm/global_data.h | 5 | ||||
| -rw-r--r-- | arch/m68k/include/asm/global_data.h | 5 | ||||
| -rw-r--r-- | arch/microblaze/include/asm/global_data.h | 3 | ||||
| -rw-r--r-- | arch/mips/include/asm/global_data.h | 5 | ||||
| -rw-r--r-- | arch/nios2/include/asm/global_data.h | 3 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/global_data.h | 5 | ||||
| -rw-r--r-- | arch/sh/include/asm/global_data.h | 7 | ||||
| -rw-r--r-- | arch/sparc/include/asm/global_data.h | 7 | ||||
| -rw-r--r-- | common/cmd_nvedit.c | 29 | 
12 files changed, 51 insertions, 39 deletions
| diff --git a/arch/arm/include/asm/global_data.h b/arch/arm/include/asm/global_data.h index 02cfe4584..bd3c3eaf4 100644 --- a/arch/arm/include/asm/global_data.h +++ b/arch/arm/include/asm/global_data.h @@ -1,5 +1,5 @@  /* - * (C) Copyright 2002 + * (C) Copyright 2002-2010   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.   *   * See file CREDITS for list of people who contributed to this @@ -47,13 +47,8 @@ typedef	struct	global_data {  #ifdef CONFIG_FSL_ESDHC  	unsigned long	sdhc_clk;  #endif -#if 0 -	unsigned long	cpu_clk;	/* CPU clock in Hz!		*/ -	unsigned long	bus_clk; -	phys_size_t	ram_size;	/* RAM size */ -	unsigned long	reset_status;	/* reset status register at boot */ -#endif  	void		**jt;		/* jump table */ +	char		env_buf[32];	/* buffer for getenv() before reloc. */  } gd_t;  /* @@ -65,7 +60,7 @@ typedef	struct	global_data {  #define	GD_FLG_POSTFAIL	0x00008		/* Critical POST test failed		*/  #define	GD_FLG_POSTSTOP	0x00010		/* POST seqeunce aborted		*/  #define	GD_FLG_LOGINIT	0x00020		/* Log Buffer has been initialized	*/ -#define GD_FLG_DISABLE_CONSOLE	0x00040		/* Disable console (in & out)	 */ +#define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/  #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8") diff --git a/arch/avr32/include/asm/global_data.h b/arch/avr32/include/asm/global_data.h index efbdda9ba..521a6a2f6 100644 --- a/arch/avr32/include/asm/global_data.h +++ b/arch/avr32/include/asm/global_data.h @@ -46,6 +46,7 @@ typedef	struct	global_data {  	void		*fb_base;	/* framebuffer address */  #endif  	void		**jt;		/* jump table */ +	char		env_buf[32];	/* buffer for getenv() before reloc. */  } gd_t;  /* @@ -57,7 +58,7 @@ typedef	struct	global_data {  #define GD_FLG_POSTFAIL	0x00008		/* Critical POST test failed	 */  #define GD_FLG_POSTSTOP	0x00010		/* POST seqeunce aborted	 */  #define GD_FLG_LOGINIT	0x00020		/* Log Buf has been initialized	 */ -#define GD_FLG_DISABLE_CONSOLE	0x00040		/* Disable console (in & out)	 */ +#define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)	 */  #define DECLARE_GLOBAL_DATA_PTR register gd_t *gd asm("r5") diff --git a/arch/blackfin/include/asm/global_data.h b/arch/blackfin/include/asm/global_data.h index c7099e6da..3cfd00e66 100644 --- a/arch/blackfin/include/asm/global_data.h +++ b/arch/blackfin/include/asm/global_data.h @@ -3,7 +3,7 @@   *   * Copyright (c) 2005-2007 Analog Devices Inc.   * - * (C) Copyright 2000-2004 + * (C) Copyright 2000-2010   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.   *   * See file CREDITS for list of people who contributed to this @@ -53,7 +53,8 @@ typedef struct global_data {  	unsigned long post_init_f_time;	/* When post_init_f started */  #endif -	void **jt;		/* jump table */ +	void	**jt;			/* jump table */ +	char	env_buf[32];		/* buffer for getenv() before reloc. */  } gd_t;  /* @@ -65,7 +66,7 @@ typedef struct global_data {  #define	GD_FLG_POSTFAIL	0x00008	/* Critical POST test failed     */  #define	GD_FLG_POSTSTOP	0x00010	/* POST seqeunce aborted	 */  #define	GD_FLG_LOGINIT	0x00020	/* Log Buf has been initialized	 */ -#define GD_FLG_DISABLE_CONSOLE	0x00040		/* Disable console (in & out)	 */ +#define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)	*/  #define DECLARE_GLOBAL_DATA_PTR     register gd_t * volatile gd asm ("P3") diff --git a/arch/i386/include/asm/global_data.h b/arch/i386/include/asm/global_data.h index 3abbf1dba..adf62915e 100644 --- a/arch/i386/include/asm/global_data.h +++ b/arch/i386/include/asm/global_data.h @@ -1,5 +1,5 @@  /* - * (C) Copyright 2002 + * (C) Copyright 2002-2010   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.   *   * See file CREDITS for list of people who contributed to this @@ -46,6 +46,7 @@ typedef	struct {  	phys_size_t	ram_size;	/* RAM size */  	unsigned long	reset_status;	/* reset status register at boot */  	void		**jt;		/* jump table */ +	char		env_buf[32];	/* buffer for getenv() before reloc. */  } gd_t;  /* @@ -57,7 +58,7 @@ typedef	struct {  #define	GD_FLG_POSTFAIL	0x00008		/* Critical POST test failed		*/  #define	GD_FLG_POSTSTOP	0x00010		/* POST seqeunce aborted		*/  #define	GD_FLG_LOGINIT	0x00020		/* Log Buffer has been initialized	*/ -#define GD_FLG_DISABLE_CONSOLE	0x00040		/* Disable console (in & out)	 */ +#define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/  extern gd_t *gd; diff --git a/arch/m68k/include/asm/global_data.h b/arch/m68k/include/asm/global_data.h index 413c20002..a8578d8a8 100644 --- a/arch/m68k/include/asm/global_data.h +++ b/arch/m68k/include/asm/global_data.h @@ -1,5 +1,5 @@  /* - * (C) Copyright 2002 - 2003 + * (C) Copyright 2002 - 2010   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.   *   * See file CREDITS for list of people who contributed to this @@ -64,6 +64,7 @@ typedef	struct	global_data {  	unsigned long	board_type;  #endif  	void		**jt;		/* Standalone app jump table */ +	char		env_buf[32];	/* buffer for getenv() before reloc. */  } gd_t;  /* @@ -75,7 +76,7 @@ typedef	struct	global_data {  #define	GD_FLG_POSTFAIL	0x00008		/* Critical POST test failed		*/  #define	GD_FLG_POSTSTOP	0x00010		/* POST seqeunce aborted		*/  #define	GD_FLG_LOGINIT	0x00020		/* Log Buffer has been initialized	*/ -#define GD_FLG_DISABLE_CONSOLE	0x00040		/* Disable console (in & out)	 */ +#define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/  #if 0  extern gd_t *global_data; diff --git a/arch/microblaze/include/asm/global_data.h b/arch/microblaze/include/asm/global_data.h index ec7837f6b..c7c1472b2 100644 --- a/arch/microblaze/include/asm/global_data.h +++ b/arch/microblaze/include/asm/global_data.h @@ -43,6 +43,7 @@ typedef	struct	global_data {  	unsigned long	env_valid;	/* Checksum of Environment valid? */  	unsigned long	fb_base;	/* base address of frame buffer */  	void		**jt;		/* jump table */ +	char		env_buf[32];	/* buffer for getenv() before reloc. */  } gd_t;  /* @@ -54,7 +55,7 @@ typedef	struct	global_data {  #define	GD_FLG_POSTFAIL	0x00008		/* Critical POST test failed		*/  #define	GD_FLG_POSTSTOP	0x00010		/* POST seqeunce aborted		*/  #define	GD_FLG_LOGINIT	0x00020		/* Log Buffer has been initialized	*/ -#define GD_FLG_DISABLE_CONSOLE	0x00040		/* Disable console (in & out)	 */ +#define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/  #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r31") diff --git a/arch/mips/include/asm/global_data.h b/arch/mips/include/asm/global_data.h index b2c489115..994e7702e 100644 --- a/arch/mips/include/asm/global_data.h +++ b/arch/mips/include/asm/global_data.h @@ -1,5 +1,5 @@  /* - * (C) Copyright 2002-2003 + * (C) Copyright 2002-2010   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.   *   * See file CREDITS for list of people who contributed to this @@ -46,6 +46,7 @@ typedef	struct	global_data {  	unsigned long	env_addr;	/* Address  of Environment struct */  	unsigned long	env_valid;	/* Checksum of Environment valid? */  	void		**jt;		/* jump table */ +	char		env_buf[32];	/* buffer for getenv() before reloc. */  } gd_t;  /* @@ -57,7 +58,7 @@ typedef	struct	global_data {  #define	GD_FLG_POSTFAIL	0x00008		/* Critical POST test failed	 */  #define	GD_FLG_POSTSTOP	0x00010		/* POST seqeunce aborted	 */  #define	GD_FLG_LOGINIT	0x00020		/* Log Buf has been initialized	 */ -#define GD_FLG_DISABLE_CONSOLE	0x00040		/* Disable console (in & out)	 */ +#define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/  #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("k0") diff --git a/arch/nios2/include/asm/global_data.h b/arch/nios2/include/asm/global_data.h index f1b348293..c292a527e 100644 --- a/arch/nios2/include/asm/global_data.h +++ b/arch/nios2/include/asm/global_data.h @@ -37,6 +37,7 @@ typedef	struct	global_data {  	unsigned long	post_init_f_time; /* When post_init_f started */  #endif  	void		**jt;		/* Standalone app jump table */ +	char		env_buf[32];	/* buffer for getenv() before reloc. */  } gd_t;  /* flags */ @@ -46,7 +47,7 @@ typedef	struct	global_data {  #define	GD_FLG_POSTFAIL	0x00008		/* Critical POST test failed		*/  #define	GD_FLG_POSTSTOP	0x00010		/* POST seqeunce aborted		*/  #define	GD_FLG_LOGINIT	0x00020		/* Log Buffer has been initialized	*/ -#define GD_FLG_DISABLE_CONSOLE	0x00040		/* Disable console (in & out)	 */ +#define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/  #define DECLARE_GLOBAL_DATA_PTR     register gd_t *gd asm ("gp") diff --git a/arch/powerpc/include/asm/global_data.h b/arch/powerpc/include/asm/global_data.h index c854ce948..3e97f7661 100644 --- a/arch/powerpc/include/asm/global_data.h +++ b/arch/powerpc/include/asm/global_data.h @@ -1,5 +1,5 @@  /* - * (C) Copyright 2002 + * (C) Copyright 2002-2010   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.   *   * See file CREDITS for list of people who contributed to this @@ -176,6 +176,7 @@ typedef	struct	global_data {  	unsigned long long wdt_last;	/* trace watch-dog triggering rate */  #endif  	void		**jt;		/* jump table */ +	char		env_buf[32];	/* buffer for getenv() before reloc. */  } gd_t;  /* @@ -187,7 +188,7 @@ typedef	struct	global_data {  #define	GD_FLG_POSTFAIL	0x00008		/* Critical POST test failed		*/  #define	GD_FLG_POSTSTOP	0x00010		/* POST seqeunce aborted		*/  #define	GD_FLG_LOGINIT	0x00020		/* Log Buffer has been initialized	*/ -#define GD_FLG_DISABLE_CONSOLE	0x00040		/* Disable console (in & out)	 */ +#define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/  #if 1  #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r2") diff --git a/arch/sh/include/asm/global_data.h b/arch/sh/include/asm/global_data.h index c12b8558e..7fda1e1b6 100644 --- a/arch/sh/include/asm/global_data.h +++ b/arch/sh/include/asm/global_data.h @@ -1,5 +1,5 @@  /* - * (C) Copyright 2002 + * (C) Copyright 2002-2010   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.   *   * (C) Copyright 2007 @@ -38,7 +38,8 @@ typedef	struct global_data  	unsigned long	env_addr;	/* Address  of Environment struct */  	unsigned long	env_valid;	/* Checksum of Environment valid */  	void		**jt;		/* Standalone app jump table */ -}gd_t; +	char		env_buf[32];	/* buffer for getenv() before reloc. */ +} gd_t;  #define	GD_FLG_RELOC	0x00001		/* Code was relocated to RAM		*/  #define	GD_FLG_DEVINIT	0x00002		/* Devices have been initialized	*/ @@ -46,7 +47,7 @@ typedef	struct global_data  #define	GD_FLG_POSTFAIL	0x00008		/* Critical POST test failed		*/  #define	GD_FLG_POSTSTOP	0x00010		/* POST seqeunce aborted		*/  #define	GD_FLG_LOGINIT	0x00020		/* Log Buffer has been initialized	*/ -#define GD_FLG_DISABLE_CONSOLE	0x00040		/* Disable console (in & out)	 */ +#define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/  #define DECLARE_GLOBAL_DATA_PTR	register gd_t *gd asm ("r13") diff --git a/arch/sparc/include/asm/global_data.h b/arch/sparc/include/asm/global_data.h index dea285727..de6482f51 100644 --- a/arch/sparc/include/asm/global_data.h +++ b/arch/sparc/include/asm/global_data.h @@ -1,5 +1,5 @@  /* - * (C) Copyright 2002 + * (C) Copyright 2002-2010   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.   *   * (C) Copyright 2007 @@ -70,7 +70,8 @@ typedef struct global_data {  #ifdef CONFIG_LWMON  	unsigned long kbd_status;  #endif -	void **jt;		/* jump table */ +	void	**jt;			/* jump table */ +	char	env_buf[32];		/* buffer for getenv() before reloc. */  } gd_t;  /* @@ -82,7 +83,7 @@ typedef struct global_data {  #define	GD_FLG_POSTFAIL	0x00008	/* Critical POST test failed		*/  #define	GD_FLG_POSTSTOP	0x00010	/* POST seqeunce aborted		*/  #define	GD_FLG_LOGINIT	0x00020	/* Log Buffer has been initialized	*/ -#define GD_FLG_DISABLE_CONSOLE	0x00040		/* Disable console (in & out)	 */ +#define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)	*/  #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("%g7") 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) |