use std::fs;
pub fn vm_flags(addr: usize) -> Vec<String> {
let smaps = fs::read_to_string("/proc/self/smaps").expect("smaps must be readable");
let mut inside = false;
for line in smaps.lines() {
if let Some((range, _)) = line.split_once(' ')
&& let Some((start, end)) = range.split_once('-')
&& let (Ok(start), Ok(end)) = (
usize::from_str_radix(start, 16),
usize::from_str_radix(end, 16),
)
{
inside = start <= addr && addr < end;
continue;
}
if inside && let Some(flags) = line.strip_prefix("VmFlags:") {
return flags.split_whitespace().map(str::to_owned).collect();
}
}
panic!("the probe address must lie in a mapping");
}
pub fn kernel_grants_huge_pages() -> bool {
fs::read_to_string("/sys/kernel/mm/transparent_hugepage/enabled")
.is_ok_and(|policy| !policy.contains("[never]"))
}