When to use AT_HWCAP or AT_HWCAP2
Jeffrey Walton
noloader@gmail.com
Mon Aug 7 14:27:00 GMT 2017
On Mon, Aug 7, 2017 at 10:08 AM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> ...
> For instance, to check for hardware AES support on AArch64 you will
> need to check for AT_HWCAP & HWCAP_AES, while for AArch64 you will
> need to check for AT_HWCAP2 & HWCAP2_AES.
OK, thanks. So the detection code might look something like:
bool HasPMULL()
{
# if defined(__linux__) && defined(__aarch64__)
if (getauxval(AT_HWCAP) & HWCAP_PMULL)
return true;
# elif defined(__linux__) && defined(__aarch32__)
if (getauxval(AT_HWCAP2) & HWCAP2_PMULL)
return true;
# endif
}
(We are trying to guard at runtime, but need need to make the compile
decisions at compile time).
> For instance the test:
>
> ---
> #include <stdio.h>
> #include <sys/auxv.h>
>
> int main (void)
> {
> printf ("0x%lx\n", getauxval (AT_HWCAP));
> printf ("0x%lx\n", getauxval (AT_HWCAP2));
> return 0;
> }
> ---
>
> Run on same machine (3.19.0-33-generic aarch64):
>
> $ ./test-aarch64
> 0x7
> 0x0
> $ ./test-aarch32 # on a sysroot
> 0x37b0d6
> 0x0
Thanks. That's kind of unexpected (to me) because:
> cat /usr/include/asm-arm/hwcap.h
...
/*
* HWCAP2 flags - for elf_hwcap2 (in kernel) and AT_HWCAP2
*/
#define HWCAP2_AES (1 << 0)
#define HWCAP2_PMULL (1 << 1)
#define HWCAP2_SHA1 (1 << 2)
#define HWCAP2_SHA2 (1 << 3)
#define HWCAP2_CRC32 (1 << 4)
I would expect the second test (test-aarch32) to be non-zero if the
features are present. Even old Mustang boards have CRC32, so the CRC32
bit should be set.
Jeff
More information about the Libc-help
mailing list