From mboxrd@z Thu Jan 1 00:00:00 1970 MIME-Version: 1.0 In-Reply-To: <20170814152950.GT6321@e103592.cambridge.arm.com> References: <20170814125411.22604-1-ard.biesheuvel@linaro.org> <20170814125411.22604-3-ard.biesheuvel@linaro.org> <20170814152950.GT6321@e103592.cambridge.arm.com> From: Ard Biesheuvel Date: Mon, 14 Aug 2017 16:38:02 +0100 Message-ID: Content-Type: text/plain; charset="UTF-8" Subject: [kernel-hardening] Re: [PATCH 02/30] ARM: assembler: introduce adr_l, ldr_l and str_l macros To: Dave Martin Cc: Kernel Hardening , Mark Rutland , Kees Cook , Arnd Bergmann , Nicolas Pitre , Marc Zyngier , Russell King , Tony Lindgren , Matt Fleming , Thomas Garnier , "linux-arm-kernel@lists.infradead.org" List-ID: On 14 August 2017 at 16:29, Dave Martin wrote: > On Mon, Aug 14, 2017 at 01:53:43PM +0100, Ard Biesheuvel wrote: >> Like arm64, ARM supports position independent code sequences that >> produce symbol references with a greater reach than the ordinary >> adr/ldr instructions. >> >> Currently, we use open coded instruction sequences involving literals >> and arithmetic operations. Instead, we can use movw/movt pairs on v7 >> CPUs, circumventing the D-cache entirely. For older CPUs, we can emit >> the literal into a subsection, allowing it to be emitted out of line >> while retaining the ability to perform arithmetic on label offsets. >> >> E.g., on pre-v7 CPUs, we can emit a PC-relative reference as follows: >> >> ldr , 222f >> 111: add , , pc >> .subsection 1 >> 222: .long - (111b + 8) >> .previous >> >> This is allowed by the assembler because, unlike ordinary sections, >> subsections are combined into a single section into the object file, >> and so the label references are not true cross-section references that >> are visible as relocations. Note that we could even do something like >> >> add , pc, #(222f - 111f) & ~0xfff >> ldr , [, #(222f - 111f) & 0xfff] >> 111: add , , pc >> .subsection 1 >> 222: .long - (111b + 8) >> .previous > > This is reinventing ldr= > > I seem to remember ldr= barfing on things that .long happily accepts > though, was this the reason? > Yes. ldr = does not accept expressions involving symbols, only plain symbols or expressions that evaluate to constants. So something like ldr , = -