On Tue, 11 Feb 2025 at 11:01, Mark Kettenis <mark.kette...@xs4all.nl> wrote:
>
> > From: Ilias Apalodimas <ilias.apalodi...@linaro.org>
> > Date: Tue, 11 Feb 2025 10:50:01 +0000
> >
> > Hi Mark,
> >
> > On Tue, 11 Feb 2025 at 10:17, Mark Kettenis <mark.kette...@xs4all.nl> wrote:
> > >
> > > > From: Ilias Apalodimas <ilias.apalodi...@linaro.org>
> > > >
> > > > On EFI runtime services, we manage to preserve string literals
> > > > by placing the .efi_runtime section just before .data and preserving
> > > > it when fixing up the runtime memory by marking surrounding boottime
> > > > code as runtime. This is ok for now but will break if we update any
> > > > linker scripts and decouple .text and .runtime sections.
> > > >
> > > > So let's define the strings we used to compare in the stack for
> > > > runtime services
> > >
> > > I don't see how this helps you.  Those string literals still need to
> > > be copied into the stack variable from somewhere and I don't think
> > > that with this changes where that source string literal lives...
> > >
> > > I think you need toput the string in a global variable with an
> > > appropriate __attribute__ that puts it into .runtime.
> >
> > The asm I am seeing is setting this up on the stack
> >
> >   c29c0:       d2800ac1        mov     x1, #0x56                       // 
> > #86
> > {
> >    c29c4:       a9ba7bfd        stp     x29, x30, [sp, #-96]!
> >         const u16 t[] = u"VarToFile";
> >    c29c8:       f2a00c21        movk    x1, #0x61, lsl #16
> >    c29cc:       f2c00e41        movk    x1, #0x72, lsl #32
> > {
> >    c29d0:       910003fd        mov     x29, sp
> >         const u16 t[] = u"VarToFile";
> >    c29d4:       f2e00a81        movk    x1, #0x54, lsl #48
> >    c29d8:       f90027e1        str     x1, [sp, #72]
> >    c29dc:       d2800de1        mov     x1, #0x6f                       // 
> > #111
> > {
> >    c29e0:       a90153f3        stp     x19, x20, [sp, #16]
> >         const u16 t[] = u"VarToFile";
> >    c29e4:       f2a008c1        movk    x1, #0x46, lsl #16
> >    c29e8:       f2c00d21        movk    x1, #0x69, lsl #32
> > {
> >    c29ec:       a9025bf5        stp     x21, x22, [sp, #32]
> >         const u16 t[] = u"VarToFile";
> >    c29f0:       f2e00d81        movk    x1, #0x6c, lsl #48
> > {
> >    c29f4:       f9001bf7        str     x23, [sp, #48]
> >         const u16 t[] = u"VarToFile";
> >    c29f8:       f9002be1        str     x1, [sp, #80]
> >    c29fc:       52800ca1        mov     w1, #0x65                       // 
> > #101
> >    c2a00:       b9005be1        str     w1, [sp, #88]
> >         if (!variable_name || !vendor || !data_size)
> >
>
> Oh clever!  It basically uses a bunch of mov instructions to create
> the string on the stack.

Yep, but this is just me saying "I tested it before posting it!".
We do need to make this arch agnostic.

> > While the older code is doing
> >
> >   if (!u16_strcmp(variable_name, u"VarToFile"))
> >      a88:       90000001        adrp    x1, 0 <__image_copy_start>
> >
> >
> > But I think that's very arm and compiler-specific, so I'll change it
> > to what you and Heinrich suggested
>
> Possibly even depends on the optimization options you use.

PIE perhaps?

Anyway. I'll wait a day or two in case anyone else has comments and send a v2

Thanks for taking a look
/Ilias
>  And it
> would almost certainly not do this if the string was longer.  So yes,
> Heinrich's suggestion is probably the way to go.
>
> >
> > Thanks
> > /Ilias
> > >
> > > > Signed-off-by: Ilias Apalodimas <ilias.apalodi...@linaro.org>
> > > > ---
> > > >  lib/efi_loader/efi_var_mem.c      | 3 ++-
> > > >  lib/efi_loader/efi_variable_tee.c | 3 ++-
> > > >  2 files changed, 4 insertions(+), 2 deletions(-)
> > > >
> > > > diff --git a/lib/efi_loader/efi_var_mem.c b/lib/efi_loader/efi_var_mem.c
> > > > index b265d95dd6ba..985e0baa128d 100644
> > > > --- a/lib/efi_loader/efi_var_mem.c
> > > > +++ b/lib/efi_loader/efi_var_mem.c
> > > > @@ -310,6 +310,7 @@ efi_get_variable_mem(const u16 *variable_name, 
> > > > const efi_guid_t *vendor,
> > > >  {
> > > >       efi_uintn_t old_size;
> > > >       struct efi_var_entry *var;
> > > > +     u16 vtf[] = u"VarToFile";
> > > >       u16 *pdata;
> > > >
> > > >       if (!variable_name || !vendor || !data_size)
> > > > @@ -331,7 +332,7 @@ efi_get_variable_mem(const u16 *variable_name, 
> > > > const efi_guid_t *vendor,
> > > >       if (timep)
> > > >               *timep = var->time;
> > > >
> > > > -     if (!u16_strcmp(variable_name, u"VarToFile"))
> > > > +     if (!u16_strcmp(variable_name, vtf))
> > > >               return efi_var_collect_mem(data, data_size, 
> > > > EFI_VARIABLE_NON_VOLATILE);
> > > >
> > > >       old_size = *data_size;
> > > > diff --git a/lib/efi_loader/efi_variable_tee.c 
> > > > b/lib/efi_loader/efi_variable_tee.c
> > > > index 0d090d051dd4..8d173e58d2f7 100644
> > > > --- a/lib/efi_loader/efi_variable_tee.c
> > > > +++ b/lib/efi_loader/efi_variable_tee.c
> > > > @@ -780,6 +780,7 @@ efi_status_t efi_set_variable_int(const u16 
> > > > *variable_name,
> > > >       efi_uintn_t payload_size;
> > > >       efi_uintn_t name_size;
> > > >       u8 *comm_buf = NULL;
> > > > +     u16 pk[] = u"PK";
> > > >       bool ro;
> > > >
> > > >       if (!variable_name || variable_name[0] == 0 || !vendor) {
> > > > @@ -858,7 +859,7 @@ efi_status_t efi_set_variable_int(const u16 
> > > > *variable_name,
> > > >       if (alt_ret != EFI_SUCCESS)
> > > >               goto out;
> > > >
> > > > -     if (!u16_strcmp(variable_name, u"PK"))
> > > > +     if (!u16_strcmp(variable_name, pk))
> > > >               alt_ret = efi_init_secure_state();
> > > >  out:
> > > >       free(comm_buf);
> > > > --
> > > > 2.43.0
> > > >
> > > >
> >

Reply via email to