include!("common.rs");
#[allow(non_camel_case_types)]
mod ffi {
sys_type!({
pub(crate) type zx_status_t = i32;
});
sys_const!({
pub(crate) const ZX_OK: zx_status_t = 0;
pub(crate) const ZX_FEATURE_KIND_CPU: u32 = 0;
pub(crate) const ZX_ARM64_FEATURE_ISA_ATOMICS: u32 = 1 << 8;
});
#[link(name = "zircon")]
extern "C" {
pub(crate) fn zx_system_get_features(kind: u32, features: *mut u32) -> zx_status_t;
}
}
fn zx_system_get_features(kind: u32) -> u32 {
let mut out = 0_u32;
let res = unsafe { ffi::zx_system_get_features(kind, &mut out) };
if res != ffi::ZX_OK {
return 0;
}
out
}
#[cold]
fn _detect(info: &mut CpuInfo) {
let features = zx_system_get_features(ffi::ZX_FEATURE_KIND_CPU);
macro_rules! check {
($flag:ident, $bit:ident) => {
if features & ffi::$bit != 0 {
info.set(CpuInfoFlag::$flag);
}
};
}
check!(lse, ZX_ARM64_FEATURE_ISA_ATOMICS);
}
#[allow(
clippy::alloc_instead_of_core,
clippy::std_instead_of_alloc,
clippy::std_instead_of_core,
clippy::undocumented_unsafe_blocks,
clippy::wildcard_imports
)]
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_fuchsia() {
let features = zx_system_get_features(ffi::ZX_FEATURE_KIND_CPU);
test_helper::eprintln_nocapture!(
"zx_system_get_features(ZX_FEATURE_KIND_CPU): {:b}",
features
);
assert_ne!(features, 0);
}
}