[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