Victor Do Nascimento <victor.donascime...@arm.com> writes:
> With support for new atomic features in Armv9.4-a being indicated by
> HWCAP2 bits, Libatomic's ifunc resolver must now query its second
> argument, of type __ifunc_arg_t*.
>
> We therefore make this argument known to libatomic, allowing us to
> query hwcap2 bits in the following manner:
>
>   bool
>   resolver (unsigned long hwcap, const __ifunc_arg_t *features);
>   {
>     return (features->hwcap2 & HWCAP2_<FEAT_NAME>);
>   }
>
> libatomic/ChangeLog:
>
>       * config/linux/aarch64/host-config.h (__ifunc_arg_t):
>       Conditionally-defined if `sys/ifunc.h' not found.
>       (_IFUNC_ARG_HWCAP): Likewise.
>       (IFUNC_COND_1): Pass __ifunc_arg_t argument to ifunc.
>       (ifunc1): Modify function signature to accept __ifunc_arg_t
>       argument.
>       * configure.tgt: Add second `const __ifunc_arg_t *features'
>       argument to IFUNC_RESOLVER_ARGS.

OK, thanks.

Richard

> ---
>  libatomic/config/linux/aarch64/host-config.h | 15 +++++++++++++--
>  libatomic/configure.tgt                      |  2 +-
>  2 files changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/libatomic/config/linux/aarch64/host-config.h 
> b/libatomic/config/linux/aarch64/host-config.h
> index 4200293c4e3..8fd4fe3321a 100644
> --- a/libatomic/config/linux/aarch64/host-config.h
> +++ b/libatomic/config/linux/aarch64/host-config.h
> @@ -24,9 +24,20 @@
>  #if HAVE_IFUNC
>  #include <sys/auxv.h>
>  
> +#if __has_include(<sys/ifunc.h>)
> +# include <sys/ifunc.h>
> +#else
> +typedef struct __ifunc_arg_t {
> +  unsigned long _size;
> +  unsigned long _hwcap;
> +  unsigned long _hwcap2;
> +} __ifunc_arg_t;
> +# define _IFUNC_ARG_HWCAP (1ULL << 62)
> +#endif
> +
>  #ifdef HWCAP_USCAT
>  # if N == 16
> -#  define IFUNC_COND_1       ifunc1 (hwcap)
> +#  define IFUNC_COND_1       ifunc1 (hwcap, features)
>  # else
>  #  define IFUNC_COND_1       (hwcap & HWCAP_ATOMICS)
>  # endif
> @@ -48,7 +59,7 @@
>  #define MIDR_PARTNUM(midr)   (((midr) >> 4) & 0xfff)
>  
>  static inline bool
> -ifunc1 (unsigned long hwcap)
> +ifunc1 (unsigned long hwcap, const __ifunc_arg_t *features)
>  {
>    if (hwcap & HWCAP_USCAT)
>      return true;
> diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt
> index b7609132c58..67a5f2dff80 100644
> --- a/libatomic/configure.tgt
> +++ b/libatomic/configure.tgt
> @@ -194,7 +194,7 @@ esac
>  # The type may be different on different architectures.
>  case "${target}" in
>    aarch64*-*-*)
> -     IFUNC_RESOLVER_ARGS="uint64_t hwcap"
> +     IFUNC_RESOLVER_ARGS="uint64_t hwcap, const __ifunc_arg_t *features"
>       ;;
>    *)
>       IFUNC_RESOLVER_ARGS="void"

Reply via email to