]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
aarch64: Fix the list of tested IFUNC variants [BZ #26818]
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Fri, 22 Jan 2021 16:57:32 +0000 (16:57 +0000)
committerSzabolcs Nagy <szabolcs.nagy@arm.com>
Mon, 25 Jan 2021 16:15:54 +0000 (16:15 +0000)
Some IFUNC variants are not compatible with BTI and MTE so don't
set them as usable for testing and benchmarking on a BTI or MTE
enabled system.

As far as IFUNC selectors are concerned a system is BTI enabled if
the cpu supports it and glibc was built with BTI branch protection.

Most IFUNC variants are BTI compatible, but thunderx2 memcpy and
memmove use a jump table with indirect jump, without a BTI j.

Fixes bug 26818.

sysdeps/aarch64/multiarch/ifunc-impl-list.c
sysdeps/aarch64/multiarch/init-arch.h

index a69eae65f0c4e1aac63ba5e901ed79365024dc28..99a8c68aaca0b94303da1dbee37f6f04d57a92dd 100644 (file)
@@ -40,13 +40,13 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
   /* Support sysdeps/aarch64/multiarch/memcpy.c and memmove.c.  */
   IFUNC_IMPL (i, name, memcpy,
              IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_thunderx)
-             IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_thunderx2)
+             IFUNC_IMPL_ADD (array, i, memcpy, !bti, __memcpy_thunderx2)
              IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_falkor)
              IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_simd)
              IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_generic))
   IFUNC_IMPL (i, name, memmove,
              IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_thunderx)
-             IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_thunderx2)
+             IFUNC_IMPL_ADD (array, i, memmove, !bti, __memmove_thunderx2)
              IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_falkor)
              IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_simd)
              IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_generic))
@@ -58,11 +58,11 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
              IFUNC_IMPL_ADD (array, i, memset, 1, __memset_kunpeng)
              IFUNC_IMPL_ADD (array, i, memset, 1, __memset_generic))
   IFUNC_IMPL (i, name, memchr,
-             IFUNC_IMPL_ADD (array, i, memchr, 1, __memchr_nosimd)
+             IFUNC_IMPL_ADD (array, i, memchr, !mte, __memchr_nosimd)
              IFUNC_IMPL_ADD (array, i, memchr, 1, __memchr_generic))
 
   IFUNC_IMPL (i, name, strlen,
-             IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_asimd)
+             IFUNC_IMPL_ADD (array, i, strlen, !mte, __strlen_asimd)
              IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_mte))
 
   return i;
index fce260d16868668a26b8fa44cbd4742d81786733..a167699e74f49d582237c1a61ddc79ee37bcac5e 100644 (file)
@@ -30,5 +30,7 @@
     GLRO(dl_aarch64_cpu_features).midr_el1;                                  \
   unsigned __attribute__((unused)) zva_size =                                \
     GLRO(dl_aarch64_cpu_features).zva_size;                                  \
+  bool __attribute__((unused)) bti =                                         \
+    HAVE_AARCH64_BTI && GLRO(dl_aarch64_cpu_features).bti;                   \
   bool __attribute__((unused)) mte =                                         \
     MTE_ENABLED ();