use core::{alloc::{AllocError}, arch::asm, num::NonZero, ptr::NonNull};
use crate::constants::linux::*;
#[inline(always)]
pub fn mmap_anon(size: NonZero<usize>) -> Result<NonNull<u8>, AllocError> {
let ptr: *mut u8;
unsafe { asm!(
"syscall",
in("rax") MMAP_SYSCALL,
in("rdi") 0,
in("rsi") size.get(),
in("rdx") PROT_READ | PROT_WRITE,
in("r10") MAP_PRIVATE | MAP_ANONYMOUS,
in("r8") -1isize,
in("r9") 0isize,
lateout("rax") ptr,
options(nostack, preserves_flags)
)};
if ptr as usize == MAP_FAILED {
Err(AllocError)
} else {
unsafe { Ok(NonNull::new_unchecked(ptr)) }
}
}
#[inline(always)]
pub unsafe fn munmap(ptr: NonNull<u8>, size: NonZero<usize>) {
unsafe { asm!(
"syscall",
in("rax") MUNMAP_SYSCALL,
in("rdi") ptr.as_ptr(),
in("rdx") size.get(),
)}
}