• Ard Biesheuvel's avatar
    ARM: assembler: introduce adr_l, ldr_l and str_l macros · 0b167463
    Ard Biesheuvel authored
    Like arm64, ARM supports position independent code sequences that
    produce symbol references with a greater reach than the ordinary
    adr/ldr instructions. Since on ARM, the adrl pseudo-instruction is
    only supported in ARM mode (and not at all when using Clang), having
    a adr_l macro like we do on arm64 is useful, and increases symmetry
    as well.
    
    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.
    
    E.g., on v7+ CPUs, we can emit a PC-relative reference as follows:
    
           movw         <reg>, #:lower16:<sym> - (1f + 8)
           movt         <reg>, #:upper16:<sym> - (1f + 8)
      1:   add          <reg>, <reg>, pc
    
    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          <reg>, 2f
      1:   add          <reg>, <reg>, pc
           .subsection  1
      2:   .long        <sym> - (1b + 8)
           .previous
    
    This is allowed by the assembler because, unlike ordinary sections,
    subsections are combined into a single section in the object file, and
    so the label references are not true cross-section references that are
    visible as relocations. (Subsections have been available in binutils
    since 2004 at least, so they should not cause any issues with older
    toolchains.)
    
    So use the above to implement the macros mov_l, adr_l, ldr_l and str_l,
    all of which will use movw/movt pairs on v7 and later CPUs, and use
    PC-relative literals otherwise.
    Reviewed-by: default avatarNicolas Pitre <nico@fluxnic.net>
    Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    0b167463
assembler.h 12 KB