@@ -39,63 +39,109 @@ pub(crate) fn detect_features() -> cache::Initializer {
3939 }
4040 } ;
4141
42- let asimd = _sysctlbyname ( c"hw.optional.AdvSIMD" ) ;
43- let pmull = _sysctlbyname ( c"hw.optional.arm.FEAT_PMULL" ) ;
42+ // Armv8.0 features not using the standard identifiers
4443 let fp = _sysctlbyname ( c"hw.optional.floatingpoint" ) ;
45- let fp16 = _sysctlbyname ( c"hw.optional.arm.FEAT_FP16 " ) ;
44+ let asimd = _sysctlbyname ( c"hw.optional.AdvSIMD " ) ;
4645 let crc = _sysctlbyname ( c"hw.optional.armv8_crc32" ) ;
47- let lse = _sysctlbyname ( c"hw.optional.arm.FEAT_LSE" ) ;
48- let lse2 = _sysctlbyname ( c"hw.optional.arm.FEAT_LSE2" ) ;
49- let rdm = _sysctlbyname ( c"hw.optional.arm.FEAT_RDM" ) ;
50- let rcpc = _sysctlbyname ( c"hw.optional.arm.FEAT_LRCPC" ) ;
51- let rcpc2 = _sysctlbyname ( c"hw.optional.arm.FEAT_LRCPC2" ) ;
52- let dotprod = _sysctlbyname ( c"hw.optional.arm.FEAT_DotProd" ) ;
53- let fhm = _sysctlbyname ( c"hw.optional.arm.FEAT_FHM" ) ;
54- let flagm = _sysctlbyname ( c"hw.optional.arm.FEAT_FlagM" ) ;
55- let ssbs = _sysctlbyname ( c"hw.optional.arm.FEAT_SSBS" ) ;
56- let sb = _sysctlbyname ( c"hw.optional.arm.FEAT_SB" ) ;
57- let paca = _sysctlbyname ( c"hw.optional.arm.FEAT_PAuth" ) ;
46+
47+ // Armv8 and Armv9 features using the standard identifiers
48+ let aes = _sysctlbyname ( c"hw.optional.arm.FEAT_AES" ) ;
49+ let bf16 = _sysctlbyname ( c"hw.optional.arm.FEAT_BF16" ) ;
50+ let bti = _sysctlbyname ( c"hw.optional.arm.FEAT_BTI" ) ;
51+ let dit = _sysctlbyname ( c"hw.optional.arm.FEAT_DIT" ) ;
5852 let dpb = _sysctlbyname ( c"hw.optional.arm.FEAT_DPB" ) ;
5953 let dpb2 = _sysctlbyname ( c"hw.optional.arm.FEAT_DPB2" ) ;
54+ let dotprod = _sysctlbyname ( c"hw.optional.arm.FEAT_DotProd" ) ;
55+ let ecv = _sysctlbyname ( c"hw.optional.arm.FEAT_ECV" ) ;
56+ let fcma = _sysctlbyname ( c"hw.optional.arm.FEAT_FCMA" ) ;
57+ let fhm = _sysctlbyname ( c"hw.optional.arm.FEAT_FHM" ) ;
58+ let fp16 = _sysctlbyname ( c"hw.optional.arm.FEAT_FP16" ) ;
6059 let frintts = _sysctlbyname ( c"hw.optional.arm.FEAT_FRINTTS" ) ;
60+ let flagm = _sysctlbyname ( c"hw.optional.arm.FEAT_FlagM" ) ;
61+ let flagm2 = _sysctlbyname ( c"hw.optional.arm.FEAT_FlagM2" ) ;
6162 let i8mm = _sysctlbyname ( c"hw.optional.arm.FEAT_I8MM" ) ;
62- let bf16 = _sysctlbyname ( c"hw.optional.arm.FEAT_BF16" ) ;
63- let bti = _sysctlbyname ( c"hw.optional.arm.FEAT_BTI" ) ;
64- let fcma = _sysctlbyname ( c"hw.optional.arm.FEAT_FCMA" ) ;
65- let aes = _sysctlbyname ( c"hw.optional.arm.FEAT_AES" ) ;
63+ let jsconv = _sysctlbyname ( c"hw.optional.arm.FEAT_JSCVT" ) ;
64+ let rcpc = _sysctlbyname ( c"hw.optional.arm.FEAT_LRCPC" ) ;
65+ let rcpc2 = _sysctlbyname ( c"hw.optional.arm.FEAT_LRCPC2" ) ;
66+ let lse = _sysctlbyname ( c"hw.optional.arm.FEAT_LSE" ) ;
67+ let lse2 = _sysctlbyname ( c"hw.optional.arm.FEAT_LSE2" ) ;
68+ let pauth = _sysctlbyname ( c"hw.optional.arm.FEAT_PAuth" ) ;
69+ let pmull = _sysctlbyname ( c"hw.optional.arm.FEAT_PMULL" ) ;
70+ let rdm = _sysctlbyname ( c"hw.optional.arm.FEAT_RDM" ) ;
71+ let sb = _sysctlbyname ( c"hw.optional.arm.FEAT_SB" ) ;
6672 let sha1 = _sysctlbyname ( c"hw.optional.arm.FEAT_SHA1" ) ;
67- let sha2 = _sysctlbyname ( c"hw.optional.arm.FEAT_SHA256" ) ;
73+ let sha256 = _sysctlbyname ( c"hw.optional.arm.FEAT_SHA256" ) ;
6874 let sha3 = _sysctlbyname ( c"hw.optional.arm.FEAT_SHA3" ) ;
6975 let sha512 = _sysctlbyname ( c"hw.optional.arm.FEAT_SHA512" ) ;
70- let jsconv = _sysctlbyname ( c"hw.optional.arm.FEAT_JSCVT" ) ;
76+ let sme = _sysctlbyname ( c"hw.optional.arm.FEAT_SME" ) ;
77+ let sme2 = _sysctlbyname ( c"hw.optional.arm.FEAT_SME2" ) ;
78+ let sme_f64f64 = _sysctlbyname ( c"hw.optional.arm.FEAT_SME_F64F64" ) ;
79+ let sme_i16i64 = _sysctlbyname ( c"hw.optional.arm.FEAT_SME_I16I64" ) ;
80+ let ssbs = _sysctlbyname ( c"hw.optional.arm.FEAT_SSBS" ) ;
81+ let wfxt = _sysctlbyname ( c"hw.optional.arm.FEAT_WFxT" ) ;
82+
83+ // The following features are not exposed by `is_aarch64_feature_detected`,
84+ // but *are* reported by `sysctl`. They are here as documentation that they
85+ // exist, and may potentially be exposed later.
86+ /*
87+ let afp = _sysctlbyname(c"hw.optional.arm.FEAT_AFP");
88+ let csv2 = _sysctlbyname(c"hw.optional.arm.FEAT_CSV2");
89+ let csv3 = _sysctlbyname(c"hw.optional.arm.FEAT_CSV3");
90+ let fpac = _sysctlbyname(c"hw.optional.arm.FEAT_FPAC");
91+ let pauth2 = _sysctlbyname(c"hw.optional.arm.FEAT_PAuth2");
92+ let rpres = _sysctlbyname(c"hw.optional.arm.FEAT_RPRES");
93+ let specres = _sysctlbyname(c"hw.optional.arm.FEAT_SPECRES");
94+ */
7195
96+ // The following "features" are reported by `sysctl` but are mandatory parts
97+ // of SME or SME2, and so are not exposed separately by
98+ // `is_aarch64_feature_detected`. They are here to document their
99+ // existence, in case they're needed in the future.
100+ /*
101+ let sme_b16f32 = _sysctlbyname(c"hw.optional.arm.SME_B16F32");
102+ let sme_bi32i32 = _sysctlbyname(c"hw.optional.arm.SME_BI32I32");
103+ let sme_f16f32 = _sysctlbyname(c"hw.optional.arm.SME_F16F32");
104+ let sme_f32f32 = _sysctlbyname(c"hw.optional.arm.SME_F32F32");
105+ let sme_i16i32 = _sysctlbyname(c"hw.optional.arm.SME_I16I32");
106+ let sme_i8i32 = _sysctlbyname(c"hw.optional.arm.SME_I8I32");
107+ */
108+
109+ enable_feature ( Feature :: aes, aes && pmull) ;
72110 enable_feature ( Feature :: asimd, asimd) ;
73- enable_feature ( Feature :: pmull, pmull) ;
74- enable_feature ( Feature :: fp, fp) ;
75- enable_feature ( Feature :: fp16, fp16) ;
111+ enable_feature ( Feature :: bf16, bf16) ;
112+ enable_feature ( Feature :: bti, bti) ;
76113 enable_feature ( Feature :: crc, crc) ;
77- enable_feature ( Feature :: lse, lse) ;
78- enable_feature ( Feature :: lse2, lse2) ;
79- enable_feature ( Feature :: rdm, rdm) ;
80- enable_feature ( Feature :: rcpc, rcpc) ;
81- enable_feature ( Feature :: rcpc2, rcpc2) ;
114+ enable_feature ( Feature :: dit, dit) ;
82115 enable_feature ( Feature :: dotprod, dotprod) ;
83- enable_feature ( Feature :: fhm, fhm) ;
84- enable_feature ( Feature :: flagm, flagm) ;
85- enable_feature ( Feature :: ssbs, ssbs) ;
86- enable_feature ( Feature :: sb, sb) ;
87- enable_feature ( Feature :: paca, paca) ;
88116 enable_feature ( Feature :: dpb, dpb) ;
89117 enable_feature ( Feature :: dpb2, dpb2) ;
118+ enable_feature ( Feature :: ecv, ecv) ;
119+ enable_feature ( Feature :: fcma, fcma) ;
120+ enable_feature ( Feature :: fhm, fhm) ;
121+ enable_feature ( Feature :: flagm, flagm) ;
122+ enable_feature ( Feature :: flagm2, flagm2) ;
123+ enable_feature ( Feature :: fp, fp) ;
124+ enable_feature ( Feature :: fp16, fp16) ;
90125 enable_feature ( Feature :: frintts, frintts) ;
91126 enable_feature ( Feature :: i8mm, i8mm) ;
92- enable_feature ( Feature :: bf16, bf16) ;
93- enable_feature ( Feature :: bti, bti) ;
94- enable_feature ( Feature :: fcma, fcma) ;
95- enable_feature ( Feature :: aes, aes && pmull) ;
96127 enable_feature ( Feature :: jsconv, jsconv) ;
97- enable_feature ( Feature :: sha2, sha1 && sha2 && asimd) ;
128+ enable_feature ( Feature :: lse, lse) ;
129+ enable_feature ( Feature :: lse2, lse2) ;
130+ enable_feature ( Feature :: paca, pauth) ;
131+ enable_feature ( Feature :: pacg, pauth) ;
132+ enable_feature ( Feature :: pmull, aes && pmull) ;
133+ enable_feature ( Feature :: rcpc, rcpc) ;
134+ enable_feature ( Feature :: rcpc2, rcpc2) ;
135+ enable_feature ( Feature :: rdm, rdm) ;
136+ enable_feature ( Feature :: sb, sb) ;
137+ enable_feature ( Feature :: sha2, sha1 && sha256 && asimd) ;
98138 enable_feature ( Feature :: sha3, sha512 && sha3 && asimd) ;
139+ enable_feature ( Feature :: sme, sme) ;
140+ enable_feature ( Feature :: sme2, sme2) ;
141+ enable_feature ( Feature :: sme_f64f64, sme_f64f64) ;
142+ enable_feature ( Feature :: sme_i16i64, sme_i16i64) ;
143+ enable_feature ( Feature :: ssbs, ssbs) ;
144+ enable_feature ( Feature :: wfxt, wfxt) ;
99145
100146 value
101147}
0 commit comments