rework arm atomic/tp backends to be thumb-compatible and fdpic-ready
authorRich Felker <dalias@aerifal.cx>
Mon, 19 Dec 2016 00:38:53 +0000 (19:38 -0500)
committerRich Felker <dalias@aerifal.cx>
Tue, 20 Dec 2016 02:21:08 +0000 (21:21 -0500)
commit29237f7f5c09c436825a7a12b68ab4143b0ebd1f
tree486acbdd1ea1f652fa79ca2ccba145dc745e7316
parent9067a3006ea2f84395ab23a1dd30191387312e0c
rework arm atomic/tp backends to be thumb-compatible and fdpic-ready

three problems are addressed:

- use of pc arithmetic, which was difficult if not impossible to make
  correct in thumb mode on all models, so that relative rather than
  absolute pointers to the backends could be used. this was designed
  back when there was no coherent model for the early stages of the
  dynamic linker before relocations, and is no longer necessary.

- assumption that data (the relative pointers to the backends) can be
  accessed at a constant displacement from the code. this will not be
  possible on future fdpic subarchs (for cortex-m), so move
  responsibility for loading the backend code address to the caller.

- hard-coded arm opcodes using the .word directive. instead, use the
  .arch directive to work around the assembler's refusal to assemble
  instructions not available (or in some cases, available but just
  considered deprecated) in the target isa level. the obscure v6t2
  arch is used for v6 code so as to (1) allow generation of thumb2
  output if -mthumb is active, and (2) avoid warnings/errors for mcr
  barriers that clang would produce if we just set arch to v7-a.

in addition, the __aeabi_read_tp function is moved out of the inner
workings and implemented as an asm wrapper around a C function, so
that asm code does not need to read global data. the asm wrapper
serves to satisfy the ABI calling convention requirements for this
function.
arch/arm/atomic_arch.h
arch/arm/pthread_arch.h
src/thread/arm/__aeabi_read_tp.s [new file with mode: 0644]
src/thread/arm/__aeabi_read_tp_c.c [new file with mode: 0644]
src/thread/arm/__set_thread_area.c
src/thread/arm/atomics.s