diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-18 02:49:50 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-18 02:49:50 +0000 |
commit | 9835e2ae736235810b4ea1c162ca5e65c547e770 (patch) | |
tree | 3fcebf40ed70e581d776a8a4c65923e8ec20e026 /library/stdarch/crates/std_detect | |
parent | Releasing progress-linux version 1.70.0+dfsg2-1~progress7.99u1. (diff) | |
download | rustc-9835e2ae736235810b4ea1c162ca5e65c547e770.tar.xz rustc-9835e2ae736235810b4ea1c162ca5e65c547e770.zip |
Merging upstream version 1.71.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'library/stdarch/crates/std_detect')
6 files changed, 33 insertions, 41 deletions
diff --git a/library/stdarch/crates/std_detect/README.md b/library/stdarch/crates/std_detect/README.md index 71f474d65..521177104 100644 --- a/library/stdarch/crates/std_detect/README.md +++ b/library/stdarch/crates/std_detect/README.md @@ -30,14 +30,19 @@ run-time feature detection. When this feature is disabled, `std_detect` assumes that [`getauxval`] is linked to the binary. If that is not the case the behavior is undefined. - Note: This feature is ignored on `*-linux-gnu*` targets, since all `*-linux-gnu*` targets ([since Rust 1.64](https://blog.rust-lang.org/2022/08/01/Increasing-glibc-kernel-requirements.html)) have glibc requirements higher than [glibc 2.16 that added `getauxval`](https://sourceware.org/legacy-ml/libc-announce/2012/msg00000.html), and we can safely assume [`getauxval`] is linked to the binary. + Note: This feature is ignored on `*-linux-gnu*` and `*-android*` targets + because we can safely assume `getauxval` is linked to the binary. + * `*-linux-gnu*` targets ([since Rust 1.64](https://blog.rust-lang.org/2022/08/01/Increasing-glibc-kernel-requirements.html)) + have glibc requirements higher than [glibc 2.16 that added `getauxval`](https://sourceware.org/legacy-ml/libc-announce/2012/msg00000.html). + * `*-android*` targets ([since Rust 1.68](https://blog.rust-lang.org/2023/01/09/android-ndk-update-r25.html)) + have the minimum supported API level higher than [Android 4.3 (API level 18) that added `getauxval`](https://github.com/aosp-mirror/platform_bionic/blob/d3ebc2f7c49a9893b114124d4a6b315f3a328764/libc/include/sys/auxv.h#L49). * `std_detect_file_io` (enabled by default, requires `std`): Enable to perform run-time feature detection using file APIs (e.g. `/proc/cpuinfo`, etc.) if other more performant methods fail. This feature requires `libstd` as a dependency, preventing the crate from working on applications in which `std` is not available. -[`getauxval`]: http://man7.org/linux/man-pages/man3/getauxval.3.html +[`getauxval`]: https://man7.org/linux/man-pages/man3/getauxval.3.html # Platform support diff --git a/library/stdarch/crates/std_detect/src/detect/arch/arm.rs b/library/stdarch/crates/std_detect/src/detect/arch/arm.rs index 897dc314c..a7dea27fb 100644 --- a/library/stdarch/crates/std_detect/src/detect/arch/arm.rs +++ b/library/stdarch/crates/std_detect/src/detect/arch/arm.rs @@ -17,8 +17,6 @@ features! { /// Polynomial Multiply @FEATURE: #[unstable(feature = "stdsimd", issue = "27731")] crc: "crc"; /// CRC32 (Cyclic Redundancy Check) - @FEATURE: #[unstable(feature = "stdsimd", issue = "27731")] crypto: "crypto"; - /// Crypto: AES + PMULL + SHA1 + SHA256. Prefer using the individual features where possible. @FEATURE: #[unstable(feature = "stdsimd", issue = "27731")] aes: "aes"; /// FEAT_AES (AES instructions) @FEATURE: #[unstable(feature = "stdsimd", issue = "27731")] sha2: "sha2"; diff --git a/library/stdarch/crates/std_detect/src/detect/os/freebsd/arm.rs b/library/stdarch/crates/std_detect/src/detect/os/freebsd/arm.rs index 97ede1d26..d904eaebd 100644 --- a/library/stdarch/crates/std_detect/src/detect/os/freebsd/arm.rs +++ b/library/stdarch/crates/std_detect/src/detect/os/freebsd/arm.rs @@ -23,16 +23,13 @@ pub(crate) fn detect_features() -> cache::Initializer { if let Ok(auxv) = auxvec::auxv() { enable_feature(&mut value, Feature::neon, auxv.hwcap & HWCAP_NEON != 0); - let pmull = auxv.hwcap2 & HWCAP2_PMULL != 0; - enable_feature(&mut value, Feature::pmull, pmull); + enable_feature(&mut value, Feature::pmull, auxv.hwcap2 & HWCAP2_PMULL != 0); enable_feature(&mut value, Feature::crc, auxv.hwcap2 & HWCAP2_CRC32 != 0); - let aes = auxv.hwcap2 & HWCAP2_AES != 0; - enable_feature(&mut value, Feature::aes, aes); + enable_feature(&mut value, Feature::aes, auxv.hwcap2 & HWCAP2_AES != 0); // SHA2 requires SHA1 & SHA2 features let sha1 = auxv.hwcap2 & HWCAP2_SHA1 != 0; let sha2 = auxv.hwcap2 & HWCAP2_SHA2 != 0; enable_feature(&mut value, Feature::sha2, sha1 && sha2); - enable_feature(&mut value, Feature::crypto, aes && pmull && sha1 && sha2); return value; } value diff --git a/library/stdarch/crates/std_detect/src/detect/os/linux/arm.rs b/library/stdarch/crates/std_detect/src/detect/os/linux/arm.rs index 7383e487f..7601cf0a8 100644 --- a/library/stdarch/crates/std_detect/src/detect/os/linux/arm.rs +++ b/library/stdarch/crates/std_detect/src/detect/os/linux/arm.rs @@ -20,14 +20,6 @@ pub(crate) fn detect_features() -> cache::Initializer { enable_feature(&mut value, Feature::neon, bit::test(auxv.hwcap, 12)); enable_feature(&mut value, Feature::pmull, bit::test(auxv.hwcap2, 1)); enable_feature(&mut value, Feature::crc, bit::test(auxv.hwcap2, 4)); - enable_feature( - &mut value, - Feature::crypto, - bit::test(auxv.hwcap2, 0) - && bit::test(auxv.hwcap2, 1) - && bit::test(auxv.hwcap2, 2) - && bit::test(auxv.hwcap2, 3), - ); enable_feature(&mut value, Feature::aes, bit::test(auxv.hwcap2, 0)); // SHA2 requires SHA1 & SHA2 features enable_feature( @@ -47,14 +39,6 @@ pub(crate) fn detect_features() -> cache::Initializer { ); enable_feature(&mut value, Feature::pmull, c.field("Features").has("pmull")); enable_feature(&mut value, Feature::crc, c.field("Features").has("crc32")); - enable_feature( - &mut value, - Feature::crypto, - c.field("Features").has("aes") - && c.field("Features").has("pmull") - && c.field("Features").has("sha1") - && c.field("Features").has("sha2"), - ); enable_feature(&mut value, Feature::aes, c.field("Features").has("aes")); enable_feature( &mut value, diff --git a/library/stdarch/crates/std_detect/src/detect/os/linux/auxvec.rs b/library/stdarch/crates/std_detect/src/detect/os/linux/auxvec.rs index 11d9c103e..8bc0b30c3 100644 --- a/library/stdarch/crates/std_detect/src/detect/os/linux/auxvec.rs +++ b/library/stdarch/crates/std_detect/src/detect/os/linux/auxvec.rs @@ -54,10 +54,13 @@ pub(crate) struct AuxVec { /// error, cpuinfo still can (and will) be used to try to perform run-time /// feature detection on some platforms. /// -/// Note: The `std_detect_dlsym_getauxval` cargo feature is ignored on `*-linux-gnu*` targets, -/// since [all `*-linux-gnu*` targets ([since Rust 1.64](https://blog.rust-lang.org/2022/08/01/Increasing-glibc-kernel-requirements.html)) -/// have glibc requirements higher than [glibc 2.16 that added `getauxval`](https://sourceware.org/legacy-ml/libc-announce/2012/msg00000.html), -/// and we can safely assume [`getauxval`] is linked to the binary. +/// Note: The `std_detect_dlsym_getauxval` cargo feature is ignored on +/// `*-linux-gnu*` and `*-android*` targets because we can safely assume `getauxval` +/// is linked to the binary. +/// - `*-linux-gnu*` targets ([since Rust 1.64](https://blog.rust-lang.org/2022/08/01/Increasing-glibc-kernel-requirements.html)) +/// have glibc requirements higher than [glibc 2.16 that added `getauxval`](https://sourceware.org/legacy-ml/libc-announce/2012/msg00000.html). +/// - `*-android*` targets ([since Rust 1.68](https://blog.rust-lang.org/2023/01/09/android-ndk-update-r25.html)) +/// have the minimum supported API level higher than [Android 4.3 (API level 18) that added `getauxval`](https://github.com/aosp-mirror/platform_bionic/blob/d3ebc2f7c49a9893b114124d4a6b315f3a328764/libc/include/sys/auxv.h#L49). /// /// For more information about when `getauxval` is available check the great /// [`auxv` crate documentation][auxv_docs]. @@ -67,7 +70,9 @@ pub(crate) struct AuxVec { pub(crate) fn auxv() -> Result<AuxVec, ()> { #[cfg(all( feature = "std_detect_dlsym_getauxval", - not(all(target_os = "linux", target_env = "gnu")) + not(all(target_os = "linux", target_env = "gnu")), + // TODO: libc crate currently doesn't provide getauxval on 32-bit Android. + not(all(target_os = "android", target_pointer_width = "64")), ))] { // Try to call a dynamically-linked getauxval function. @@ -105,13 +110,17 @@ pub(crate) fn auxv() -> Result<AuxVec, ()> { } } } - drop(hwcap); + + // Intentionnaly not used + let _ = hwcap; } } #[cfg(any( not(feature = "std_detect_dlsym_getauxval"), - all(target_os = "linux", target_env = "gnu") + all(target_os = "linux", target_env = "gnu"), + // TODO: libc crate currently doesn't provide getauxval on 32-bit Android. + all(target_os = "android", target_pointer_width = "64"), ))] { // Targets with only AT_HWCAP: @@ -189,13 +198,12 @@ fn getauxval(key: usize) -> Result<usize, ()> { pub(super) fn auxv_from_file(file: &str) -> Result<AuxVec, ()> { let file = super::read_file(file)?; - // See <https://github.com/torvalds/linux/blob/v3.19/include/uapi/linux/auxvec.h>. + // See <https://github.com/torvalds/linux/blob/v5.15/include/uapi/linux/auxvec.h>. // - // The auxiliary vector contains at most 32 (key,value) fields: from - // `AT_EXECFN = 31` to `AT_NULL = 0`. That is, a buffer of - // 2*32 `usize` elements is enough to read the whole vector. - let mut buf = [0_usize; 64]; - let len = core::mem::size_of_val(&buf).max(file.len()); + // The auxiliary vector contains at most 34 (key,value) fields: from + // `AT_MINSIGSTKSZ` to `AT_NULL`, but its number may increase. + let len = file.len(); + let mut buf = alloc::vec![0_usize; 1 + len / core::mem::size_of::<usize>()]; unsafe { core::ptr::copy_nonoverlapping(file.as_ptr(), buf.as_mut_ptr() as *mut u8, len); } @@ -206,7 +214,7 @@ pub(super) fn auxv_from_file(file: &str) -> Result<AuxVec, ()> { /// Tries to interpret the `buffer` as an auxiliary vector. If that fails, this /// function returns `Err`. #[cfg(feature = "std_detect_file_io")] -fn auxv_from_buf(buf: &[usize; 64]) -> Result<AuxVec, ()> { +fn auxv_from_buf(buf: &[usize]) -> Result<AuxVec, ()> { // Targets with only AT_HWCAP: #[cfg(any( target_arch = "riscv32", @@ -247,7 +255,8 @@ fn auxv_from_buf(buf: &[usize; 64]) -> Result<AuxVec, ()> { return Ok(AuxVec { hwcap, hwcap2 }); } } - drop(buf); + // Suppress unused variable + let _ = buf; Err(()) } diff --git a/library/stdarch/crates/std_detect/tests/cpu-detection.rs b/library/stdarch/crates/std_detect/tests/cpu-detection.rs index eb3a3e409..38bdb5bbd 100644 --- a/library/stdarch/crates/std_detect/tests/cpu-detection.rs +++ b/library/stdarch/crates/std_detect/tests/cpu-detection.rs @@ -28,7 +28,6 @@ fn arm_linux_or_freebsd() { println!("neon: {}", is_arm_feature_detected!("neon")); println!("pmull: {}", is_arm_feature_detected!("pmull")); println!("crc: {}", is_arm_feature_detected!("crc")); - println!("crypto: {}", is_arm_feature_detected!("crypto")); println!("aes: {}", is_arm_feature_detected!("aes")); println!("sha2: {}", is_arm_feature_detected!("sha2")); } |