use std::sync::OnceLock;
unsafe extern "C" {
fn sysctlbyname(
name: *const i8,
oldp: *mut u8,
oldlenp: *mut usize,
newp: *const u8,
newlen: usize,
) -> i32;
}
fn sysctl_int(name: &str) -> Option<i64> {
let mut cname = Vec::with_capacity(name.len() + 1);
cname.extend_from_slice(name.as_bytes());
cname.push(0);
let mut val: i64 = 0;
let mut len = std::mem::size_of::<i64>();
let rc = unsafe {
sysctlbyname(
cname.as_ptr() as *const i8,
(&mut val as *mut i64).cast(),
&mut len as *mut usize,
std::ptr::null(),
0,
)
};
(rc == 0).then_some(val)
}
fn feat(name: &str) -> bool {
sysctl_int(name).unwrap_or(0) != 0
}
macro_rules! cached_feat {
($(#[$m:meta])* $fn_name:ident => $sysctl:literal) => {
$(#[$m])*
pub fn $fn_name() -> bool {
static CACHE: OnceLock<bool> = OnceLock::new();
*CACHE.get_or_init(|| feat($sysctl))
}
};
}
pub fn has_amx() -> bool {
cfg!(all(target_arch = "aarch64", target_vendor = "apple"))
}
cached_feat! {
has_sme => "hw.optional.arm.FEAT_SME"
}
cached_feat! {
has_sme2 => "hw.optional.arm.FEAT_SME2"
}
cached_feat! {
sme_f32f32 => "hw.optional.arm.SME_F32F32"
}
cached_feat! {
sme_i8i32 => "hw.optional.arm.SME_I8I32"
}
cached_feat! {
sme_b16f32 => "hw.optional.arm.SME_B16F32"
}
pub fn svl_bytes() -> usize {
static CACHE: OnceLock<usize> = OnceLock::new();
*CACHE.get_or_init(|| {
sysctl_int("hw.optional.arm.sme_max_svl_b")
.unwrap_or(0)
.max(0) as usize
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn probe_reports_something() {
eprintln!(
"AMX/SME probe: amx={} sme={} sme2={} f32f32={} i8i32={} svl_bytes={}",
has_amx(),
has_sme(),
has_sme2(),
sme_f32f32(),
sme_i8i32(),
svl_bytes(),
);
if has_sme2() {
assert!(has_sme(), "SME2 implies SME");
assert!(svl_bytes() > 0, "SME2 present but SVL unreadable");
}
}
}