3
3
use super :: auxvec;
4
4
use crate :: detect:: { cache, Feature } ;
5
5
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
+
6
15
/// Try to read the features from the auxiliary vector
7
16
pub ( crate ) fn detect_features ( ) -> cache:: Initializer {
8
17
let mut value = cache:: Initializer :: default ( ) ;
@@ -13,8 +22,17 @@ pub(crate) fn detect_features() -> cache::Initializer {
13
22
} ;
14
23
15
24
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) ;
18
36
return value;
19
37
}
20
38
value
0 commit comments