Message ID | 20210125124655.GN3445@arm.com |
---|---|
State | New |
Headers | show |
Series | [v2] aarch64: Fix the list of tested IFUNC variants [BZ #26818] | expand |
On 25/01/2021 09:46, Szabolcs Nagy via Libc-alpha wrote: > 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. LGTM to 2.33, thanks. > --- > > v2: > - memset variants are mte compatible, so no reason to disable them > for an mte enabled system. > > sysdeps/aarch64/multiarch/ifunc-impl-list.c | 8 ++++---- > sysdeps/aarch64/multiarch/init-arch.h | 2 ++ > 2 files changed, 6 insertions(+), 4 deletions(-) > > diff --git a/sysdeps/aarch64/multiarch/ifunc-impl-list.c b/sysdeps/aarch64/multiarch/ifunc-impl-list.c > index a69eae65f0..99a8c68aac 100644 > --- a/sysdeps/aarch64/multiarch/ifunc-impl-list.c > +++ b/sysdeps/aarch64/multiarch/ifunc-impl-list.c > @@ -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; > diff --git a/sysdeps/aarch64/multiarch/init-arch.h b/sysdeps/aarch64/multiarch/init-arch.h > index fce260d168..a167699e74 100644 > --- a/sysdeps/aarch64/multiarch/init-arch.h > +++ b/sysdeps/aarch64/multiarch/init-arch.h > @@ -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 (); >
diff --git a/sysdeps/aarch64/multiarch/ifunc-impl-list.c b/sysdeps/aarch64/multiarch/ifunc-impl-list.c index a69eae65f0..99a8c68aac 100644 --- a/sysdeps/aarch64/multiarch/ifunc-impl-list.c +++ b/sysdeps/aarch64/multiarch/ifunc-impl-list.c @@ -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; diff --git a/sysdeps/aarch64/multiarch/init-arch.h b/sysdeps/aarch64/multiarch/init-arch.h index fce260d168..a167699e74 100644 --- a/sysdeps/aarch64/multiarch/init-arch.h +++ b/sysdeps/aarch64/multiarch/init-arch.h @@ -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 ();