On Tue, Jul 25, 2017 at 4:10 AM, Alexander Graf <ag...@suse.de> wrote: > > > On 25.07.17 01:47, Rob Clark wrote: >> >> To implement efi_load_image() for the case of loading an image from a >> device path rather than image already loaded into source_buffer, it is >> convenient to be able to re-use simple-file-system and efi-file >> interfaces. But these are already using EFI_ENTER()/EFI_EXIT(). Allow >> entry into EFI interfaces to be recursive, since this greatly simplifies >> things. >> >> (And hypothetically this would be needed anyways to allow grub to call >> into interfaces installed by something outside of grub.) >> >> Signed-off-by: Rob Clark <robdcl...@gmail.com> > > > So there are 2 ways to do this: > > 1) Keep a refcount, only transition when passing the 0 level > 2) Explicitly split functions with ENTRY/EXIT from their core functions > > So far we used approach 2, splitting functions that are used by both > internal and external code into _ext (for externally called) and normal > functions. You can see this pattern quite a few times throughout efi_loader. > > I definitely did try the refcount approach back when I decided for approach > 2 and it failed on me in some case, but I can't remember where. > > Either way, we should definitely be consistent. Either we always use > refcounting or we shouldn't bother with it. So if you can make a version > work where all _ext variants disappear and we're magically reentrant, I'll > be happy to take that. I'm fairly sure it'll break somewhere though :). >
for load_image via file-path, we end up needing a *bunch* of functions normally called via EFI.. so it is going to be a lot more _ext variants. BR, -R > > Alex > > >> --- >> lib/efi_loader/efi_boottime.c | 5 +++++ >> 1 file changed, 5 insertions(+) >> >> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c >> index 8735b1f418..a113124708 100644 >> --- a/lib/efi_loader/efi_boottime.c >> +++ b/lib/efi_loader/efi_boottime.c >> @@ -47,6 +47,7 @@ static struct efi_configuration_table __efi_runtime_data >> efi_conf_table[2]; >> * EFI callback entry/exit. >> */ >> static volatile void *efi_gd, *app_gd; >> +static int entry_level = 0; >> #endif >> /* Called from do_bootefi_exec() */ >> @@ -61,6 +62,8 @@ void efi_save_gd(void) >> void efi_restore_gd(void) >> { >> #ifdef CONFIG_ARM >> + if (entry_level++) >> + return; >> /* Only restore if we're already in EFI context */ >> if (!efi_gd) >> return; >> @@ -75,6 +78,8 @@ void efi_restore_gd(void) >> efi_status_t efi_exit_func(efi_status_t ret) >> { >> #ifdef CONFIG_ARM >> + if (--entry_level) >> + return ret; >> gd = app_gd; >> #endif >> _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot