mod forkable;
mod mmap;
use core::ptr::copy_nonoverlapping;
use std::{
ptr::{self, NonNull},
slice::from_raw_parts,
};
pub use forkable::ForkableMemory;
pub use mmap::{Mmap, MmapOffset};
use crate::send_sync_ptr::SendSyncPtr;
pub unsafe fn read_bytes<'a>(mem: *const u8, addr: u32, len: usize) -> &'a [u8] {
from_raw_parts(mem.add(addr as usize), len)
}
pub unsafe fn read_words<'a>(mem: *const u8, addr: u32, len: usize) -> &'a [u32] {
let bytes = read_bytes(mem, addr, len * 4);
from_raw_parts(bytes.as_ptr() as _, bytes.len() / 4)
}
pub unsafe fn read_word(mem: *const u8, addr: u32) -> u32 {
read_words(mem, addr, 1)[0]
}
pub unsafe fn write_bytes(mem: *mut u8, addr: u32, bytes: &[u8]) {
copy_nonoverlapping(bytes.as_ptr(), mem.add(addr as usize), bytes.len());
}
pub unsafe fn write_word(mem: *mut u8, addr: u32, word: u32) {
write_words(mem, addr, &[word]);
}
pub unsafe fn write_words(mem: *mut u8, addr: u32, words: &[u32]) {
let bytes = from_raw_parts(words.as_ptr() as _, words.len() * 4);
write_bytes(mem, addr, bytes);
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct Layout {
pub size: usize,
pub align: usize,
}
impl Layout {
pub fn new(size: usize, align: usize) -> Self {
Self { size, align }
}
pub fn empty() -> Self {
Self::new(0, 0)
}
}
fn empty_mmap() -> SendSyncPtr<[u8]> {
#[repr(C, align(4096))]
struct PageAligned;
let empty_page_alloc: &mut [PageAligned] = &mut [];
let empty = NonNull::new(ptr::slice_from_raw_parts_mut(
empty_page_alloc.as_mut_ptr().cast(),
0,
))
.unwrap();
SendSyncPtr::from(empty)
}