glibc/elf
Szabolcs Nagy 08325735c2 [BZ 18034][AArch64] Lazy TLSDESC relocation data race fix
Lazy TLSDESC initialization needs to be synchronized with concurrent TLS
accesses.  The TLS descriptor contains a function pointer (entry) and an
argument that is accessed from the entry function.  With lazy initialization
the first call to the entry function updates the entry and the argument to
their final value.  A final entry function must make sure that it accesses an
initialized argument, this needs synchronization on systems with weak memory
ordering otherwise the writes of the first call can be observed out of order.

There are at least two issues with the current code:

tlsdesc.c (i386, x86_64, arm, aarch64) uses volatile memory accesses on the
write side (in the initial entry function) instead of C11 atomics.

And on systems with weak memory ordering (arm, aarch64) the read side
synchronization is missing from the final entry functions (dl-tlsdesc.S).

This patch only deals with aarch64.

* Write side:

Volatile accesses were replaced with C11 relaxed atomics, and a release
store was used for the initialization of entry so the read side can
synchronize with it.

* Read side:

TLS access generated by the compiler and an entry function code is roughly

  ldr x1, [x0]    // load the entry
  blr x1          // call it

entryfunc:
  ldr x0, [x0,#8] // load the arg
  ret

Various alternatives were considered to force the ordering in the entry
function between the two loads:

(1) barrier

entryfunc:
  dmb ishld
  ldr x0, [x0,#8]

(2) address dependency (if the address of the second load depends on the
result of the first one the ordering is guaranteed):

entryfunc:
  ldr x1,[x0]
  and x1,x1,#8
  orr x1,x1,#8
  ldr x0,[x0,x1]

(3) load-acquire (ARMv8 instruction that is ordered before subsequent
loads and stores)

entryfunc:
  ldar xzr,[x0]
  ldr x0,[x0,#8]

Option (1) is the simplest but slowest (note: this runs at every TLS
access), options (2) and (3) do one extra load from [x0] (same address
loads are ordered so it happens-after the load on the call site),
option (2) clobbers x1 which is problematic because existing gcc does
not expect that, so approach (3) was chosen.

A new _dl_tlsdesc_return_lazy entry function was introduced for lazily
relocated static TLS, so non-lazy static TLS can avoid the synchronization
cost.

	[BZ #18034]
	* sysdeps/aarch64/dl-tlsdesc.h (_dl_tlsdesc_return_lazy): Declare.
	* sysdeps/aarch64/dl-tlsdesc.S (_dl_tlsdesc_return_lazy): Define.
	(_dl_tlsdesc_undefweak): Guarantee TLSDESC entry and argument load-load
	ordering using ldar.
	(_dl_tlsdesc_dynamic): Likewise.
	(_dl_tlsdesc_return_lazy): Likewise.
	* sysdeps/aarch64/tlsdesc.c (_dl_tlsdesc_resolve_rela_fixup): Use
	relaxed atomics instead of volatile and synchronize with release store.
	(_dl_tlsdesc_resolve_hold_fixup): Use relaxed atomics instead of
	volatile.
	* elf/tlsdeschtab.h (_dl_tlsdesc_resolve_early_return_p): Likewise.
2015-06-17 12:41:01 +01:00
..
cache.c Fix ldconfig segmentation fault with corrupted cache (Bug 18093). 2015-03-11 21:07:32 -04:00
chroot_canon.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
circleload1.c
circlemod1.c
circlemod1a.c
circlemod2.c
circlemod2a.c
circlemod3.c
circlemod3a.c
constload1.c
constload2.c
constload3.c
dblload.c
dblloadmod1.c
dblloadmod2.c
dblloadmod3.c
dblunload.c
dep1.c
dep2.c
dep3.c
dep4.c
dl-addr.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-brk.c
dl-cache.c Fix recursive dlopen. 2015-01-21 01:51:10 -05:00
dl-caller.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-close.c Avoid confusing compiler with dynamically impossible statically invalid dereference in _dl_close_worker. 2015-04-17 14:29:40 -07:00
dl-conflict.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-debug.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-deps.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-dst.h Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-environ.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-error.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-execstack.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-fini.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-fptr.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-hwcaps.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-init.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-iteratephdr.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-libc.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-load.c Fix segmentation fault when LD_LIBRARY_PATH contains only non-existings paths 2015-01-25 15:12:10 +10:00
dl-load.h Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-lookup.c Add ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA to x86 2015-03-31 05:16:57 -07:00
dl-machine-reject-phdr.h Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-map-segments.h Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-minimal.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-misc.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-object.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-open.c Fuller check for invalid NSID in _dl_open. 2015-04-17 12:11:58 -07:00
dl-origin.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-profile.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-profstub.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-reloc.c Don't issue an error if DT_PLTRELSZ is missing 2015-05-22 17:46:58 -07:00
dl-runtime.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-sbrk.c
dl-scope.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-support.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-sym.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-symaddr.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-sysdep.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-tls.c Fix DTV race, assert, DTV_SURPLUS Static TLS limit, and nptl_db garbage 2015-03-17 00:31:49 -03:00
dl-trampoline.c
dl-tsd.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-unmap-segments.h Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-version.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dl-writev.h Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
do-rel.h Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
dynamic-link.h powerpc __tls_get_addr call optimization 2015-03-25 15:53:47 +10:30
elf.h elf.h: Add section compression constants and structures. 2015-05-01 22:48:19 +02:00
enbl-secure.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
failobj.c
filter.c
filtmod1.c
filtmod2.c
firstobj.c
gen-trusted-dirs.awk
genrtldtbl.awk
get-dynamic-info.h Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
global.c
globalmod1.c
ifuncdep1.c
ifuncdep1pic.c
ifuncdep2.c Replace __attribute__((visibility("protected"))) 2015-03-06 17:05:42 -08:00
ifuncdep2pic.c
ifuncdep5.c
ifuncdep5pic.c
ifuncmain1.c
ifuncmain1pic.c
ifuncmain1picstatic.c
ifuncmain1pie.c
ifuncmain1static.c
ifuncmain1staticpic.c
ifuncmain1staticpie.c
ifuncmain1vis.c
ifuncmain1vispic.c
ifuncmain1vispie.c
ifuncmain2.c
ifuncmain2pic.c
ifuncmain2picstatic.c
ifuncmain2static.c
ifuncmain3.c
ifuncmain4.c
ifuncmain4picstatic.c
ifuncmain4static.c
ifuncmain5.c
ifuncmain5pic.c
ifuncmain5picstatic.c
ifuncmain5pie.c
ifuncmain5static.c
ifuncmain5staticpic.c
ifuncmain6pie.c
ifuncmain7.c
ifuncmain7pic.c
ifuncmain7picstatic.c
ifuncmain7pie.c
ifuncmain7static.c
ifuncmod1.c Replace __attribute__((visibility("protected"))) 2015-03-06 17:05:42 -08:00
ifuncmod3.c
ifuncmod5.c Replace __attribute__((visibility("protected"))) 2015-03-06 17:05:42 -08:00
ifuncmod6.c
initfirst.c
interp.c Prepare for restoration of .interp section in libpthread.so 2015-06-10 10:14:45 +00:00
lateglobal.c
ldconfig.c Update copyright dates not handled by scripts/update-copyrights. 2015-01-02 16:54:45 +00:00
ldd.bash.in Update copyright dates not handled by scripts/update-copyrights. 2015-01-02 16:54:45 +00:00
link.h Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
loadfail.c
loadtest.c
ltglobmod1.c
ltglobmod2.c
Makefile Prepare for restoration of .interp section in libpthread.so 2015-06-10 10:14:45 +00:00
multiload.c
neededobj1.c
neededobj2.c
neededobj3.c
neededobj4.c
neededobj5.c
neededobj6.c
neededtest2.c
neededtest3.c
neededtest4.c
neededtest.c
next.c
nextmod1.c
nextmod2.c
nodel2mod1.c
nodel2mod2.c
nodel2mod3.c
nodelete2.c
nodelete.c
nodelmod1.c
nodelmod2.c
nodelmod3.c
nodelmod4.c
nodlopen2.c
nodlopen.c
nodlopenmod2.c
nodlopenmod.c
noload.c
order2.c
order2mod1.c
order2mod2.c
order2mod3.c
order2mod4.c
order.c
origtest.c
pathoptobj.c
pldd-xx.c pldd: Use struct scratch_buffer instead of extend_alloca 2015-04-08 21:06:49 +02:00
pldd.c pldd: Use struct scratch_buffer instead of extend_alloca 2015-04-08 21:06:49 +02:00
preloadtest.c
readelflib.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
readlib.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
reldep2.c
reldep3.c
reldep4.c
reldep4mod1.c
reldep4mod2.c
reldep4mod3.c
reldep4mod4.c
reldep5.c
reldep6.c
reldep6mod0.c
reldep6mod1.c
reldep6mod2.c
reldep6mod3.c
reldep6mod4.c
reldep7.c
reldep7mod1.c
reldep7mod2.c
reldep8.c
reldep8mod1.c
reldep8mod2.c
reldep8mod3.c
reldep9.c
reldep9mod1.c
reldep9mod2.c
reldep9mod3.c
reldep.c
reldepmod1.c
reldepmod2.c
reldepmod3.c
reldepmod4.c
reldepmod5.c
reldepmod6.c
resolvfail.c
restest1.c
restest2.c
rtld-debugger-interface.txt
rtld-Rules Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
rtld.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
setup-vdso.h Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
sln.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
sofini.c
soinit.c
sotruss-lib.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
sotruss.sh Update copyright dates not handled by scripts/update-copyrights. 2015-01-02 16:54:45 +00:00
sprof.c sprof: Make an error message identical to two others, and more accurate. 2015-02-25 00:04:55 -05:00
static-stubs.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
testobj1_1.c
testobj1.c
testobj2.c
testobj3.c
testobj4.c
testobj5.c
testobj6.c
testobj.h
tls-macros.h
tlsdeschtab.h [BZ 18034][AArch64] Lazy TLSDESC relocation data race fix 2015-06-17 12:41:01 +01:00
tst-addr1.c
tst-align2.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
tst-align.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
tst-alignmod2.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
tst-alignmod.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
tst-array1-static.c
tst-array1.c
tst-array1.exp
tst-array2.c
tst-array2.exp
tst-array2dep.c
tst-array3.c
tst-array4.c
tst-array4.exp
tst-array5-static.c
tst-array5-static.exp
tst-array5.c
tst-array5.exp
tst-array5dep.c
tst-audit1.c
tst-audit2.c Make sure that calloc is called at least once 2015-05-28 05:06:53 -07:00
tst-audit8.c
tst-audit9.c BZ #16613: Support TLS in audit libraries. 2014-02-25 13:18:15 -05:00
tst-auditmod1.c
tst-auditmod9a.c BZ #16613: Support TLS in audit libraries. 2014-02-25 13:18:15 -05:00
tst-auditmod9b.c BZ #16613: Support TLS in audit libraries. 2014-02-25 13:18:15 -05:00
tst-auxv.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
tst-deep1.c
tst-deep1mod1.c
tst-deep1mod2.c
tst-deep1mod3.c
tst-dl-iter-static.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
tst-dlmodcount.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
tst-dlmopen1.c
tst-dlmopen1mod.c
tst-dlmopen2.c
tst-dlmopen3.c
tst-dlopen-aout.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
tst-dlopenrpath.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
tst-dlopenrpathmod.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
tst-execstack-mod.c
tst-execstack-needed.c
tst-execstack-prog.c
tst-execstack.c
tst-global1.c Modify several tests to use test-skeleton.c 2014-11-05 15:24:08 +05:30
tst-initorder2.c
tst-initorder2.exp
tst-initorder.c
tst-initorder.exp
tst-initordera1.c
tst-initordera2.c
tst-initordera3.c
tst-initordera4.c
tst-initorderb1.c
tst-initorderb2.c
tst-leaks1-static.c
tst-leaks1.c
tst-null-argv-lib.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
tst-null-argv.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
tst-order-a1.c
tst-order-a2.c
tst-order-a3.c
tst-order-a4.c
tst-order-b1.c
tst-order-b2.c
tst-order-main.c
tst-pathopt.c Modify several tests to use test-skeleton.c 2014-11-05 15:24:08 +05:30
tst-pathopt.sh Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
tst-pie1.c
tst-pie2.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
tst-piemod1.c Modify several tests to use test-skeleton.c 2014-11-05 15:24:08 +05:30
tst-protected1a.c Add a testcase for copy reloc against protected data 2015-03-31 05:21:12 -07:00
tst-protected1b.c Add a testcase for copy reloc against protected data 2015-03-31 05:21:12 -07:00
tst-protected1mod.h Add a testcase for copy reloc against protected data 2015-03-31 05:21:12 -07:00
tst-protected1moda.c Add a testcase for copy reloc against protected data 2015-03-31 05:21:12 -07:00
tst-protected1modb.c Add a testcase for copy reloc against protected data 2015-03-31 05:21:12 -07:00
tst-ptrguard1-static.c
tst-ptrguard1.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
tst-relsort1.c
tst-relsort1mod1.c
tst-relsort1mod2.c
tst-rtld-load-self.sh Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
tst-stackguard1-static.c
tst-stackguard1.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
tst-thrlock.c
tst-tls1-static.c
tst-tls1.c
tst-tls2-static.c
tst-tls2.c
tst-tls3.c
tst-tls4.c
tst-tls5.c
tst-tls6.c
tst-tls7.c
tst-tls8.c
tst-tls9-static.c
tst-tls9.c
tst-tls10.c Modify several tests to use test-skeleton.c 2014-11-05 15:24:08 +05:30
tst-tls10.h
tst-tls11.c Modify several tests to use test-skeleton.c 2014-11-05 15:24:08 +05:30
tst-tls12.c Modify several tests to use test-skeleton.c 2014-11-05 15:24:08 +05:30
tst-tls13.c
tst-tls14.c
tst-tls15.c
tst-tls16.c
tst-tls17.c
tst-tls18.c
tst-tls19.c
tst-tls19mod1.c
tst-tls19mod2.c
tst-tls19mod3.c
tst-tls-dlinfo.c
tst-tlsalign-extern-static.c BZ#18383: Another test case, with TLS refs and defs in separate TUs. 2015-06-02 16:55:36 -07:00
tst-tlsalign-extern.c BZ#18383: Another test case, with TLS refs and defs in separate TUs. 2015-06-02 16:55:36 -07:00
tst-tlsalign-lib.c BZ#18383: Add test case for large alignment in TLS blocks. 2015-05-06 13:32:18 -07:00
tst-tlsalign-static.c BZ#18383: Add test case for large alignment in TLS blocks. 2015-05-06 13:32:18 -07:00
tst-tlsalign-vars.c BZ#18383: Another test case, with TLS refs and defs in separate TUs. 2015-06-02 16:55:36 -07:00
tst-tlsalign.c BZ#18383: Add test case for large alignment in TLS blocks. 2015-05-06 13:32:18 -07:00
tst-tlsmod1.c
tst-tlsmod2.c
tst-tlsmod3.c
tst-tlsmod4.c
tst-tlsmod5.c
tst-tlsmod6.c
tst-tlsmod7.c
tst-tlsmod8.c
tst-tlsmod9.c
tst-tlsmod10.c
tst-tlsmod11.c
tst-tlsmod12.c
tst-tlsmod13.c
tst-tlsmod13a.c
tst-tlsmod14a.c
tst-tlsmod14b.c
tst-tlsmod15a.c
tst-tlsmod15b.c
tst-tlsmod16a.c
tst-tlsmod16b.c
tst-tlsmod17a.c
tst-tlsmod17b.c
tst-tlsmod18a.c
tst-unique1.c
tst-unique1mod1.c
tst-unique1mod2.c
tst-unique2.c
tst-unique2mod1.c
tst-unique2mod2.c
tst-unique3.cc
tst-unique3.h
tst-unique3lib2.cc
tst-unique3lib.cc
tst-unique4.cc
tst-unique4.h
tst-unique4lib.cc Fix warning in elf/tst-unique4lib.cc. 2014-12-16 10:26:48 +01:00
unload2.c
unload2dep.c
unload2mod.c
unload3.c
unload3mod1.c
unload3mod2.c
unload3mod3.c
unload3mod4.c
unload4.c
unload4mod1.c
unload4mod2.c
unload4mod3.c
unload4mod4.c
unload5.c
unload6.c
unload6mod1.c
unload6mod2.c
unload6mod3.c
unload7.c
unload7mod1.c
unload7mod2.c
unload8.c
unload8mod1.c
unload8mod1x.c
unload8mod2.c
unload8mod3.c
unload.c
unloadmod.c
Versions Add empty GLIBC_2.2.5 version to elf/Versions. 2014-03-25 21:54:09 +00:00
vismain.c Compile vismain with -fPIE and link with -pie 2015-02-27 14:13:28 -08:00
vismod1.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
vismod2.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
vismod3.c Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
vismod.h