Commit 174a0c56 authored by Wang Yao's avatar Wang Yao Committed by Ard Biesheuvel
Browse files

efi/loongarch: Directly position the loaded image file



The use of the 'kernel_offset' variable to position the image file that
has been loaded by UEFI or GRUB is unnecessary, because we can directly
position the loaded image file through using the image_base field of the
efi_loaded_image struct provided by UEFI.

Replace kernel_offset with image_base to position the image file that has
been loaded by UEFI or GRUB.

Signed-off-by: default avatarWang Yao <wangyao@lemote.com>
Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
parent a42da7f0
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -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 */
+0 −1
Original line number Diff line number Diff line
@@ -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

+0 −1
Original line number Diff line number Diff line
@@ -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
+0 −1
Original line number Diff line number Diff line
@@ -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 : {
+5 −4
Original line number Diff line number Diff line
@@ -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;
}
Loading