From 1f509b49ceeeeb3c59483c685592f8d87b70f169 Mon Sep 17 00:00:00 2001 From: Youling Tang Date: Tue, 7 Mar 2023 18:57:33 +0800 Subject: [PATCH] efistub: LoongArch: Reimplement kernel_entry_address() When EFI_KIMG_PREFERRED_ADDRESS is not equal to PHYS_LINK_KADDR, we should not jump to the link address but the actual load address, so fix the processing of kernel_entry_address(). Signed-off-by: Youling Tang --- arch/loongarch/include/asm/efi.h | 2 -- drivers/firmware/efi/libstub/loongarch-stub.c | 7 ------- drivers/firmware/efi/libstub/loongarch.c | 14 ++++++++++++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/arch/loongarch/include/asm/efi.h b/arch/loongarch/include/asm/efi.h index 091897d40b0375..eddc8e79b3fae7 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(void); - #endif /* _ASM_LOONGARCH_EFI_H */ diff --git a/drivers/firmware/efi/libstub/loongarch-stub.c b/drivers/firmware/efi/libstub/loongarch-stub.c index eee7ed43cdfb43..71d178f87274a8 100644 --- a/drivers/firmware/efi/libstub/loongarch-stub.c +++ b/drivers/firmware/efi/libstub/loongarch-stub.c @@ -44,10 +44,3 @@ efi_status_t handle_kernel_image(unsigned long *image_addr, return status; } - -unsigned long kernel_entry_address(void) -{ - unsigned long base = (unsigned long)&kernel_offset - kernel_offset; - - return (unsigned long)&kernel_entry - base + VMLINUX_LOAD_ADDRESS; -} diff --git a/drivers/firmware/efi/libstub/loongarch.c b/drivers/firmware/efi/libstub/loongarch.c index 807cba2693fc17..3af80465816d71 100644 --- a/drivers/firmware/efi/libstub/loongarch.c +++ b/drivers/firmware/efi/libstub/loongarch.c @@ -37,9 +37,19 @@ static efi_status_t exit_boot_func(struct efi_boot_memmap *map, void *priv) return EFI_SUCCESS; } -unsigned long __weak kernel_entry_address(void) +/* + * Get the offset of EFI_KIMG_PREFERRED_ADDRESS relative to the physical + * link address. + */ +static long get_kernel_offset(void) +{ + return EFI_KIMG_PREFERRED_ADDRESS - PHYS_LINK_KADDR; +} + +unsigned long kernel_entry_address(void) { - return *(unsigned long *)(PHYSADDR(VMLINUX_LOAD_ADDRESS) + 8); + return *(unsigned long *)(EFI_KIMG_PREFERRED_ADDRESS + 8) + + get_kernel_offset(); } efi_status_t efi_boot_kernel(void *handle, efi_loaded_image_t *image,