arm: Replace 'adrl' in EFI crt0
authorSam Edwards <cfsworks@gmail.com>
Sat, 15 Mar 2025 22:18:04 +0000 (15:18 -0700)
committerTom Rini <trini@konsulko.com>
Wed, 2 Apr 2025 20:33:50 +0000 (14:33 -0600)
commitd5734b183c3d578fff1c1e81e46a1d04342edffe
treef8d6919a55da15d0f362dc6fa3713a5420d5981a
parent16448c443c8cacba7dacb3e919c0b414f70b8a7c
arm: Replace 'adrl' in EFI crt0

LLVM's IAS does not (and cannot easily) support the 'adrl'
pseudoinstruction, and ARM developers generally do not consider it
portable across assembler implementations either.

Instead, expand it into the two subtract instructions it would emit
anyway. An explanation of the math follows:

The .+8 and .+4 refer to the same memory location; this is because the
.+4 expression occurs in a subsequent instruction, 4 bytes after the
first. This memory location is the value of the PC register when it is
read by the first sub instruction. Thus, both inner parenthesized
expressions evaluate to the same result: PC's offset relative to
image_base. The subtract instructions then remove one byte each
(low, then high) of the total offset, thereby getting the absolute
address of image_base loaded in r0.

Signed-off-by: Sam Edwards <CFSworks@gmail.com>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
arch/arm/lib/crt0_arm_efi.S