[U-Boot] [PATCH 5/5] New implementation for internal handling of environment variables.

Wolfgang Denk wd at denx.de
Sun Sep 12 21:19:24 CEST 2010


Dear Wolfgang Denk,

In message <1279395948-25864-6-git-send-email-wd at denx.de> you wrote:
> Motivation:
> 
> * Old environment code used a pessimizing implementation:
>   - variable lookup used linear search => slow
>   - changed/added variables were added at the end, i. e. most
>     frequently used variables had the slowest access times => slow
>   - each setenv() would calculate the CRC32 checksum over the whole
>     environment block => slow
> * "redundant" envrionment was locked down to two copies
> * No easy way to implement features like "reset to factory defaults",
>   or to select one out of several pre-defined (previously saved) sets
>   of environment settings ("profiles")
> * No easy way to import or export environment settings
> 
> ======================================================================
> 
> API Changes:
> 
> - Variable names starting with '#' are no longer allowed
> 
>   I didn't find any such variable names being used; it is highly
>   recommended to follow standard conventions and start variable names
>   with an alphanumeric character
> 
> - "printenv" will now print a backslash at the end of all but the last
>   lines of a multi-line variable value.
> 
>   Multi-line variables have never been formally defined, allthough
>   there is no reason not to use them. Now we define rules how to deal
>   with them, allowing for import and export.
> 
> - Function forceenv() and the related code in saveenv() was removed.
>   At the moment this is causing build problems for the only user of
>   this code (schmoogie - which has no entry in MAINTAINERS); may be
>   fixed later by implementing the "env set -f" feature.
> 
> Inconsistencies:
> 
> - "printenv" will '\\'-escape the '\n' in multi-line variables, while
>   "printenv var" will not do that.
> 
> ======================================================================
> 
> Advantages:
> 
> - "printenv" output much better readable (sorted)
> - faster!
> - extendable (additional variable properties can be added)
> - new, powerful features like "factory reset" or easy switching
>   between several different environment settings ("profiles")
> 
> Disadvantages:
> 
> - Image size grows by typically 5...7 KiB (might shrink a bit again on
>   systems with redundant environment with a following patch series)
> 
> ======================================================================
> 
> Implemented:
> 
> - env command with subcommands:
> 
>   - env print [arg ...]
> 
>     same as "printenv": print environment
> 
>   - env set [-f] name [arg ...]
> 
>     same as "setenv": set (and delete) environment variables
> 
>     ["-f" - force setting even for read-only variables - not
>     implemented yet.]
> 
>   - end delete [-f] name
> 
>     not implemented yet
> 
>     ["-f" - force delete even for read-only variables]
> 
>   - env save
> 
>     same as "saveenv": save environment
> 
>   - env export [-t | -b | -c] addr [size]
> 
>     export internal representation (hash table) in formats usable for
>     persistent storage or processing:
> 
> 	-t:	export as text format; if size is given, data will be
> 		padded with '\0' bytes; if not, one terminating '\0'
> 		will be added (which is included in the "filesize"
> 		setting so you can for exmple copy this to flash and
> 		keep the termination).
> 	-b:	export as binary format (name=value pairs separated by
> 		'\0', list end marked by double "\0\0")
> 	-c:	export as checksum protected environment format as
> 		used for example by "saveenv" command
> 	addr:	memory address where environment gets stored
> 	size:	size of output buffer
> 
> 	With "-c" and size is NOT given, then the export command will
> 	format the data as currently used for the persistent storage,
> 	i. e. it will use CONFIG_ENV_SECT_SIZE as output block size and
> 	prepend a valid CRC32 checksum and, in case of resundant
> 	environment, a "current" redundancy flag. If size is given, this
> 	value will be used instead of CONFIG_ENV_SECT_SIZE; again, CRC32
> 	checksum and redundancy flag will be inserted.
> 
> 	With "-b" and "-t", always only the real data (including a
> 	terminating '\0' byte) will be written; here the optional size
> 	argument will be used to make sure not to overflow the user
> 	provided buffer; the command will abort if the size is not
> 	sufficient. Any remainign space will be '\0' padded.
> 
>         On successful return, the variable "filesize" will be set.
>         Note that filesize includes the trailing/terminating '\0'
>         byte(s).
> 
>         Usage szenario: create a text snapshot/backup of the current
> 	settings:
> 
> 		=> env export -t 100000
> 		=> era ${backup_addr} +${filesize}
> 		=> cp.b 100000 ${backup_addr} ${filesize}
> 
> 	Re-import this snapshot, deleting all other settings:
> 
> 		=> env import -d -t ${backup_addr}
> 
>   - env import [-d] [-t | -b | -c] addr [size]
> 
>     import external format (text or binary) into hash table,
>     optionally deleting existing values:
> 
> 	-d:	delete existing environment before importing;
> 		otherwise overwrite / append to existion definitions
> 	-t:	assume text format; either "size" must be given or the
> 		text data must be '\0' terminated
> 	-b:	assume binary format ('\0' separated, "\0\0" terminated)
> 	-c:	assume checksum protected environment format
> 	addr:	memory address to read from
> 	size:	length of input data; if missing, proper '\0'
> 		termination is mandatory
> 
>   - env default -f
> 
>     reset default environment: drop all environment settings and load
>     default environment
> 
>   - env ask name [message] [size]
> 
>     same as "askenv": ask for environment variable
> 
>   - env edit name
> 
>     same as "editenv": edit environment variable
> 
>   - env run
> 
>     same as "run": run commands in an environment variable
> 
> ======================================================================
> 
> TODO:
> 
> - drop default env as implemented now; provide a text file based
>   initialization instead (eventually using several text files to
>   incrementally build it from common blocks) and a tool to convert it
>   into a binary blob / object file.
> 
> - It would be nice if we could add wildcard support for environment
>   variables; this is needed for variable name auto-completion,
>   but it would also be nice to be able to say "printenv ip*" or
>   "printenv *addr*"
> 
> - Some boards don't link any more due to the grown code size:
>   AR405, CANBT, DU405, PMC440, canyonlands, sc3, sequoia, socrates.
> 
> 	=> cc: Matthias Fuchs <matthias.fuchs at esd-electronics.com>,
> 	       Stefan Roese <sr at denx.de>,
> 	       Heiko Schocher <hs at denx.de>
> 
> - Dropping forceenv() causes build problems on schmoogie
> 
> 	=> cc: Sergey Kubushyn <ksi at koi8.net>
> 
> - Build tested on PPC and ARM only; runtime tested with NOR and NAND
>   flash only => needs testing!!
> 
> Signed-off-by: Wolfgang Denk <wd at denx.de>
> Cc: Matthias Fuchs <matthias.fuchs at esd-electronics.com>,
> Cc: Stefan Roese <sr at denx.de>,
> Cc: Heiko Schocher <hs at denx.de>
> Cc: Sergey Kubushyn <ksi at koi8.net>
> ---
>  README                 |    8 +
>  board/zeus/zeus.c      |   25 +--
>  common/cmd_nvedit.c    |  655 +++++++++++++++++++++++++++++++++---------------
>  common/command.c       |    3 +-
>  common/dlmalloc.c      |   25 +-
>  common/env_common.c    |  125 +++++-----
>  common/env_dataflash.c |  114 ++++++----
>  common/env_eeprom.c    |   85 ++++---
>  common/env_flash.c     |  245 ++++++++++---------
>  common/env_mgdisk.c    |   33 +--
>  common/env_nand.c      |  188 ++++++++------
>  common/env_nowhere.c   |   11 +-
>  common/env_nvram.c     |   46 +++-
>  common/env_onenand.c   |   65 +++---
>  common/env_sf.c        |  132 ++++++-----
>  common/exports.c       |    1 -
>  include/environment.h  |    5 +-
>  lib/hashtable.c        |   32 ++-
>  18 files changed, 1094 insertions(+), 704 deletions(-)

Applied to "next" branch.

[With changes as suggested by Matthias Fuchs - thanks!]

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
What is tolerance? -- it is the consequence of humanity. We  are  all
formed  of frailty and error; let us pardon reciprocally each other's
folly -- that is the first law of nature.                  - Voltaire


More information about the U-Boot mailing list