* [PATCH v2 0/2] LoongArch: Move KASLR to EFI stub to avoid initrd overlap @ 2026-04-28 4:01 WANG Rui 2026-04-28 4:01 ` [PATCH v2 1/2] efi/loongarch: Randomize kernel preferred address for KASLR WANG Rui 2026-04-28 4:01 ` [PATCH v2 2/2] LoongArch: Skip relocation-time KASLR if it has already been applied WANG Rui 0 siblings, 2 replies; 5+ messages in thread From: WANG Rui @ 2026-04-28 4:01 UTC (permalink / raw) To: Huacai Chen, Ard Biesheuvel Cc: WANG Xuerui, Ilias Apalodimas, Lisa Robinson, loongarch, linux-efi, linux-kernel, WANG Rui Changes since [v1]: * Drop the patch "LoongArch: Allow rdtime_h() and rdtime_l() in 64-bit builds". * Use random_get_entropy() instead of rdtime_l(). This series addresses a potential overlap issue between the kernel image and the initrd when KASLR is enabled. In the normal boot flow, the bootloader is responsible for loading both vmlinux and the initrd, and it can guarantee that the two do not overlap in memory. However, this assumption only holds as long as neither image changes its location afterwards. The in-kernel KASLR implementation breaks that assumption. When the initrd is placed close to the kernel image, randomizing the kernel location at runtime may move it into the initrd region, leading to memory corruption early during boot. To fix this, this series moves the KASLR logic out of the kernel proper and into the EFI stub. With this change, the final placement of both the kernel image and the initrd is determined by the EFI memory allocator. This ensures that the two allocations are coordinated and cannot overlap. Functionally, the kernel still supports KASLR as before, but the randomization now happens before the kernel is entered, rather than during early kernel relocation. [v1]: https://lore.kernel.org/loongarch/20260427104721.47724-1-r@hev.cc WANG Rui (2): efi/loongarch: Randomize kernel preferred address for KASLR LoongArch: Skip relocation-time KASLR if it has already been applied arch/loongarch/Kconfig | 2 +- arch/loongarch/include/asm/efi.h | 4 +++- arch/loongarch/kernel/relocate.c | 4 ++++ drivers/firmware/efi/libstub/loongarch.c | 16 ++++++++++++++++ 4 files changed, 24 insertions(+), 2 deletions(-) -- 2.54.0 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 1/2] efi/loongarch: Randomize kernel preferred address for KASLR 2026-04-28 4:01 [PATCH v2 0/2] LoongArch: Move KASLR to EFI stub to avoid initrd overlap WANG Rui @ 2026-04-28 4:01 ` WANG Rui 2026-04-28 5:01 ` Huacai Chen 2026-04-28 4:01 ` [PATCH v2 2/2] LoongArch: Skip relocation-time KASLR if it has already been applied WANG Rui 1 sibling, 1 reply; 5+ messages in thread From: WANG Rui @ 2026-04-28 4:01 UTC (permalink / raw) To: Huacai Chen, Ard Biesheuvel Cc: WANG Xuerui, Ilias Apalodimas, Lisa Robinson, loongarch, linux-efi, linux-kernel, WANG Rui Introduce efi_get_kimg_kaslr_address() to compute the preferred kernel image address dynamically when CONFIG_RANDOMIZE_BASE is enabled. The function derives a random offset using EFI-provided randomness combined with the timer value, and constrains it within CONFIG_RANDOMIZE_BASE_MAX_OFFSET. Update EFI_KIMG_PREFERRED_ADDRESS to call this helper so that the EFI stub can select a randomized load address when KASLR is active, while preserving the original base address behavior when KASLR is disabled or nokaslr is specified. Signed-off-by: WANG Rui <r@hev.cc> --- arch/loongarch/Kconfig | 2 +- arch/loongarch/include/asm/efi.h | 4 +++- drivers/firmware/efi/libstub/loongarch.c | 16 ++++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/arch/loongarch/Kconfig b/arch/loongarch/Kconfig index 3b042dbb2c41..a5afb70f73d9 100644 --- a/arch/loongarch/Kconfig +++ b/arch/loongarch/Kconfig @@ -730,7 +730,7 @@ config RANDOMIZE_BASE config RANDOMIZE_BASE_MAX_OFFSET hex "Maximum KASLR offset" if EXPERT depends on RANDOMIZE_BASE - range 0x0 0x10000000 + range 0x20000 0x10000000 default "0x01000000" help When KASLR is active, this provides the maximum offset that will diff --git a/arch/loongarch/include/asm/efi.h b/arch/loongarch/include/asm/efi.h index eddc8e79b3fa..f831320efd41 100644 --- a/arch/loongarch/include/asm/efi.h +++ b/arch/loongarch/include/asm/efi.h @@ -30,6 +30,8 @@ static inline unsigned long efi_get_kimg_min_align(void) return SZ_2M; } -#define EFI_KIMG_PREFERRED_ADDRESS PHYSADDR(VMLINUX_LOAD_ADDRESS) +unsigned long efi_get_kimg_kaslr_address(void); + +#define EFI_KIMG_PREFERRED_ADDRESS efi_get_kimg_kaslr_address() #endif /* _ASM_LOONGARCH_EFI_H */ diff --git a/drivers/firmware/efi/libstub/loongarch.c b/drivers/firmware/efi/libstub/loongarch.c index 9825f5218137..c44be5d3dc04 100644 --- a/drivers/firmware/efi/libstub/loongarch.c +++ b/drivers/firmware/efi/libstub/loongarch.c @@ -38,6 +38,22 @@ static efi_status_t exit_boot_func(struct efi_boot_memmap *map, void *priv) return EFI_SUCCESS; } +unsigned long efi_get_kimg_kaslr_address(void) +{ + unsigned int random_offset = 0; + +#ifdef CONFIG_RANDOMIZE_BASE + if (!efi_nokaslr) { + efi_get_random_bytes(sizeof(random_offset), (u8 *)&random_offset); + random_offset ^= (random_get_entropy() << 16); + random_offset &= (CONFIG_RANDOMIZE_BASE_MAX_OFFSET - SZ_64K - 1); + random_offset = ALIGN(random_offset, SZ_64K) + SZ_64K; + } +#endif + + return PHYSADDR(VMLINUX_LOAD_ADDRESS) + random_offset; +} + unsigned long __weak kernel_entry_address(unsigned long kernel_addr, efi_loaded_image_t *image) { -- 2.54.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] efi/loongarch: Randomize kernel preferred address for KASLR 2026-04-28 4:01 ` [PATCH v2 1/2] efi/loongarch: Randomize kernel preferred address for KASLR WANG Rui @ 2026-04-28 5:01 ` Huacai Chen 2026-04-28 14:34 ` WANG Rui 0 siblings, 1 reply; 5+ messages in thread From: Huacai Chen @ 2026-04-28 5:01 UTC (permalink / raw) To: WANG Rui Cc: Ard Biesheuvel, WANG Xuerui, Ilias Apalodimas, Lisa Robinson, loongarch, linux-efi, linux-kernel Hi, Rui, On Tue, Apr 28, 2026 at 12:02 PM WANG Rui <r@hev.cc> wrote: > > Introduce efi_get_kimg_kaslr_address() to compute the preferred > kernel image address dynamically when CONFIG_RANDOMIZE_BASE is > enabled. The function derives a random offset using EFI-provided > randomness combined with the timer value, and constrains it within > CONFIG_RANDOMIZE_BASE_MAX_OFFSET. > > Update EFI_KIMG_PREFERRED_ADDRESS to call this helper so that the > EFI stub can select a randomized load address when KASLR is active, > while preserving the original base address behavior when KASLR is > disabled or nokaslr is specified. > > Signed-off-by: WANG Rui <r@hev.cc> > --- > arch/loongarch/Kconfig | 2 +- > arch/loongarch/include/asm/efi.h | 4 +++- > drivers/firmware/efi/libstub/loongarch.c | 16 ++++++++++++++++ > 3 files changed, 20 insertions(+), 2 deletions(-) > > diff --git a/arch/loongarch/Kconfig b/arch/loongarch/Kconfig > index 3b042dbb2c41..a5afb70f73d9 100644 > --- a/arch/loongarch/Kconfig > +++ b/arch/loongarch/Kconfig > @@ -730,7 +730,7 @@ config RANDOMIZE_BASE > config RANDOMIZE_BASE_MAX_OFFSET > hex "Maximum KASLR offset" if EXPERT > depends on RANDOMIZE_BASE > - range 0x0 0x10000000 > + range 0x20000 0x10000000 > default "0x01000000" > help > When KASLR is active, this provides the maximum offset that will > diff --git a/arch/loongarch/include/asm/efi.h b/arch/loongarch/include/asm/efi.h > index eddc8e79b3fa..f831320efd41 100644 > --- a/arch/loongarch/include/asm/efi.h > +++ b/arch/loongarch/include/asm/efi.h > @@ -30,6 +30,8 @@ static inline unsigned long efi_get_kimg_min_align(void) > return SZ_2M; > } > > -#define EFI_KIMG_PREFERRED_ADDRESS PHYSADDR(VMLINUX_LOAD_ADDRESS) > +unsigned long efi_get_kimg_kaslr_address(void); > + > +#define EFI_KIMG_PREFERRED_ADDRESS efi_get_kimg_kaslr_address() > > #endif /* _ASM_LOONGARCH_EFI_H */ > diff --git a/drivers/firmware/efi/libstub/loongarch.c b/drivers/firmware/efi/libstub/loongarch.c > index 9825f5218137..c44be5d3dc04 100644 > --- a/drivers/firmware/efi/libstub/loongarch.c > +++ b/drivers/firmware/efi/libstub/loongarch.c > @@ -38,6 +38,22 @@ static efi_status_t exit_boot_func(struct efi_boot_memmap *map, void *priv) > return EFI_SUCCESS; > } > > +unsigned long efi_get_kimg_kaslr_address(void) Move it into arch/loongarch/include/asm/efi.h? > +{ > + unsigned int random_offset = 0; > + > +#ifdef CONFIG_RANDOMIZE_BASE > + if (!efi_nokaslr) { > + efi_get_random_bytes(sizeof(random_offset), (u8 *)&random_offset); > + random_offset ^= (random_get_entropy() << 16); > + random_offset &= (CONFIG_RANDOMIZE_BASE_MAX_OFFSET - SZ_64K - 1); I still don't want to modify the range of RANDOMIZE_BASE_MAX_OFFSET, so use random_offset &= (CONFIG_RANDOMIZE_BASE_MAX_OFFSET - 1) here? > + random_offset = ALIGN(random_offset, SZ_64K) + SZ_64K; It seems "random_offset = ALIGN(random_offset + SZ64K, SZ_64K)" is better. Huacai > + } > +#endif > + > + return PHYSADDR(VMLINUX_LOAD_ADDRESS) + random_offset; > +} > + > unsigned long __weak kernel_entry_address(unsigned long kernel_addr, > efi_loaded_image_t *image) > { > -- > 2.54.0 > ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] efi/loongarch: Randomize kernel preferred address for KASLR 2026-04-28 5:01 ` Huacai Chen @ 2026-04-28 14:34 ` WANG Rui 0 siblings, 0 replies; 5+ messages in thread From: WANG Rui @ 2026-04-28 14:34 UTC (permalink / raw) To: Huacai Chen Cc: Ard Biesheuvel, WANG Xuerui, Ilias Apalodimas, Lisa Robinson, loongarch, linux-efi, linux-kernel Hi Huacai, On Tue, Apr 28, 2026 at 1:01 PM Huacai Chen <chenhuacai@kernel.org> wrote: > > Hi, Rui, > > On Tue, Apr 28, 2026 at 12:02 PM WANG Rui <r@hev.cc> wrote: > > > > Introduce efi_get_kimg_kaslr_address() to compute the preferred > > kernel image address dynamically when CONFIG_RANDOMIZE_BASE is > > enabled. The function derives a random offset using EFI-provided > > randomness combined with the timer value, and constrains it within > > CONFIG_RANDOMIZE_BASE_MAX_OFFSET. > > > > Update EFI_KIMG_PREFERRED_ADDRESS to call this helper so that the > > EFI stub can select a randomized load address when KASLR is active, > > while preserving the original base address behavior when KASLR is > > disabled or nokaslr is specified. > > > > Signed-off-by: WANG Rui <r@hev.cc> > > --- > > arch/loongarch/Kconfig | 2 +- > > arch/loongarch/include/asm/efi.h | 4 +++- > > drivers/firmware/efi/libstub/loongarch.c | 16 ++++++++++++++++ > > 3 files changed, 20 insertions(+), 2 deletions(-) > > > > diff --git a/arch/loongarch/Kconfig b/arch/loongarch/Kconfig > > index 3b042dbb2c41..a5afb70f73d9 100644 > > --- a/arch/loongarch/Kconfig > > +++ b/arch/loongarch/Kconfig > > @@ -730,7 +730,7 @@ config RANDOMIZE_BASE > > config RANDOMIZE_BASE_MAX_OFFSET > > hex "Maximum KASLR offset" if EXPERT > > depends on RANDOMIZE_BASE > > - range 0x0 0x10000000 > > + range 0x20000 0x10000000 > > default "0x01000000" > > help > > When KASLR is active, this provides the maximum offset that will > > diff --git a/arch/loongarch/include/asm/efi.h b/arch/loongarch/include/asm/efi.h > > index eddc8e79b3fa..f831320efd41 100644 > > --- a/arch/loongarch/include/asm/efi.h > > +++ b/arch/loongarch/include/asm/efi.h > > @@ -30,6 +30,8 @@ static inline unsigned long efi_get_kimg_min_align(void) > > return SZ_2M; > > } > > > > -#define EFI_KIMG_PREFERRED_ADDRESS PHYSADDR(VMLINUX_LOAD_ADDRESS) > > +unsigned long efi_get_kimg_kaslr_address(void); > > + > > +#define EFI_KIMG_PREFERRED_ADDRESS efi_get_kimg_kaslr_address() > > > > #endif /* _ASM_LOONGARCH_EFI_H */ > > diff --git a/drivers/firmware/efi/libstub/loongarch.c b/drivers/firmware/efi/libstub/loongarch.c > > index 9825f5218137..c44be5d3dc04 100644 > > --- a/drivers/firmware/efi/libstub/loongarch.c > > +++ b/drivers/firmware/efi/libstub/loongarch.c > > @@ -38,6 +38,22 @@ static efi_status_t exit_boot_func(struct efi_boot_memmap *map, void *priv) > > return EFI_SUCCESS; > > } > > > > +unsigned long efi_get_kimg_kaslr_address(void) > Move it into arch/loongarch/include/asm/efi.h? In that case, we'd need to declare efi_nokaslr and efi_get_random_bytes() in efi.h. Since including efistub.h in efi.h doesn't work, putting them here keeps things pretty clean. Thanks, Rui > > > +{ > > + unsigned int random_offset = 0; > > + > > +#ifdef CONFIG_RANDOMIZE_BASE > > + if (!efi_nokaslr) { > > + efi_get_random_bytes(sizeof(random_offset), (u8 *)&random_offset); > > + random_offset ^= (random_get_entropy() << 16); > > + random_offset &= (CONFIG_RANDOMIZE_BASE_MAX_OFFSET - SZ_64K - 1); > I still don't want to modify the range of RANDOMIZE_BASE_MAX_OFFSET, so use > random_offset &= (CONFIG_RANDOMIZE_BASE_MAX_OFFSET - 1) > here? > > > + random_offset = ALIGN(random_offset, SZ_64K) + SZ_64K; > It seems "random_offset = ALIGN(random_offset + SZ64K, SZ_64K)" is better. > > Huacai > > > + } > > +#endif > > + > > + return PHYSADDR(VMLINUX_LOAD_ADDRESS) + random_offset; > > +} > > + > > unsigned long __weak kernel_entry_address(unsigned long kernel_addr, > > efi_loaded_image_t *image) > > { > > -- > > 2.54.0 > > > ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 2/2] LoongArch: Skip relocation-time KASLR if it has already been applied 2026-04-28 4:01 [PATCH v2 0/2] LoongArch: Move KASLR to EFI stub to avoid initrd overlap WANG Rui 2026-04-28 4:01 ` [PATCH v2 1/2] efi/loongarch: Randomize kernel preferred address for KASLR WANG Rui @ 2026-04-28 4:01 ` WANG Rui 1 sibling, 0 replies; 5+ messages in thread From: WANG Rui @ 2026-04-28 4:01 UTC (permalink / raw) To: Huacai Chen, Ard Biesheuvel Cc: WANG Xuerui, Ilias Apalodimas, Lisa Robinson, loongarch, linux-efi, linux-kernel, WANG Rui When the kernel is relocated during early boot, a randomized load address may already have been selected and applied. In this case, performing KASLR again in relocate.c is unnecessary. Signed-off-by: WANG Rui <r@hev.cc> --- arch/loongarch/kernel/relocate.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/loongarch/kernel/relocate.c b/arch/loongarch/kernel/relocate.c index 16f6a9b39659..c36604a81d08 100644 --- a/arch/loongarch/kernel/relocate.c +++ b/arch/loongarch/kernel/relocate.c @@ -139,6 +139,10 @@ static inline __init bool kaslr_disabled(void) char *str; const char *builtin_cmdline = CONFIG_CMDLINE; + /* KASLR is performed during early boot. */ + if (kaslr_offset()) + return true; + str = strstr(builtin_cmdline, "nokaslr"); if (str == builtin_cmdline || (str > builtin_cmdline && *(str - 1) == ' ')) { pr_info(KASLR_DISABLED_MESSAGE, "\'nokaslr\'", "built-in"); -- 2.54.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-04-28 14:34 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-04-28 4:01 [PATCH v2 0/2] LoongArch: Move KASLR to EFI stub to avoid initrd overlap WANG Rui 2026-04-28 4:01 ` [PATCH v2 1/2] efi/loongarch: Randomize kernel preferred address for KASLR WANG Rui 2026-04-28 5:01 ` Huacai Chen 2026-04-28 14:34 ` WANG Rui 2026-04-28 4:01 ` [PATCH v2 2/2] LoongArch: Skip relocation-time KASLR if it has already been applied WANG Rui
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox