@ -62,14 +62,12 @@ uint32_t OPENSSL_rdtsc(void)
# if defined(__GNUC__) && __GNUC__>=2
void OPENSSL_cpuid_setup ( void ) __attribute__ ( ( constructor ) ) ;
# endif
/*
* Use a weak reference to getauxval ( ) so we can use it if it is available but
* don ' t break the build if it is not .
*/
# if defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__)
extern unsigned long getauxval ( unsigned long type ) __attribute__ ( ( weak ) ) ;
# else
static unsigned long ( * getauxval ) ( unsigned long ) = NULL ;
# if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
# if __GLIBC_PREREQ(2, 16)
# include <sys / auxv.h>
# define OSSL_IMPLEMENT_GETAUXVAL
# endif
# endif
/*
@ -134,6 +132,33 @@ void OPENSSL_cpuid_setup(void)
*/
# endif
OPENSSL_armcap_P = 0 ;
# ifdef OSSL_IMPLEMENT_GETAUXVAL
if ( getauxval ( HWCAP ) & HWCAP_NEON ) {
unsigned long hwcap = getauxval ( HWCAP_CE ) ;
OPENSSL_armcap_P | = ARMV7_NEON ;
if ( hwcap & HWCAP_CE_AES )
OPENSSL_armcap_P | = ARMV8_AES ;
if ( hwcap & HWCAP_CE_PMULL )
OPENSSL_armcap_P | = ARMV8_PMULL ;
if ( hwcap & HWCAP_CE_SHA1 )
OPENSSL_armcap_P | = ARMV8_SHA1 ;
if ( hwcap & HWCAP_CE_SHA256 )
OPENSSL_armcap_P | = ARMV8_SHA256 ;
# ifdef __aarch64__
if ( hwcap & HWCAP_CE_SHA512 )
OPENSSL_armcap_P | = ARMV8_SHA512 ;
# endif
}
# endif
sigfillset ( & all_masked ) ;
sigdelset ( & all_masked , SIGILL ) ;
sigdelset ( & all_masked , SIGTRAP ) ;
@ -141,8 +166,6 @@ void OPENSSL_cpuid_setup(void)
sigdelset ( & all_masked , SIGBUS ) ;
sigdelset ( & all_masked , SIGSEGV ) ;
OPENSSL_armcap_P = 0 ;
memset ( & ill_act , 0 , sizeof ( ill_act ) ) ;
ill_act . sa_handler = ill_handler ;
ill_act . sa_mask = all_masked ;
@ -150,30 +173,9 @@ void OPENSSL_cpuid_setup(void)
sigprocmask ( SIG_SETMASK , & ill_act . sa_mask , & oset ) ;
sigaction ( SIGILL , & ill_act , & ill_oact ) ;
if ( getauxval ! = NULL ) {
if ( getauxval ( HWCAP ) & HWCAP_NEON ) {
unsigned long hwcap = getauxval ( HWCAP_CE ) ;
OPENSSL_armcap_P | = ARMV7_NEON ;
if ( hwcap & HWCAP_CE_AES )
OPENSSL_armcap_P | = ARMV8_AES ;
if ( hwcap & HWCAP_CE_PMULL )
OPENSSL_armcap_P | = ARMV8_PMULL ;
if ( hwcap & HWCAP_CE_SHA1 )
OPENSSL_armcap_P | = ARMV8_SHA1 ;
if ( hwcap & HWCAP_CE_SHA256 )
OPENSSL_armcap_P | = ARMV8_SHA256 ;
# ifdef __aarch64__
if ( hwcap & HWCAP_CE_SHA512 )
OPENSSL_armcap_P | = ARMV8_SHA512 ;
# endif
}
} else if ( sigsetjmp ( ill_jmp , 1 ) = = 0 ) {
/* If we used getauxval, we already have all the values */
# ifndef OSSL_IMPLEMENT_GETAUXVAL
if ( sigsetjmp ( ill_jmp , 1 ) = = 0 ) {
_armv7_neon_probe ( ) ;
OPENSSL_armcap_P | = ARMV7_NEON ;
if ( sigsetjmp ( ill_jmp , 1 ) = = 0 ) {
@ -191,13 +193,16 @@ void OPENSSL_cpuid_setup(void)
_armv8_sha256_probe ( ) ;
OPENSSL_armcap_P | = ARMV8_SHA256 ;
}
# if defined(__aarch64__) && !defined(__APPLE__)
# if defined(__aarch64__) && !defined(__APPLE__)
if ( sigsetjmp ( ill_jmp , 1 ) = = 0 ) {
_armv8_sha512_probe ( ) ;
OPENSSL_armcap_P | = ARMV8_SHA512 ;
}
# endif
# endif
}
# endif
/* Things that getauxval didn't tell us */
if ( sigsetjmp ( ill_jmp , 1 ) = = 0 ) {
_armv7_tick ( ) ;
OPENSSL_armcap_P | = ARMV7_TICK ;