arm64: Work around convergence issue with LLD linker
authorArd Biesheuvel <ardb@kernel.org>
Sat, 31 May 2025 12:30:05 +0000 (14:30 +0200)
committerWill Deacon <will@kernel.org>
Mon, 2 Jun 2025 11:53:18 +0000 (12:53 +0100)
commitdc0a083948040ff364d065da8bb50c29f77a39ad
treea77127a1c0ff3917258436f38cc55eeeea997c94
parente21560b7d33c4f692cc9cd5b75ff09024f5a69d2
arm64: Work around convergence issue with LLD linker

LLD will occasionally error out with a '__init_end does not converge'
error if INIT_IDMAP_DIR_SIZE is defined in terms of _end, as this
results in a circular dependency.

Counter this by dimensioning the initial IDMAP page tables based on a
new boundary marker 'kimage_limit', and define it such that its value
should not change as a result of the initdata segment being pushed over
a 64k segment boundary due to changes in INIT_IDMAP_DIR_SIZE, provided
that its value doesn't change by more than 2M between linker passes.

Reported-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20250531123005.3866382-2-ardb+git@google.com
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/include/asm/kernel-pgtable.h
arch/arm64/kernel/image-vars.h