meowalloc 0.1.0

Toy allocator written in pure rust, with concurrency in mind
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(),
    )} 
}