X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/98421fc1a6832ad5de4b3f6171852437aa3e0fb2..b7715b9ac9cd85dd1d5018f27ea3f0eea02f20ff:/base/dispatch.c diff --git a/base/dispatch.c b/base/dispatch.c index 51619d50..b70d44b6 100644 --- a/base/dispatch.c +++ b/base/dispatch.c @@ -205,13 +205,12 @@ static int xmm_registers_available_p(void) /* Try to find the system's definitions for auxiliary vector entries. */ #ifdef HAVE_SYS_AUXV_H # include -#else -# ifdef HAVE_LINUX_AUXVEC_H -# include -# endif -# ifdef HAVE_ASM_HWCAP_H -# include -# endif +#endif +#ifdef HAVE_LINUX_AUXVEC_H +# include +#endif +#ifdef HAVE_ASM_HWCAP_H +# include #endif /* The type of entries in the auxiliary vector. I'm assuming that `unsigned @@ -230,6 +229,11 @@ struct auxentry { unsigned long type; union auxval value; }; # define WANT_AT_HWCAP(_) _(AT_HWCAP, u, hwcap) #endif +#if defined(AT_HWCAP2) && CPUFAM_ARMEL +# define WANT_ANY 1 +# define WANT_AT_HWCAP2(_) _(AT_HWCAP2, u, hwcap2) +#endif + /* If we couldn't find any interesting entries then we can switch all of this * machinery off. Also do that if we have no means for atomic updates. */ @@ -247,6 +251,9 @@ static unsigned hwcaps = 0; #ifndef WANT_AT_HWCAP # define WANT_AT_HWCAP(_) #endif +#ifndef WANT_AT_HWCAP2 +# define WANT_AT_HWCAP2(_) +#endif /* For each CPU family, define two lists. * @@ -262,12 +269,14 @@ static unsigned hwcaps = 0; */ #if CPUFAM_ARMEL # define WANTAUX(_) \ - WANT_AT_HWCAP(_) + WANT_AT_HWCAP(_) \ + WANT_AT_HWCAP2(_) # define CAPMAP(_) \ _(ARM_VFP, "arm:vfp") \ _(ARM_NEON, "arm:neon") \ _(ARM_V4, "arm:v4") \ - _(ARM_D32, "arm:d32") + _(ARM_D32, "arm:d32") \ + _(ARM_AES, "arm:aes") #endif /* Build the bitmask for `hwcaps' from the `CAPMAP' list. */ @@ -320,8 +329,8 @@ static void probe_hwcaps(void) /* Shiny new libc lets us request individual entry types. This is almost * too easy. */ -# define CAP__GET(type, slot, ubranch) \ - probed.slot.ubranch = (AUXUTYPE_##ubranch)getauxval(type); +# define CAP__GET(type, ubranch, slot) \ + probed.slot = (AUXUTYPE_##ubranch)getauxval(type); WANTAUX(CAP__GET) #else /* Otherwise we're a bit stuck, really. Modern Linux kernels make a copy @@ -378,6 +387,9 @@ static void probe_hwcaps(void) if (probed.hwcap & HWCAP_NEON) hw |= HF_ARM_NEON; if (probed.hwcap & HWCAP_VFPD32) hw |= HF_ARM_D32; if (probed.hwcap & HWCAP_VFPv4) hw |= HF_ARM_V4; +# ifdef HWCAP2_AES + if (probed.hwcap2 & HWCAP2_AES) hw |= HF_ARM_AES; +# endif #endif /* Store the bitmask of features we probed for everyone to see. */