aarch64: Move and update the definition of MTE_ENABLED

The hwcap value is now in linux 5.10 and in glibc bits/hwcap.h, so use
that definition.

Move the definition to init-arch.h so all ifunc selectors can use it
and expose an "mte" shorthand for mte enabled runtime.

For now we allow user code to enable tag checks and use PROT_MTE
mappings without libc involvment, this is not guaranteed ABI, but
can be useful for testing and debugging with MTE.
This commit is contained in:
Szabolcs Nagy 2021-01-22 16:14:05 +00:00
parent 31f6488722
commit c3c4a25e65
2 changed files with 11 additions and 11 deletions

View File

@ -17,9 +17,18 @@
<https://www.gnu.org/licenses/>. */
#include <ldsodefs.h>
#include <sys/auxv.h>
/* Make glibc MTE-safe on a system that supports MTE in case user code
enables tag checks independently of the mte_status of glibc. There
is currently no ABI contract for enabling tag checks in user code,
but this can be useful for debugging with MTE. */
#define MTE_ENABLED() (GLRO(dl_hwcap2) & HWCAP2_MTE)
#define INIT_ARCH() \
uint64_t __attribute__((unused)) midr = \
GLRO(dl_aarch64_cpu_features).midr_el1; \
unsigned __attribute__((unused)) zva_size = \
GLRO(dl_aarch64_cpu_features).zva_size;
GLRO(dl_aarch64_cpu_features).zva_size; \
bool __attribute__((unused)) mte = \
MTE_ENABLED ();

View File

@ -26,21 +26,12 @@
# include <string.h>
# include <init-arch.h>
/* This should check HWCAP2_MTE when it is available: current
linux kernel does not expose it, but its value is reserved.
This is needed to make glibc MTE-safe on future systems in
case user code enables MTE. The ABI contract for enabling
MTE is not yet specified, but it can be useful for at least
debugging which does not need a contract. */
#define FUTURE_HWCAP2_MTE (1 << 18)
#define MTE_ENABLED() (GLRO(dl_hwcap2) & FUTURE_HWCAP2_MTE)
extern __typeof (__redirect_strlen) __strlen;
extern __typeof (__redirect_strlen) __strlen_mte attribute_hidden;
extern __typeof (__redirect_strlen) __strlen_asimd attribute_hidden;
libc_ifunc (__strlen, (MTE_ENABLED () ? __strlen_mte : __strlen_asimd));
libc_ifunc (__strlen, (mte ? __strlen_mte : __strlen_asimd));
# undef strlen
strong_alias (__strlen, strlen);