[v2] aarch64: Fix the list of tested IFUNC variants [BZ #26818]
Commit Message
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.
---
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(-)
Comments
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 ();
>
@@ -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;
@@ -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 ();