Re: [PATCH] efi/loongarch: Directly position the loaded image file

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Ard Biesheuvel <ardb@xxxxxxxxxx> 于2023年12月19日周二 16:28写道:
>
> On Tue, 19 Dec 2023 at 07:40, Huacai Chen <chenhuacai@xxxxxxxxxx> wrote:
> >
> > Hi, Ard and Yao,
> >
> > The logic of this patch seems right, but I see this in arm64 code:
> >
> >         if (image->image_base != _text) {
> >                 efi_err("FIRMWARE BUG: efi_loaded_image_t::image_base
> > has bogus value\n");
> >                 image->image_base = _text;
> >         }
> >
> > Does this mean image_base is unreliable?
> >
>
> Only if you use an old distro fork of GRUB. Those would 'repurpose'
> the LoadImage protocol created by the firmware to load GRUB by
> updating some fields and passing the same protocol to the kernel as
> the kernel's loaded image, but failed to set the image_base correctly.
>
> I don't think this is a concern for LoongArch.
>
> > The arm64 code is introduced in commit c2136dceba9a329e997ccce3277
> > ("efi/libstub/arm64: Avoid image_base value from efi_loaded_image"),
> > and I don't know whether LoongArch has similar problems.
> >
> > Huacai
> >
> > On Tue, Dec 19, 2023 at 1:36 PM <wangyao@xxxxxxxxxx> wrote:
> > >
> > > From: Wang Yao <wangyao@xxxxxxxxxx>
> > >
> > > Replace kernel_offset with image_base to positon the image file that has
> > > been loaded by UEFI or GRUB.
> > >
>
> Why?
>
> When you write a commit log, focus on the why not on the how (we can
> all see the 'how' by reading the patch itself)
>

OK,I will rewrite the commit log in V2.

> > > Signed-off-by: Wang Yao <wangyao@xxxxxxxxxx>
> > > ---
> > >  arch/loongarch/include/asm/efi.h              | 2 --
> > >  arch/loongarch/kernel/head.S                  | 1 -
> > >  arch/loongarch/kernel/image-vars.h            | 1 -
> > >  arch/loongarch/kernel/vmlinux.lds.S           | 1 -
> > >  drivers/firmware/efi/libstub/loongarch-stub.c | 9 +++++----
> > >  drivers/firmware/efi/libstub/loongarch-stub.h | 4 ++++
> > >  drivers/firmware/efi/libstub/loongarch.c      | 6 ++++--
> > >  7 files changed, 13 insertions(+), 11 deletions(-)
> > >  create mode 100644 drivers/firmware/efi/libstub/loongarch-stub.h
> > >
> > > diff --git a/arch/loongarch/include/asm/efi.h b/arch/loongarch/include/asm/efi.h
> > > index 91d81f9730ab..eddc8e79b3fa 100644
> > > --- a/arch/loongarch/include/asm/efi.h
> > > +++ b/arch/loongarch/include/asm/efi.h
> > > @@ -32,6 +32,4 @@ static inline unsigned long efi_get_kimg_min_align(void)
> > >
> > >  #define EFI_KIMG_PREFERRED_ADDRESS     PHYSADDR(VMLINUX_LOAD_ADDRESS)
> > >
> > > -unsigned long kernel_entry_address(unsigned long kernel_addr);
> > > -
> > >  #endif /* _ASM_LOONGARCH_EFI_H */
> > > diff --git a/arch/loongarch/kernel/head.S b/arch/loongarch/kernel/head.S
> > > index 53b883db0786..0ecab4216392 100644
> > > --- a/arch/loongarch/kernel/head.S
> > > +++ b/arch/loongarch/kernel/head.S
> > > @@ -34,7 +34,6 @@ pe_header:
> > >
> > >  SYM_DATA(kernel_asize, .long _kernel_asize);
> > >  SYM_DATA(kernel_fsize, .long _kernel_fsize);
> > > -SYM_DATA(kernel_offset, .long _kernel_offset);
> > >
> > >  #endif
> > >
> > > diff --git a/arch/loongarch/kernel/image-vars.h b/arch/loongarch/kernel/image-vars.h
> > > index 5087416b9678..41ddcf56d21c 100644
> > > --- a/arch/loongarch/kernel/image-vars.h
> > > +++ b/arch/loongarch/kernel/image-vars.h
> > > @@ -11,7 +11,6 @@ __efistub_strcmp              = strcmp;
> > >  __efistub_kernel_entry         = kernel_entry;
> > >  __efistub_kernel_asize         = kernel_asize;
> > >  __efistub_kernel_fsize         = kernel_fsize;
> > > -__efistub_kernel_offset                = kernel_offset;
> > >  #if defined(CONFIG_EFI_EARLYCON) || defined(CONFIG_SYSFB)
> > >  __efistub_screen_info          = screen_info;
> > >  #endif
> > > diff --git a/arch/loongarch/kernel/vmlinux.lds.S b/arch/loongarch/kernel/vmlinux.lds.S
> > > index bb2ec86f37a8..a5d0cd2035da 100644
> > > --- a/arch/loongarch/kernel/vmlinux.lds.S
> > > +++ b/arch/loongarch/kernel/vmlinux.lds.S
> > > @@ -143,7 +143,6 @@ SECTIONS
> > >         _kernel_fsize = _edata - _text;
> > >         _kernel_vsize = _end - __initdata_begin;
> > >         _kernel_rsize = _edata - __initdata_begin;
> > > -       _kernel_offset = kernel_offset - _text;
> > >  #endif
> > >
> > >         .gptab.sdata : {
> > > diff --git a/drivers/firmware/efi/libstub/loongarch-stub.c b/drivers/firmware/efi/libstub/loongarch-stub.c
> > > index d6ec5d4b8dbe..736b6aae323d 100644
> > > --- a/drivers/firmware/efi/libstub/loongarch-stub.c
> > > +++ b/drivers/firmware/efi/libstub/loongarch-stub.c
> > > @@ -8,10 +8,10 @@
> > >  #include <asm/efi.h>
> > >  #include <asm/addrspace.h>
> > >  #include "efistub.h"
> > > +#include "loongarch-stub.h"
> > >
> > >  extern int kernel_asize;
> > >  extern int kernel_fsize;
> > > -extern int kernel_offset;
> > >  extern int kernel_entry;
> > >
> > >  efi_status_t handle_kernel_image(unsigned long *image_addr,
> > > @@ -24,7 +24,7 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
> > >         efi_status_t status;
> > >         unsigned long kernel_addr = 0;
> > >
> > > -       kernel_addr = (unsigned long)&kernel_offset - kernel_offset;
> > > +       kernel_addr = (unsigned long)image->image_base;
> > >
> > >         status = efi_relocate_kernel(&kernel_addr, kernel_fsize, kernel_asize,
> > >                      EFI_KIMG_PREFERRED_ADDRESS, efi_get_kimg_min_align(), 0x0);
> > > @@ -35,9 +35,10 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
> > >         return status;
> > >  }
> > >
> > > -unsigned long kernel_entry_address(unsigned long kernel_addr)
> > > +unsigned long kernel_entry_address(unsigned long kernel_addr,
> > > +               efi_loaded_image_t *image)
> > >  {
> > > -       unsigned long base = (unsigned long)&kernel_offset - kernel_offset;
> > > +       unsigned long base = (unsigned long)image->image_base;
> > >
> > >         return (unsigned long)&kernel_entry - base + kernel_addr;
> > >  }
> > > diff --git a/drivers/firmware/efi/libstub/loongarch-stub.h b/drivers/firmware/efi/libstub/loongarch-stub.h
> > > new file mode 100644
> > > index 000000000000..cd015955a015
> > > --- /dev/null
> > > +++ b/drivers/firmware/efi/libstub/loongarch-stub.h
> > > @@ -0,0 +1,4 @@
> > > +/* SPDX-License-Identifier: GPL-2.0-only */
> > > +
> > > +unsigned long kernel_entry_address(unsigned long kernel_addr,
> > > +               efi_loaded_image_t *image);
> > > diff --git a/drivers/firmware/efi/libstub/loongarch.c b/drivers/firmware/efi/libstub/loongarch.c
> > > index 0e0aa6cda73f..684c9354637c 100644
> > > --- a/drivers/firmware/efi/libstub/loongarch.c
> > > +++ b/drivers/firmware/efi/libstub/loongarch.c
> > > @@ -8,6 +8,7 @@
> > >  #include <asm/efi.h>
> > >  #include <asm/addrspace.h>
> > >  #include "efistub.h"
> > > +#include "loongarch-stub.h"
> > >
> > >  typedef void __noreturn (*kernel_entry_t)(bool efi, unsigned long cmdline,
> > >                                           unsigned long systab);
> > > @@ -37,7 +38,8 @@ static efi_status_t exit_boot_func(struct efi_boot_memmap *map, void *priv)
> > >         return EFI_SUCCESS;
> > >  }
> > >
> > > -unsigned long __weak kernel_entry_address(unsigned long kernel_addr)
> > > +unsigned long __weak kernel_entry_address(unsigned long kernel_addr,
> > > +               efi_loaded_image_t *image)
> > >  {
> > >         return *(unsigned long *)(kernel_addr + 8) - VMLINUX_LOAD_ADDRESS + kernel_addr;
> > >  }
> > > @@ -73,7 +75,7 @@ efi_status_t efi_boot_kernel(void *handle, efi_loaded_image_t *image,
> > >         csr_write64(CSR_DMW0_INIT, LOONGARCH_CSR_DMWIN0);
> > >         csr_write64(CSR_DMW1_INIT, LOONGARCH_CSR_DMWIN1);
> > >
> > > -       real_kernel_entry = (void *)kernel_entry_address(kernel_addr);
> > > +       real_kernel_entry = (void *)kernel_entry_address(kernel_addr, image);
> > >
> > >         real_kernel_entry(true, (unsigned long)cmdline_ptr,
> > >                           (unsigned long)efi_system_table);
> > > --
> > > 2.27.0
> > >





[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux