use crate::recorders::record_guard_install;
use mnemosyne_core::MemoryBackend;
#[inline(always)]
pub(crate) fn do_make_guard<B: MemoryBackend>(ptr: *mut u8, size: usize) -> bool {
if ptr.is_null() || size == 0 {
return false;
}
let guarded = unsafe { B::make_guard(ptr, size) };
if guarded {
record_guard_install(size);
}
guarded
}
#[cfg(test)]
mod tests {
extern crate std;
use crate::mapping::MemoryBackendWrapper;
use crate::recorders::backend_memory_stats;
use crate::test_support::lock_test;
use mnemosyne_core::MemoryBackend;
#[test]
#[cfg_attr(miri, ignore = "guard-page install is an OS call Miri cannot make")]
fn wrapper_make_guard_records_confirmed_install_and_keeps_mapping_reserved() {
let _guard = lock_test();
let size = 64 * 1024;
let ptr = unsafe { MemoryBackendWrapper::allocate(size) };
assert!(!ptr.is_null());
unsafe {
ptr.write_volatile(0xAA);
assert_eq!(ptr.read_volatile(), 0xAA);
}
let stats_before = backend_memory_stats();
let guarded = unsafe { MemoryBackendWrapper::make_guard(ptr, size) };
let stats_after = backend_memory_stats();
assert!(
guarded,
"make_guard reported failure on a fresh writable mapping"
);
assert_eq!(
stats_after.guard_install_calls,
stats_before.guard_install_calls + 1
);
assert_eq!(
stats_after.guard_install_bytes,
stats_before.guard_install_bytes + size
);
assert_eq!(
stats_after.current_mapped_bytes, stats_before.current_mapped_bytes,
"make_guard must never alter current_mapped_bytes"
);
let released = unsafe { MemoryBackendWrapper::deallocate(ptr, size) };
assert!(released);
}
#[test]
fn wrapper_make_guard_rejects_null_and_zero() {
let _guard = lock_test();
let null_guard = unsafe { MemoryBackendWrapper::make_guard(core::ptr::null_mut(), 4096) };
assert!(!null_guard, "null pointer must not be accepted for guard");
let ptr = unsafe { MemoryBackendWrapper::allocate(4096) };
assert!(!ptr.is_null());
let zero_guard = unsafe { MemoryBackendWrapper::make_guard(ptr, 0) };
assert!(!zero_guard, "zero-size guard must not be accepted");
let _ = unsafe { MemoryBackendWrapper::deallocate(ptr, 4096) };
}
}