diff options
author | Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com> | 2020-01-10 19:14:56 -0300 |
---|---|---|
committer | Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com> | 2020-01-17 09:05:03 -0300 |
commit | 18363b4f010da9ba459b13310b113ac0647c2fcc (patch) | |
tree | a9b4b22d7fb65d7d219eb0e10b996de971da54e9 /sysdeps/powerpc/powerpc64 | |
parent | powerpc: Initialize rtld_global_ro for static dlopen [BZ #20802] (diff) | |
download | glibc-18363b4f010da9ba459b13310b113ac0647c2fcc.tar.gz glibc-18363b4f010da9ba459b13310b113ac0647c2fcc.tar.bz2 glibc-18363b4f010da9ba459b13310b113ac0647c2fcc.zip |
powerpc: Move cache line size to rtld_global_ro
GCC 10.0 enabled -fno-common by default and this started to point that
__cache_line_size had been implemented in 2 different places: loader and
libc.
In order to avoid this duplication, the libc variable has been removed
and the loader variable is moved to rtld_global_ro.
File sysdeps/unix/sysv/linux/powerpc/dl-auxv.h has been added in order
to reuse code for both static and dynamic linking scenarios.
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'sysdeps/powerpc/powerpc64')
-rw-r--r-- | sysdeps/powerpc/powerpc64/a2/memcpy.S | 13 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/memset.S | 11 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/sysdep.h | 24 |
3 files changed, 39 insertions, 9 deletions
diff --git a/sysdeps/powerpc/powerpc64/a2/memcpy.S b/sysdeps/powerpc/powerpc64/a2/memcpy.S index 0e3c435f3c..1162cc2207 100644 --- a/sysdeps/powerpc/powerpc64/a2/memcpy.S +++ b/sysdeps/powerpc/powerpc64/a2/memcpy.S @@ -18,6 +18,7 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <rtld-global-offsets.h> #ifndef MEMCPY # define MEMCPY memcpy @@ -27,8 +28,9 @@ #define ZERO_AHEAD 2 /* no cache lines DST zeroing ahead */ .section ".toc","aw" -.LC0: - .tc __cache_line_size[TC],__cache_line_size +__GLRO_DEF(dl_cache_line_size) + + .section ".text" .align 2 @@ -55,10 +57,11 @@ ENTRY (MEMCPY, 5) */ neg r8,r3 /* LS 4 bits = # bytes to 8-byte dest bdry */ - ld r9,.LC0@toc(r2) /* Get cache line size (part 1) */ + /* Get the cache line size. */ + __GLRO (r9, dl_cache_line_size, + RTLD_GLOBAL_RO_DL_CACHE_LINE_SIZE_OFFSET) clrldi r8,r8,64-4 /* align to 16byte boundary */ sub r7,r4,r3 /* compute offset to src from dest */ - lwz r9,0(r9) /* Get cache line size (part 2) */ cmpldi cr0,r8,0 /* Were we aligned on a 16 byte bdy? */ addi r10,r9,-1 /* Cache line mask */ beq+ L(dst_aligned) @@ -121,7 +124,7 @@ L(dst_aligned): cmpdi cr0,r9,0 /* Cache line size set? */ bne+ cr0,L(cachelineset) -/* __cache_line_size not set: generic byte copy without much optimization */ +/* Cache line size not set: generic byte copy without much optimization */ clrldi. r0,r5,63 /* If length is odd copy one byte */ beq L(cachelinenotset_align) lbz r7,0(r4) /* Read one byte from source */ diff --git a/sysdeps/powerpc/powerpc64/memset.S b/sysdeps/powerpc/powerpc64/memset.S index 857c023755..2fa98e6e2d 100644 --- a/sysdeps/powerpc/powerpc64/memset.S +++ b/sysdeps/powerpc/powerpc64/memset.S @@ -17,10 +17,11 @@ <https://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <rtld-global-offsets.h> .section ".toc","aw" -.LC0: - .tc __cache_line_size[TC],__cache_line_size +__GLRO_DEF(dl_cache_line_size) + .section ".text" .align 2 @@ -146,8 +147,10 @@ L(zloopstart): /* If the remaining length is less the 32 bytes, don't bother getting the cache line size. */ beq L(medium) - ld rCLS,.LC0@toc(r2) - lwz rCLS,0(rCLS) + /* Read the cache line size. */ + __GLRO (rCLS, dl_cache_line_size, + RTLD_GLOBAL_RO_DL_CACHE_LINE_SIZE_OFFSET) + /* If the cache line size was not set just goto to L(nondcbz) which is safe for any cache line size. */ cmpldi cr1,rCLS,0 diff --git a/sysdeps/powerpc/powerpc64/sysdep.h b/sysdeps/powerpc/powerpc64/sysdep.h index aefd29a14d..d6616ac905 100644 --- a/sysdeps/powerpc/powerpc64/sysdep.h +++ b/sysdeps/powerpc/powerpc64/sysdep.h @@ -342,6 +342,30 @@ LT_LABELSUFFIX(name,_name_end): ; \ #define PSEUDO_END_ERRVAL(name) \ END (name) +#ifdef SHARED +# if IS_IN (rtld) + /* Inside ld.so we use the local alias to avoid runtime GOT + relocations. */ +# define __GLRO_DEF(var) \ +.LC__ ## var: \ + .tc _rtld_local_ro[TC],_rtld_local_ro +# else +# define __GLRO_DEF(var) \ +.LC__ ## var: \ + .tc _rtld_global_ro[TC],_rtld_global_ro +# endif +# define __GLRO(rOUT, var, offset) \ + ld rOUT,.LC__ ## var@toc(r2); \ + lwz rOUT,offset(rOUT) +#else +# define __GLRO_DEF(var) \ +.LC__ ## var: \ + .tc _ ## var[TC],_ ## var +# define __GLRO(rOUT, var, offset) \ + ld rOUT,.LC__ ## var@toc(r2); \ + lwz rOUT,0(rOUT) +#endif + #else /* !__ASSEMBLER__ */ #if _CALL_ELF != 2 |