1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-06-29 22:21:48 +03:00

ARM: Add support for AT_HWCAP2 in _dl_procinfo

Add support for the new HWCAP2 values for ARMv8 added in the
3.15 kernel. Tested using QEMU which supports these extensions.

ChangeLog:

2014-06-25  Will Newton  <will.newton@linaro.org>

	* sysdeps/unix/sysv/linux/arm/dl-procinfo.c
	(_dl_arm_cap_flags): Add HWCAP2 values.
	* sysdeps/unix/sysv/linux/arm/dl-procinfo.h
	(_DL_HWCAP_COUNT): Increase to 37.
	(_DL_HWCAP_LAST): New define.
	(_DL_HWCAP2_LAST): New define.
	(_dl_procinfo): Add support for printing
	AT_HWCAP2 entries.
	(_dl_string_hwcap): Use _dl_hwcap_string.
This commit is contained in:
Will Newton
2014-06-25 12:21:17 +01:00
parent 6eaa65cefb
commit 9aea0cb842
3 changed files with 57 additions and 29 deletions

View File

@ -1,3 +1,15 @@
2014-06-25 Will Newton <will.newton@linaro.org>
* sysdeps/unix/sysv/linux/arm/dl-procinfo.c
(_dl_arm_cap_flags): Add HWCAP2 values.
* sysdeps/unix/sysv/linux/arm/dl-procinfo.h
(_DL_HWCAP_COUNT): Increase to 37.
(_DL_HWCAP_LAST): New define.
(_DL_HWCAP2_LAST): New define.
(_dl_procinfo): Add support for printing
AT_HWCAP2 entries.
(_dl_string_hwcap): Use _dl_hwcap_string.
2014-06-25 Adhemerval Zanella <azanella@linux.vnet.ibm.com> 2014-06-25 Adhemerval Zanella <azanella@linux.vnet.ibm.com>
* sysdeps/powerpc/fpu/libm-test-ulps: Update. * sysdeps/powerpc/fpu/libm-test-ulps: Update.

View File

@ -23,7 +23,7 @@
If anything should be added here check whether the size of each string If anything should be added here check whether the size of each string
is still ok with the given array size. is still ok with the given array size.
All the #ifdefs in the definitions ar equite irritating but All the #ifdefs in the definitions are quite irritating but
necessary if we want to avoid duplicating the information. There necessary if we want to avoid duplicating the information. There
are three different modes: are three different modes:
@ -46,13 +46,14 @@
#if !defined PROCINFO_DECL && defined SHARED #if !defined PROCINFO_DECL && defined SHARED
._dl_arm_cap_flags ._dl_arm_cap_flags
#else #else
PROCINFO_CLASS const char _dl_arm_cap_flags[22][10] PROCINFO_CLASS const char _dl_arm_cap_flags[37][10]
#endif #endif
#ifndef PROCINFO_DECL #ifndef PROCINFO_DECL
= { = {
"swp", "half", "thumb", "26bit", "fastmult", "fpa", "vfp", "edsp", "swp", "half", "thumb", "26bit", "fastmult", "fpa", "vfp", "edsp",
"java", "iwmmxt", "crunch", "thumbee", "neon", "vfpv3", "vfpv3d16", "java", "iwmmxt", "crunch", "thumbee", "neon", "vfpv3", "vfpv3d16",
"tls", "vfpv4", "idiva", "idivt", "vfpd32", "lpae", "evtstrm", "tls", "vfpv4", "idiva", "idivt", "vfpd32", "lpae", "evtstrm",
"aes", "pmull", "sha1", "sha2", "crc32",
} }
#endif #endif
#if !defined SHARED || defined PROCINFO_DECL #if !defined SHARED || defined PROCINFO_DECL

View File

@ -23,33 +23,18 @@
#include <ldsodefs.h> #include <ldsodefs.h>
#include <sysdep.h> #include <sysdep.h>
#define _DL_HWCAP_COUNT 22 #define _DL_HWCAP_COUNT 37
/* Low 22 bits are allocated in HWCAP. */
#define _DL_HWCAP_LAST 21
/* Low 5 bits are allocated in HWCAP2. */
#define _DL_HWCAP2_LAST 4
/* The kernel provides platform data but it is not interesting. */ /* The kernel provides platform data but it is not interesting. */
#define _DL_HWCAP_PLATFORM 0 #define _DL_HWCAP_PLATFORM 0
static inline int
__attribute__ ((unused))
_dl_procinfo (unsigned int type, unsigned long int word)
{
int i;
/* Fallback to unknown output mechanism. */
if (type == AT_HWCAP2)
return -1;
_dl_printf ("AT_HWCAP: ");
for (i = 0; i < _DL_HWCAP_COUNT; ++i)
if (word & (1 << i))
_dl_printf (" %s", GLRO(dl_arm_cap_flags)[i]);
_dl_printf ("\n");
return 0;
}
static inline const char * static inline const char *
__attribute__ ((unused)) __attribute__ ((unused))
_dl_hwcap_string (int idx) _dl_hwcap_string (int idx)
@ -57,17 +42,47 @@ _dl_hwcap_string (int idx)
return GLRO(dl_arm_cap_flags)[idx]; return GLRO(dl_arm_cap_flags)[idx];
}; };
static inline int
__attribute__ ((unused))
_dl_procinfo (unsigned int type, unsigned long int word)
{
switch(type)
{
case AT_HWCAP:
_dl_printf ("AT_HWCAP: ");
for (int i = 0; i <= _DL_HWCAP_LAST; ++i)
if (word & (1 << i))
_dl_printf (" %s", _dl_hwcap_string (i));
break;
case AT_HWCAP2:
{
unsigned int offset = _DL_HWCAP_LAST + 1;
_dl_printf ("AT_HWCAP2: ");
for (int i = 0; i <= _DL_HWCAP2_LAST; ++i)
if (word & (1 << i))
_dl_printf (" %s", _dl_hwcap_string (offset + i));
break;
}
default:
/* This should not happen. */
return -1;
}
_dl_printf ("\n");
return 0;
}
#define HWCAP_IMPORTANT (HWCAP_ARM_VFP | HWCAP_ARM_NEON) #define HWCAP_IMPORTANT (HWCAP_ARM_VFP | HWCAP_ARM_NEON)
static inline int static inline int
__attribute__ ((unused)) __attribute__ ((unused))
_dl_string_hwcap (const char *str) _dl_string_hwcap (const char *str)
{ {
int i; for (int i = 0; i < _DL_HWCAP_COUNT; i++)
for (i = 0; i < _DL_HWCAP_COUNT; i++)
{ {
if (strcmp (str, GLRO(dl_arm_cap_flags)[i]) == 0) if (strcmp (str, _dl_hwcap_string (i)) == 0)
return i; return i;
} }
return -1; return -1;