Skip to content

Commit cfba59f

Browse files
authored
Work-around buggy Intel chips erroneously reporting BMI1/BMI2 support (rust-lang#1249)
1 parent 38e518f commit cfba59f

File tree

1 file changed

+20
-0
lines changed
  • crates/std_detect/src/detect/os

1 file changed

+20
-0
lines changed

crates/std_detect/src/detect/os/x86.rs

+20
Original file line numberDiff line numberDiff line change
@@ -249,5 +249,25 @@ pub(crate) fn detect_features() -> cache::Initializer {
249249
}
250250
}
251251

252+
// Unfortunately, some Skylake chips erroneously report support for BMI1 and
253+
// BMI2 without actual support. These chips don't support AVX, and it seems
254+
// that all Intel chips with non-erroneous support BMI do (I didn't check
255+
// other vendors), so we can disable these flags for chips that don't also
256+
// report support for AVX.
257+
//
258+
// It's possible this will pessimize future chips that do support BMI and
259+
// not AVX, but this seems minor compared to a hard crash you get when
260+
// executing an unsupported instruction (to put it another way, it's safe
261+
// for us to under-report CPU features, but not to over-report them). Still,
262+
// to limit any impact this may have in the future, we only do this for
263+
// Intel chips, as it's a bug only present in their chips.
264+
//
265+
// This bug is documented as `SKL052` in the errata section of this document:
266+
// http://www.intel.com/content/dam/www/public/us/en/documents/specification-updates/desktop-6th-gen-core-family-spec-update.pdf
267+
if vendor_id == *b"GenuineIntel" && !value.test(Feature::avx as u32) {
268+
value.unset(Feature::bmi1 as u32);
269+
value.unset(Feature::bmi2 as u32);
270+
}
271+
252272
value
253273
}

0 commit comments

Comments
 (0)