On Thu, May 23, 2024 at 6:03 AM Jiaxun Yang <jiaxun.yang@xxxxxxxxxxx> wrote: > > Currently kernel entry in head.S is in DMW address range, > firmware is instructed to jump to this address after loading > the image. > > However kernel should not make any assumption on firmware's > DMW setting, thus the entry point should be a physical address > falls into direct translation region. > > Fix by converting entry address to physical and amend entry > calculation logic in libstub accordingly. > > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Jiaxun Yang <jiaxun.yang@xxxxxxxxxxx> > --- > v2: Fix efistub > v3: Move calculation to linker script > --- > arch/loongarch/kernel/head.S | 2 +- > arch/loongarch/kernel/vmlinux.lds.S | 2 ++ > drivers/firmware/efi/libstub/loongarch.c | 2 +- > 3 files changed, 4 insertions(+), 2 deletions(-) > > diff --git a/arch/loongarch/kernel/head.S b/arch/loongarch/kernel/head.S > index c4f7de2e2805..2cdc1ea808d9 100644 > --- a/arch/loongarch/kernel/head.S > +++ b/arch/loongarch/kernel/head.S > @@ -22,7 +22,7 @@ > _head: > .word MZ_MAGIC /* "MZ", MS-DOS header */ > .org 0x8 > - .dword kernel_entry /* Kernel entry point */ > + .dword _kernel_entry_phys /* Kernel entry point (physical address) */ > .dword _kernel_asize /* Kernel image effective size */ > .quad PHYS_LINK_KADDR /* Kernel image load offset from start of RAM */ > .org 0x38 /* 0x20 ~ 0x37 reserved */ > diff --git a/arch/loongarch/kernel/vmlinux.lds.S b/arch/loongarch/kernel/vmlinux.lds.S > index e8e97dbf9ca4..c6f89e51257a 100644 > --- a/arch/loongarch/kernel/vmlinux.lds.S > +++ b/arch/loongarch/kernel/vmlinux.lds.S > @@ -6,6 +6,7 @@ > > #define PAGE_SIZE _PAGE_SIZE > #define RO_EXCEPTION_TABLE_ALIGN 4 > +#define TO_PHYS_MASK 0x000fffffffffffff /* 48-bit */ > > /* > * Put .bss..swapper_pg_dir as the first thing in .bss. This will > @@ -142,6 +143,7 @@ SECTIONS > > #ifdef CONFIG_EFI_STUB > /* header symbols */ > + _kernel_entry_phys = kernel_entry & TO_PHYS_MASK; - _kernel_entry_phys = kernel_entry & TO_PHYS_MASK; + _kernel_entry_phys = ABSOLUTE(kernel_entry & TO_PHYS_MASK); > _kernel_asize = _end - _text; > _kernel_fsize = _edata - _text; > _kernel_vsize = _end - __initdata_begin; > diff --git a/drivers/firmware/efi/libstub/loongarch.c b/drivers/firmware/efi/libstub/loongarch.c > index 684c9354637c..60c145121393 100644 > --- a/drivers/firmware/efi/libstub/loongarch.c > +++ b/drivers/firmware/efi/libstub/loongarch.c > @@ -41,7 +41,7 @@ static efi_status_t exit_boot_func(struct efi_boot_memmap *map, void *priv) > 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; > + return *(unsigned long *)(kernel_addr + 8) - TO_PHYS(VMLINUX_LOAD_ADDRESS) + kernel_addr; > } > > efi_status_t efi_boot_kernel(void *handle, efi_loaded_image_t *image, > > -- > 2.43.0 > > - Rui