mbox series

[U-Boot,RFC,0/6] efi_loader: support runtime variable access via cache

Message ID 20190605042142.15113-1-takahiro.akashi@linaro.org
Headers show
Series efi_loader: support runtime variable access via cache | expand

Message

AKASHI Takahiro June 5, 2019, 4:21 a.m. UTC
EBBR v1.0 section 2.5.3 says
  Even when SetVariable() is not supported during runtime services,
  firmware should cache variable names and values in EfiRuntimeServicesData
  memory so that GetVariable() and GetNextVeriableName() can behave as
  specified.

This is an experimental patch set and the aim is to enable this feature.

Cache buffer is in the same format as U-Boot environment hash table,
but we cannot use functions in hashtable.c partly because most of U-Boot
code are not available at UEFI runtime and partly because entries in
a table are allocated by malloc(), which are again not available
at UEFI runtime. It is quite painful to modify exiting U-Boot code
so as to make it executable at UEFI runtime.

So I implemented a limited version of hsearch_r(). This may be
a discussion. Given that there are not so many UEFI variables,
we may want to use a simpler table format for caching.

Known issues:
* Currently I test this feature with a test which is temporarily embedded
  in ExitBootServices.
* After SetVirtualAddressMap, it won't work (TODO).
  ConvertPointer was implemented here just for this future work.
* So how can we test the feature?
  We can't use "printenv" command as its relocation won't take place.
* I see some Travis CI errors.
  This is probably due to no storage configured for UEFI variables.

Patch#1 to #4 are preparatory patches.
Patch#5 is mainly for testing.
Patch#6 is core part of this patch set.

AKASHI Takahiro (5):
  efi_loader: runtime: make SetVirtualAddressMap configurable
  efi: add RuntimeServicesSupported variable
  efi_loader: support convert_pointer at runtime
  cmd: efidebug: add "boot exit" sub-command
  efi_loader: variable: support runtime variable access via cache

Alexander Graf (1):
  efi_loader: Patch non-runtime code out at ExitBootServices already

 cmd/efidebug.c                     |  63 ++++
 include/efi_api.h                  |  15 +
 include/efi_loader.h               |  22 ++
 lib/efi_loader/Kconfig             |  24 ++
 lib/efi_loader/efi_boottime.c      |  11 +-
 lib/efi_loader/efi_runtime.c       | 155 ++++++++--
 lib/efi_loader/efi_setup.c         |   5 +
 lib/efi_loader/efi_variable.c      | 467 +++++++++++++++++++++++++++++
 test/py/tests/test_efi_selftest.py |   4 +-
 9 files changed, 735 insertions(+), 31 deletions(-)

Comments

Heinrich Schuchardt June 5, 2019, 10:34 a.m. UTC | #1
On 6/5/19 6:21 AM, AKASHI Takahiro wrote:
> EBBR v1.0 section 2.5.3 says
>   Even when SetVariable() is not supported during runtime services,
>   firmware should cache variable names and values in EfiRuntimeServicesData
>   memory so that GetVariable() and GetNextVeriableName() can behave as
>   specified.
>
> This is an experimental patch set and the aim is to enable this feature.


Hello Takahiro,

thanks a lot for all the effort you put in this.

Reusing parts of env is a valid possibility but I am not sure if this is
the right approach for something that has to work at runtime.

I will need some time to layout my ideas of the design. Unfortunately I
am on a sea kayaking trip this weekend. So I may need until June 16th
for a thorough suggestion.

I have already picked the trivial patches from this patch series and
will put them into the next pull request.

http://git.denx.de/?p=u-boot-efi.git;a=shortlog;h=refs/tags/efi-2019-07-rc4-2

Best regards

Heinich

>
> Cache buffer is in the same format as U-Boot environment hash table,
> but we cannot use functions in hashtable.c partly because most of U-Boot
> code are not available at UEFI runtime and partly because entries in
> a table are allocated by malloc(), which are again not available
> at UEFI runtime. It is quite painful to modify exiting U-Boot code
> so as to make it executable at UEFI runtime.
>
> So I implemented a limited version of hsearch_r(). This may be
> a discussion. Given that there are not so many UEFI variables,
> we may want to use a simpler table format for caching.
>
> Known issues:
> * Currently I test this feature with a test which is temporarily embedded
>   in ExitBootServices.
> * After SetVirtualAddressMap, it won't work (TODO).
>   ConvertPointer was implemented here just for this future work.
> * So how can we test the feature?
>   We can't use "printenv" command as its relocation won't take place.
> * I see some Travis CI errors.
>   This is probably due to no storage configured for UEFI variables.
>
> Patch#1 to #4 are preparatory patches.
> Patch#5 is mainly for testing.
> Patch#6 is core part of this patch set.
>
> AKASHI Takahiro (5):
>   efi_loader: runtime: make SetVirtualAddressMap configurable
>   efi: add RuntimeServicesSupported variable
>   efi_loader: support convert_pointer at runtime
>   cmd: efidebug: add "boot exit" sub-command
>   efi_loader: variable: support runtime variable access via cache
>
> Alexander Graf (1):
>   efi_loader: Patch non-runtime code out at ExitBootServices already
>
>  cmd/efidebug.c                     |  63 ++++
>  include/efi_api.h                  |  15 +
>  include/efi_loader.h               |  22 ++
>  lib/efi_loader/Kconfig             |  24 ++
>  lib/efi_loader/efi_boottime.c      |  11 +-
>  lib/efi_loader/efi_runtime.c       | 155 ++++++++--
>  lib/efi_loader/efi_setup.c         |   5 +
>  lib/efi_loader/efi_variable.c      | 467 +++++++++++++++++++++++++++++
>  test/py/tests/test_efi_selftest.py |   4 +-
>  9 files changed, 735 insertions(+), 31 deletions(-)
>