[External] Re: [PATCH 3/3] efistub: fix missed the initialization of gp
Ard Biesheuvel
ardb at kernel.org
Wed Mar 6 05:09:07 PST 2024
On Wed, 6 Mar 2024 at 14:02, Ard Biesheuvel <ardb at kernel.org> wrote:
>
> On Wed, 6 Mar 2024 at 13:34, yunhui cui <cuiyunhui at bytedance.com> wrote:
> >
> > Hi Ard,
> >
> > On Wed, Mar 6, 2024 at 5:36 PM Ard Biesheuvel <ardb at kernel.org> wrote:
> > >
> > > On Wed, 6 Mar 2024 at 09:56, Yunhui Cui <cuiyunhui at bytedance.com> wrote:
> > > >
> > > > Compared with gcc version 12, gcc version 13 uses the gp
> > > > register for compilation optimization, but the efistub module
> > > > does not initialize gp.
> > > >
> > > > Signed-off-by: Yunhui Cui <cuiyunhui at bytedance.com>
> > > > Co-Developed-by: Zhipeng Xu <xuzhipeng.1973 at bytedance.com>
> > >
> > > This needs a sign-off, and your signoff needs to come after.
> > >
> > > > ---
> > > > arch/riscv/kernel/efi-header.S | 11 ++++++++++-
> > > > 1 file changed, 10 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/arch/riscv/kernel/efi-header.S b/arch/riscv/kernel/efi-header.S
> > > > index 515b2dfbca75..fa17c08c092a 100644
> > > > --- a/arch/riscv/kernel/efi-header.S
> > > > +++ b/arch/riscv/kernel/efi-header.S
> > > > @@ -40,7 +40,7 @@ optional_header:
> > > > .long __pecoff_data_virt_end - __pecoff_text_end // SizeOfInitializedData
> > > > #endif
> > > > .long 0 // SizeOfUninitializedData
> > > > - .long __efistub_efi_pe_entry - _start // AddressOfEntryPoint
> > > > + .long _efistub_entry - _start // AddressOfEntryPoint
> > > > .long efi_header_end - _start // BaseOfCode
> > > > #ifdef CONFIG_32BIT
> > > > .long __pecoff_text_end - _start // BaseOfData
> > > > @@ -121,4 +121,13 @@ section_table:
> > > >
> > > > .balign 0x1000
> > > > efi_header_end:
> > > > +
> > > > + .global _efistub_entry
> > > > +_efistub_entry:
> > >
> > > This should go into .text or .init.text, not the header.
> > >
> > > > + /* Reload the global pointer */
> > > > + load_global_pointer
> > > > +
> > >
> > > What is supposed to happen here if CONFIG_SHADOW_CALL_STACK=y? The EFI
> > > stub Makefile removes the SCS CFLAGS, so the stub will be built
> > > without shadow call stack support, which I guess means that it might
> > > use GP as a global pointer as usual?
> > >
> > > > + call __efistub_efi_pe_entry
> > > > + ret
> > > > +
> > >
> > > You are returning to the firmware here, but after modifying the GP
> > > register. Shouldn't you restore it to its old value?
> > There is no need to restore the value of the gp register. Where gp is
> > needed, the gp register must first be initialized. And here is the
> > entry.
> >
>
> But how should the firmware know that GP was corrupted after calling
> the kernel's EFI entrypoint? The EFI stub can return to the firmware
> if it encounters any errors while still running in the EFI boot
> services.
>
Actually, I wonder if GP can be modified at all before
ExitBootServices(). The EFI timer interrupt is still live at this
point, and so the firmware is being called behind your back, and might
rely on GP retaining its original value.
More information about the linux-riscv
mailing list