1 use super::super::c;
2 #[cfg(any(
3 all(target_os = "android", target_pointer_width = "64"),
4 target_os = "linux",
5 ))]
6 use crate::ffi::CStr;
7
8 // `getauxval` wasn't supported in glibc until 2.16.
9 #[cfg(any(
10 all(target_os = "android", target_pointer_width = "64"),
11 target_os = "linux",
12 ))]
13 weak!(fn getauxval(c::c_ulong) -> *mut c::c_void);
14
15 #[inline]
page_size() -> usize16 pub(crate) fn page_size() -> usize {
17 unsafe { c::sysconf(c::_SC_PAGESIZE) as usize }
18 }
19
20 #[cfg(not(target_os = "wasi"))]
21 #[inline]
clock_ticks_per_second() -> u6422 pub(crate) fn clock_ticks_per_second() -> u64 {
23 unsafe { c::sysconf(c::_SC_CLK_TCK) as u64 }
24 }
25
26 #[cfg(any(
27 all(target_os = "android", target_pointer_width = "64"),
28 target_os = "linux",
29 ))]
30 #[inline]
linux_hwcap() -> (usize, usize)31 pub(crate) fn linux_hwcap() -> (usize, usize) {
32 if let Some(libc_getauxval) = getauxval.get() {
33 unsafe {
34 let hwcap = libc_getauxval(c::AT_HWCAP) as usize;
35 let hwcap2 = libc_getauxval(c::AT_HWCAP2) as usize;
36 (hwcap, hwcap2)
37 }
38 } else {
39 (0, 0)
40 }
41 }
42
43 #[cfg(any(
44 all(target_os = "android", target_pointer_width = "64"),
45 target_os = "linux",
46 ))]
47 #[inline]
linux_execfn() -> &'static CStr48 pub(crate) fn linux_execfn() -> &'static CStr {
49 if let Some(libc_getauxval) = getauxval.get() {
50 unsafe { CStr::from_ptr(libc_getauxval(c::AT_EXECFN).cast()) }
51 } else {
52 cstr!("")
53 }
54 }
55