[PATCH] arm64: head: Ignore bogus KASLR displacement on non-relocatable kernels
Mikulas Patocka
mpatocka at redhat.com
Sat Aug 27 01:43:55 PDT 2022
On Sat, 27 Aug 2022, Ard Biesheuvel wrote:
> Even non-KASLR kernels can be built as relocatable, to work around
> broken bootloaders that violate the rules regarding physical placement
> of the kernel image - in this case, the physical offset modulo 2 MiB is
> used as the KASLR offset, and all absolute symbol references are fixed
> up in the usual way. This workaround is enabled by default.
>
> CONFIG_RELOCATABLE can also be disabled entirely, in which case the
> relocation code and the code that captures the offset are omitted from
> the build. However, since commit aacd149b6238 ("arm64: head: avoid
> relocating the kernel twice for KASLR"), this code got out of sync, and
> we still add the offset to the kernel virtual address before populating
> the page tables even though we never capture it. This means we add a
> bogus value instead, breaking the boot entirely.
>
> Fixes: aacd149b6238 ("arm64: head: avoid relocating the kernel twice for KASLR")
> Signed-off-by: Ard Biesheuvel <ardb at kernel.org>
Tested-by: Mikulas Patocka <mpatocka at redhat.com>
> ---
> arch/arm64/kernel/head.S | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
> index cefe6a73ee54..814b6587ccb7 100644
> --- a/arch/arm64/kernel/head.S
> +++ b/arch/arm64/kernel/head.S
> @@ -371,7 +371,9 @@ SYM_FUNC_END(create_idmap)
> SYM_FUNC_START_LOCAL(create_kernel_mapping)
> adrp x0, init_pg_dir
> mov_q x5, KIMAGE_VADDR // compile time __va(_text)
> +#ifdef CONFIG_RELOCATABLE
> add x5, x5, x23 // add KASLR displacement
> +#endif
> adrp x6, _end // runtime __pa(_end)
> adrp x3, _text // runtime __pa(_text)
> sub x6, x6, x3 // _end - _text
> --
> 2.35.1
>
More information about the linux-arm-kernel
mailing list