33use super :: auxvec;
44use crate :: detect:: { cache, Feature } ;
55
6+ // Defined in machine/elf.h.
7+ // https://github.com/freebsd/freebsd-src/blob/deb63adf945d446ed91a9d84124c71f15ae571d1/sys/arm/include/elf.h
8+ const HWCAP_NEON : usize = 0x00001000 ;
9+ const HWCAP2_AES : usize = 0x00000001 ;
10+ const HWCAP2_PMULL : usize = 0x00000002 ;
11+ const HWCAP2_SHA1 : usize = 0x00000004 ;
12+ const HWCAP2_SHA2 : usize = 0x00000008 ;
13+ const HWCAP2_CRC32 : usize = 0x00000010 ;
14+
615/// Try to read the features from the auxiliary vector
716pub ( crate ) fn detect_features ( ) -> cache:: Initializer {
817 let mut value = cache:: Initializer :: default ( ) ;
@@ -13,8 +22,17 @@ pub(crate) fn detect_features() -> cache::Initializer {
1322 } ;
1423
1524 if let Ok ( auxv) = auxvec:: auxv ( ) {
16- enable_feature ( & mut value, Feature :: neon, auxv. hwcap & 0x00001000 != 0 ) ;
17- enable_feature ( & mut value, Feature :: pmull, auxv. hwcap2 & 0x00000002 != 0 ) ;
25+ enable_feature ( & mut value, Feature :: neon, auxv. hwcap & HWCAP_NEON != 0 ) ;
26+ let pmull = auxv. hwcap2 & HWCAP2_PMULL != 0 ;
27+ enable_feature ( & mut value, Feature :: pmull, pmull) ;
28+ enable_feature ( & mut value, Feature :: crc, auxv. hwcap2 & HWCAP2_CRC32 != 0 ) ;
29+ let aes = auxv. hwcap2 & HWCAP2_AES != 0 ;
30+ enable_feature ( & mut value, Feature :: aes, aes) ;
31+ // SHA2 requires SHA1 & SHA2 features
32+ let sha1 = auxv. hwcap2 & HWCAP2_SHA1 != 0 ;
33+ let sha2 = auxv. hwcap2 & HWCAP2_SHA2 != 0 ;
34+ enable_feature ( & mut value, Feature :: sha2, sha1 && sha2) ;
35+ enable_feature ( & mut value, Feature :: crypto, aes && pmull && sha1 && sha2) ;
1836 return value;
1937 }
2038 value
0 commit comments