[PATCH v2 27/28] efi_loader: Don't try to add sandbox runtime code

Simon Glass sjg at chromium.org
Thu Nov 28 20:10:45 CET 2024


Hi Heinrich,

On Thu, 28 Nov 2024 at 10:43, Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>
> On 28.11.24 16:47, Simon Glass wrote:
> > This cannot work since the code is not present in the emulated memory.
> > In any case, sandbox cannot make use of the runtime code.
>
> For sure an EFI application running on the sandbox can run
> ExitBootServices() and then call the ResetSystem() runtime system service.
>
> Have a look at
>
> arch/sandbox/cpu/start.c:472:
> void __efi_runtime EFIAPI efi_reset_system().
>
> __efi_runtime implements ResetSystem() after ExitBootServices().
>
> >
> > For now, just drop it from sandbox. We can always adjust things to copy
> > it into memory, if needed.
> >
> > Signed-off-by: Simon Glass <sjg at chromium.org>
> > ---
> >
> > (no changes since v1)
> >
> >   lib/efi_loader/efi_memory.c | 26 ++++++++++++++++----------
> >   1 file changed, 16 insertions(+), 10 deletions(-)
> >
> > diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
> > index a33c025fa20..796fa99f4fb 100644
> > --- a/lib/efi_loader/efi_memory.c
> > +++ b/lib/efi_loader/efi_memory.c
> > @@ -755,16 +755,22 @@ static void add_u_boot_and_runtime(void)
> >       runtime_mask = SZ_64K - 1;
> >   #endif
> >
> > -     /*
> > -      * Add Runtime Services. We mark surrounding boottime code as runtime as
> > -      * well to fulfill the runtime alignment constraints but avoid padding.
> > -      */
> > -     runtime_start = (uintptr_t)__efi_runtime_start & ~runtime_mask;
> > -     runtime_end = (uintptr_t)__efi_runtime_stop;
> > -     runtime_end = (runtime_end + runtime_mask) & ~runtime_mask;
> > -     runtime_pages = (runtime_end - runtime_start) >> EFI_PAGE_SHIFT;
> > -     efi_add_memory_map_pg(runtime_start, runtime_pages,
> > -                           EFI_RUNTIME_SERVICES_CODE, false);
> > +     if (!IS_ENABLED(CONFIG_SANDBOX)) {
> > +             /*
> > +              * Add Runtime Services. We mark surrounding boottime code as
> > +              * runtime as well to fulfill the runtime alignment constraints
> > +              * but avoid padding.
> > +              *
> > +              * This is not enabled for sandbox, since we cannot map the
> > +              * sandbox code into emulated SDRAM
>
> The memory map is consumed by an EFI application like shim, GRUB, or the
> kernel stub.
>
> The memory map entries must take address values which can be used a
> void* without conversion. This is true both on real systems and on the
> sandbox.
>
> Isn't __efi_runtime_start a pointer to the start of the efi_runtime code
> section on the sandbox?

Yes, but it is not mapped into the emulated RAM, so it doesn't have an
address. Yes, we can get a pointer to it, but it isn't in the memory
map. So there is no way to add it to EFI's tables in a sensible
fashion.

A lot of the bugs fixed in this series were the result of the EFI
sandbox test finally landing, after a year of being ignored and
blocked. I am sure we will find more.

Regards,
Simon


More information about the U-Boot mailing list