[PATCH] efi_loader: Avoid emitting efi_var_buf to .GOT

Ilias Apalodimas ilias.apalodimas at linaro.org
Fri Jan 15 20:11:07 CET 2021


Hi Heinrich, 

[...]
> > Atish can you give it a spin and let me know if this fixes the issue for you?
> > The objdump seems to be correct now, but I am not familiar with RISC-V.
> > No regressions on Arm with TEE or memory backed variables.
> >  include/efi_variable.h            | 12 ++++++++++++
> >  lib/efi_loader/efi_var_mem.c      | 12 +++++++++++-
> >  lib/efi_loader/efi_variable_tee.c |  2 +-
> >  3 files changed, 24 insertions(+), 2 deletions(-)
> >
> > diff --git a/include/efi_variable.h b/include/efi_variable.h
> > index 4704a3c16e65..b2317eb7bf1c 100644
> > --- a/include/efi_variable.h
> > +++ b/include/efi_variable.h
> > @@ -306,4 +306,16 @@ efi_status_t __efi_runtime EFIAPI
> >  efi_get_next_variable_name_runtime(efi_uintn_t *variable_name_size,
> >  				   u16 *variable_name, efi_guid_t *guid);
> >
> > +/**
> > + * efi_var_buf_update() - Update the value of efi_var_buf in efi_var_mem.c
> 
> Dear Ilias,
> 
> thank you for addressing this problem. The code looks fine to me. Just
> some ideas concerning comment lines:

Well, I broke it to begin with so ...

> 
> The value of efi_var_buf is the address it is pointing to. So i would
> prefer:
> 
> efi_var_buf_update() - udpate memory buffer for variables
> 
> > + *
> > + * @var_buf:	Source buffer
> 
> %s/Source/source/
> 

Ok

> > + *
> > + * efi_var_buf is special since we use it on Runtime Services. We need
> > + * to keep it static in efi_var_mem.c and avoid having it pulled into
> > + * .GOT. Since it has to be static this function must be used to update
> 
> You already place a comment about .GOT where the declaration is. Here
> describing how the function is used would be of interest. E.g.
> 
> "This function copies to the memory buffer for UEFI variables. Call this
> function in ExitBootServices() if memory backed variables are only used
> at runtime to fill the buffer."
> 

I'll replace it. Guess I was too concerned pointing out "Don't touch efi_var_buf"

> > + * it
> > + */
> > +void efi_var_buf_update(struct efi_var_file *var_buf);
> > +
> >  #endif
> > diff --git a/lib/efi_loader/efi_var_mem.c b/lib/efi_loader/efi_var_mem.c
> > index d155f25f60e6..fcf0043b5d3b 100644
> > --- a/lib/efi_loader/efi_var_mem.c
> > +++ b/lib/efi_loader/efi_var_mem.c
> > @@ -10,7 +10,12 @@
> >  #include <efi_variable.h>
> >  #include <u-boot/crc.h>
> >
> > -struct efi_var_file __efi_runtime_data *efi_var_buf;
> > +/*
> > + * keep efi_var_buf as static , moving it out might move it to .got
> > + * which is not mapped in virtual address for Linux. Whenever
> > + * we try to invoke get_variable service, it will panic.
> 
> Not everybody will know the abbreviation .got. How about:
> 
> "The variables efi_var_file and efi_var_entry must be static to avoid
> that they are referenced via the global offset table (section .got). The
> GOT is neither mapped as EfiRuntimeServicesData nor do we support its
> relocation during SetVirtualAddressMap()."
> 

Sure

> Otherwise

I'll wait for Atish to verify it fixes RISC-V, because it makes no difference
whatsoever in arm and send a v2. 

Thanks
/Ilias
> 
> Reviewed-by: Heinrich Schuchardt <xypron.glpk at gmx.de>

[...]


More information about the U-Boot mailing list