Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F151492733
D19940.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D19940.id.diff
View Options
Index: lang/rust/files/patch-stdsimd
===================================================================
--- lang/rust/files/patch-stdsimd
+++ lang/rust/files/patch-stdsimd
@@ -0,0 +1,169 @@
+--- src/stdsimd/crates/std_detect/src/detect/os/freebsd/arm.rs.orig 2019-04-17 19:35:53.380966000 +0200
++++ src/stdsimd/crates/std_detect/src/detect/os/freebsd/arm.rs 2019-04-17 19:37:08.626651000 +0200
+@@ -0,0 +1,27 @@
++//! Run-time feature detection for ARM on FreeBSD
++
++use crate::detect::{Feature, cache};
++use super::{auxvec};
++
++/// Performs run-time feature detection.
++#[inline]
++pub fn check_for(x: Feature) -> bool {
++ cache::test(x as u32, detect_features)
++}
++
++/// Try to read the features from the auxiliary vector
++fn detect_features() -> cache::Initializer {
++ let mut value = cache::Initializer::default();
++ let enable_feature = |value: &mut cache::Initializer, f, enable| {
++ if enable {
++ value.set(f as u32);
++ }
++ };
++
++ if let Ok(auxv) = auxvec::auxv() {
++ enable_feature(&mut value, Feature::neon, auxv.hwcap & 0x00001000 != 0);
++ enable_feature(&mut value, Feature::pmull, auxv.hwcap2 & 0x00000002 != 0);
++ return value;
++ }
++ value
++}
+--- src/stdsimd/crates/std_detect/src/detect/os/freebsd/auxvec.rs.orig 2019-04-17 19:35:49.618294000 +0200
++++ src/stdsimd/crates/std_detect/src/detect/os/freebsd/auxvec.rs 2019-04-17 19:38:00.410284000 +0200
+@@ -0,0 +1,86 @@
++//! Parses ELF auxiliary vectors.
++#![cfg_attr(any(target_arch = "arm", target_arch = "powerpc64"), allow(dead_code))]
++
++/// Key to access the CPU Hardware capabilities bitfield.
++pub(crate) const AT_HWCAP: usize = 25;
++/// Key to access the CPU Hardware capabilities 2 bitfield.
++pub(crate) const AT_HWCAP2: usize = 26;
++
++/// Cache HWCAP bitfields of the ELF Auxiliary Vector.
++///
++/// If an entry cannot be read all the bits in the bitfield are set to zero.
++/// This should be interpreted as all the features being disabled.
++#[derive(Debug, Copy, Clone)]
++pub(crate) struct AuxVec {
++ pub hwcap: usize,
++ pub hwcap2: usize,
++}
++
++/// ELF Auxiliary Vector
++///
++/// The auxiliary vector is a memory region in a running ELF program's stack
++/// composed of (key: usize, value: usize) pairs.
++///
++/// The keys used in the aux vector are platform dependent. For FreeBSD, they are
++/// defined in [sys/elf_common.h][elf_common_h]. The hardware capabilities of a given
++/// CPU can be queried with the `AT_HWCAP` and `AT_HWCAP2` keys.
++///
++/// Note that run-time feature detection is not invoked for features that can
++/// be detected at compile-time.
++///
++/// [elf_common.h]: https://svnweb.freebsd.org/base/release/12.0.0/sys/sys/elf_common.h?revision=341707
++pub(crate) fn auxv() -> Result<AuxVec, ()> {
++ if let Ok(hwcap) = archauxv(AT_HWCAP) {
++ if let Ok(hwcap2) = archauxv(AT_HWCAP2) {
++ if hwcap != 0 && hwcap2 != 0 {
++ return Ok(AuxVec { hwcap, hwcap2 });
++ }
++ }
++ }
++ Err(())
++}
++
++/// Tries to read the `key` from the auxiliary vector.
++fn archauxv(key: usize) -> Result<usize, ()> {
++ use mem;
++
++ #[derive (Copy, Clone)]
++ #[repr(C)]
++ pub struct Elf_Auxinfo {
++ pub a_type: usize,
++ pub a_un: unnamed,
++ }
++ #[derive (Copy, Clone)]
++ #[repr(C)]
++ pub union unnamed {
++ pub a_val: libc::c_long,
++ pub a_ptr: *mut libc::c_void,
++ pub a_fcn: Option<unsafe extern "C" fn() -> ()>,
++ }
++
++ let mut auxv: [Elf_Auxinfo; 27] =
++ [Elf_Auxinfo{a_type: 0, a_un: unnamed{a_val: 0,},}; 27];
++
++ let mut len: libc::c_uint = mem::size_of_val(&auxv) as libc::c_uint;
++
++ unsafe {
++ let mut mib = [libc::CTL_KERN, libc::KERN_PROC, libc::KERN_PROC_AUXV, libc::getpid()];
++
++ let ret = libc::sysctl(mib.as_mut_ptr(),
++ mib.len() as u32,
++ &mut auxv as *mut _ as *mut _,
++ &mut len as *mut _ as *mut _,
++ 0 as *mut libc::c_void,
++ 0,
++ );
++
++ if ret != -1 {
++ for i in 0..auxv.len() {
++ if auxv[i].a_type == key {
++ return Ok(auxv[i].a_un.a_val as usize);
++ }
++ }
++ }
++ }
++ return Ok(0);
++}
+--- src/stdsimd/crates/std_detect/src/detect/os/freebsd/mod.rs.orig 2019-04-10 20:46:16.000000000 +0200
++++ src/stdsimd/crates/std_detect/src/detect/os/freebsd/mod.rs 2019-04-17 19:44:43.757668000 +0200
+@@ -1,9 +1,17 @@
+ //! Run-time feature detection on FreeBSD
+
++mod auxvec;
++
+ cfg_if! {
+ if #[cfg(target_arch = "aarch64")] {
+ mod aarch64;
+ pub use self::aarch64::check_for;
++ } else if #[cfg(target_arch = "arm")] {
++ mod arm;
++ pub use self::arm::check_for;
++ } else if #[cfg(target_arch = "powerpc64")] {
++ mod powerpc;
++ pub use self::powerpc::check_for;
+ } else {
+ use arch::detect::Feature;
+ /// Performs run-time feature detection.
+--- src/stdsimd/crates/std_detect/src/detect/os/freebsd/powerpc.rs.orig 2019-04-17 19:41:09.563331000 +0200
++++ src/stdsimd/crates/std_detect/src/detect/os/freebsd/powerpc.rs 2019-04-17 19:46:49.315589000 +0200
+@@ -0,0 +1,27 @@
++//! Run-time feature detection for PowerPC on FreeBSD.
++
++use crate::detect::{Feature, cache};
++use super::{auxvec};
++
++/// Performs run-time feature detection.
++#[inline]
++pub fn check_for(x: Feature) -> bool {
++ cache::test(x as u32, detect_features)
++}
++
++fn detect_features() -> cache::Initializer {
++ let mut value = cache::Initializer::default();
++ let enable_feature = |value: &mut cache::Initializer, f, enable| {
++ if enable {
++ value.set(f as u32);
++ }
++ };
++
++ if let Ok(auxv) = auxvec::auxv() {
++ enable_feature(&mut value, Feature::altivec, auxv.hwcap & 0x10000000 != 0);
++ enable_feature(&mut value, Feature::vsx, auxv.hwcap & 0x00000080 != 0);
++ enable_feature(&mut value, Feature::power8, auxv.hwcap2 & 0x80000000 != 0);
++ return value;
++ }
++ value
++}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Apr 9, 7:40 PM (9 m, 36 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31131308
Default Alt Text
D19940.id.diff (6 KB)
Attached To
Mode
D19940: lang/rust: fix build on ppc64 and armv6/7
Attached
Detach File
Event Timeline
Log In to Comment