From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave.Martin@arm.com (Dave Martin) Date: Mon, 14 Aug 2017 16:50:02 +0100 Subject: [PATCH 02/30] ARM: assembler: introduce adr_l, ldr_l and str_l macros In-Reply-To: References: <20170814125411.22604-1-ard.biesheuvel@linaro.org> <20170814125411.22604-3-ard.biesheuvel@linaro.org> <20170814152950.GT6321@e103592.cambridge.arm.com> Message-ID: <20170814155002.GV6321@e103592.cambridge.arm.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Mon, Aug 14, 2017 at 04:38:02PM +0100, Ard Biesheuvel wrote: > 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 , = -