[U-Boot] [RFC, PATCH v4 00/16] efi_loader: non-volatile variables support
Heinrich Schuchardt
xypron.glpk at gmx.de
Wed Jul 17 19:05:55 UTC 2019
On 7/17/19 10:25 AM, AKASHI Takahiro wrote:
> # In version 4 of this patch set, the implementation is changed to meet
> # Wolfgang's requirements.
> # I believe that this is NOT intrusive, and that my approach here is NOT
> # selfish at all. If Wolfgang doesn't accept this approach, however,
> # I would like to go for "Plan B" for UEFI variables implementation.
>
> This patch set is an attempt to implement non-volatile attribute for
> UEFI variables. Under the current implementation,
> * SetVariable API doesn't recognize non-volatile attribute
> * While some variables are defined non-volatile in UEFI specification,
> they are NOT marked as non-volatile in the code.
> * env_save() (or "env save" command) allows us to save all the variables
> into persistent storage, but it may cause volatile UEFI variables,
> along with irrelevant U-Boot variables, to be saved unconditionally.
>
> Those observation rationalizes that the implementation of UEFI variables
> should be revamped utilizing dedicated storage for them.
>
> Basic ideas:
> * Each variable may be labelled with a "context." Variables with
> different contexts will be loaded/saved in different storages.
> Currently, we define two contexts:
>
> ENVCTX_UBOOT: U-Boot environment variables
> ENVCTX_UEFI: UEFI variables
>
> * Each variable may have a third attribute, "variable storage."
> There are three new flags defined:
> ('flags' are a bit-wise representation of attributes.)
>
> ENV_FLAGS_VARSTORAGE_VOLATILE: A variable only exists during runtime.
> ENV_FLAGS_VARSTORAGE_NON_VOLATILE: A variable is persistent, but explicit
> "load" and "save" command is required.
> ENV_FLAGS_VARSTORAGE_NON_VOLATILE_AUTOSAVE: A variable is persistent,
> any change will be written back to storage immediately.
>
> * Following those extensions, new interfaces are introduced:
> for hashtable,
> hsearch_r -> hsearch_ext
> hmatch_r -> hmatch_ext
> hdelete_r -> hdelete_ext
> himport_r -> himport_ext
> hexport_r -> hexport_ext
> for env,
> env_save -> env_save_ext
> env_load -> env_load_ext
> env_import -> env_import_ext
> env_export -> env_export_ext
> They will take one or two additional arguments, context and flags,
> comparing with the existing corresponding interfaces.
>
> * Even with those changes, existing interfaces will maintain
> its semantics, as if all the U-Boot environment variables were with
> UEFI_UBOOT context and VARSTORAGE_NON_VOLATILE attribute.
> (The only exception is "env_load()." See below.)
>
> * There is one thing visible to users; *Exported* variables now have
> attribute information, which is appended to variable's name
> in a format of ":xxx"
> For example,
> => printenv
> arch:san=arm
> baudrate:san=115200
> board:san=qemu-arm
> ...
> This information is necessary to preserve attributes across reboot
> (save/load).
>
> * Each environment storage driver must be modified so as to be aware
> of contexts. (See flash and fat in my patch set.)
>
> Known issues/restriction/TODO:
> * Existing interfaces may be marked obsolute or deleted in the future.
>
> * Currently, only flash and fat drivers are modified to support contexts.
> * Currently, only fat driver is modified to support UEFI context.
>
> -> Applying changes to the other drivers is straightforward.
>
> * ENV_IS_NOWHERE doesn't work if we want to disable U-Boot environment,
> but still want to enable UEFI (hence UEFI variables).
>
> -> One solution would be to add *intermediate* configurations
> to set ENV_IS_NOWHERE properly in such a case.
>
> * Any context won't have VARSTORAGE_NON_VOLATILE and
> VARSTORAGE_NON_VOLATILE_AUTOSAVE entries at the same time. This is
> because it will make "save" operation ugly and unnecessarily complicated
> as we discussed in ML.
>
> -> In this sense, NON_VOLATILE[or _AUTOSAVE] should be attributed
> to a context itself.
>
> * env_load() may lose some of compatibility; It now always imports variables
> *without* clearing existing entries (i.e. H_NOCLEAR specified) in order
> to support multiple contexts simultaneously.
>
> -> I have no other good idea to solve this issue.
>
> * Unfortunately, some of existing U-Boot variables seem to be
> "volatile" in nature. For example, we will see errors at boot time:
> ...
> Loading Environment from Flash... OK
> ## Error inserting "fdtcontroladdr" variable, errno=22
> In: pl011 at 9000000
> Out: pl011 at 9000000
> Err: pl011 at 9000000
> ## Error inserting "stdin" variable, errno=22
> ## Error inserting "stdout" variable, errno=22
> ## Error inserting "stderr" variable, errno=22
>
> -> We will have to changes their attributes one-by-one.
> (Those can also be set through ENV_FLAGS_LIST_STATIC in env_flags.h).
>
> * As described above, attribute information is visible to users.
> I'm afraid that it might lead to any incompatibility somewhere.
> (I don't notice any issues though.)
>
> * The whole area of storage will be saved at *every* update of
> one UEFI variable. It should be optimized if possible.
>
> * An error during "save" operation may cause inconsistency between cache
> (hash table) and the storage.
>
> -> This is not UEFI specific though.
>
> * Patch#15 may be unnecessary.
>
> * Add tests if necessary.
>
> Note:
> If we need "secure storage" for UEFI variables, efi_get_variable/
> efi_get_next_variable_name/efi_set_variable() should be completely replaced
> with stub functions to communicate with secure world.
> This patch won't affect such an implementation.
>
> Usage:
> To enable this feature, the following configs must be enabled:
> CONFIG_ENV_IS_IN_FAT
> CONFIG_ENV_FAT_INTERFACE
> CONFIG_ENV_EFI_FAT_DEVICE_AND_PART
> CONFIG_ENV_EFI_FAT_FILE
>
> You can also define a non-volatile variable from command interface:
> => setenv -e -nv FOO baa
>
> Patch#1 to #5 are to add 'context' support to env interfaces.
> Patch#6 to #13 are to add 'variable storage' attribute to env interfaces.
> Patch#14 to #16 are to modify UEFI variable implementation to utilize
> new env interfaces.
>
> Changes in v4 (July 17, 2019)
> * remove already-merged patches
> * revamp after Wolfgang's suggestion
>
> Changes in v3 (June 4, 2019)
> * remove already-merged patches
> * revamp the code again
> * introduce CONFIG_EFI_VARIABLE_USE_ENV for this configuration.
> Once another backing storage, i.e. StMM services for secure boot,
> is supported, another option will be added.
>
> Changes in v2 (Apr 24, 2019)
> * rebased on efi-2019-07
> * revamp the implementation
>
> v1 (Nov 28, 2018)
> * initial
Thanks for all the effort you put into getting this implemented.
Unfortunately the code does not compile after applying patches 1-15 for
sandbox_defconfig:
In file included from include/asm-generic/global_data.h:23,
from ./arch/sandbox/include/asm/global_data.h:18,
from include/dm/of.h:11,
from include/dm/ofnode.h:12,
from include/dm/device.h:13,
from include/dm.h:9,
from drivers/net/mdio_sandbox.c:7:
include/environment.h:158:19: error: ‘CONFIG_ENV_SIZE’ undeclared here
(not in a function); did you mean ‘CONFIG_OF_LIVE’?
#define ENV_SIZE (CONFIG_ENV_SIZE - ENV_HEADER_SIZE)
^~~~~~~~~~~~~~~
include/environment.h:162:21: note: in expansion of macro ‘ENV_SIZE’
unsigned char data[ENV_SIZE]; /* Environment data */
^~~~~~~~
CC drivers/power/domain/sandbox-power-domain.o
Here is another error:
CC cmd/nvedit.o
cmd/nvedit.c: In function ‘do_env_print_ext’:
cmd/nvedit.c:129:13: error: ‘ENVCTX_UEFI’ undeclared (first use in this
function); did you mean ‘ENVCTX_UBOOT’?
if (ctx == ENVCTX_UEFI)
^~~~~~~~~~~
ENVCTX_UBOOT
cmd/nvedit.c:129:13: note: each undeclared identifier is reported only
once for each function it appears in
Please, run Travis CI before resubmitting.
Patch 16 is not based on origin/master and cannot be applied.
I found no adjustments to test/env/*. How will your changes be tested?
Best regards
Heinrich
>
> AKASHI Takahiro (16):
> hashtable: extend interfaces to handle entries with context
> env: extend interfaces to import/export U-Boot environment per context
> env: extend interfaces to label variable with context
> env: flash: add U-Boot environment context support
> env: fat: add U-Boot environment context support
> env: add variable storage attribute support
> env: add/expose attribute helper functions for hashtable
> hashtable: import/export entries with flags
> hashtable: extend hdelete_ext for autosave
> env: save non-volatile variables only
> env: save a context immediately if 'autosave' variable is changed
> env: extend interfaces to get/set attributes
> cmd: env: show variable storage attribute in "env flags" command
> env: fat: support UEFI context
> env,efi_loader: define flags for well-known global UEFI variables
> efi_loader: variable: rework with new extended env interfaces
>
> cmd/nvedit.c | 186 ++++++++++++++++++++++--------
> env/Kconfig | 42 ++++++-
> env/common.c | 82 ++++++++++---
> env/env.c | 92 +++++++++++----
> env/fat.c | 112 +++++++++++++++---
> env/flags.c | 149 +++++++++++++++++++++++-
> env/flash.c | 28 +++--
> include/asm-generic/global_data.h | 7 +-
> include/efi_loader.h | 1 +
> include/env_default.h | 1 +
> include/env_flags.h | 63 +++++++++-
> include/environment.h | 89 ++++++++++++--
> include/exports.h | 4 +
> include/search.h | 16 +++
> lib/efi_loader/Kconfig | 12 ++
> lib/efi_loader/Makefile | 2 +-
> lib/efi_loader/efi_setup.c | 5 +
> lib/efi_loader/efi_variable.c | 50 ++++++--
> lib/hashtable.c | 143 ++++++++++++++++++++---
> 19 files changed, 925 insertions(+), 159 deletions(-)
>
More information about the U-Boot
mailing list