zkvmc_core/memory/
mmap.rs

1use super::empty_mmap;
2use crate::{send_sync_ptr::SendSyncPtr, traits::Reset};
3use eyre::Result;
4use rustix::mm::{self, MapFlags, ProtFlags};
5use std::ptr::{self, NonNull};
6
7#[repr(C)]
8pub struct MmapOffset {
9    mmap: Mmap,
10    pub offset: usize,
11}
12
13impl MmapOffset {
14    pub fn new_empty() -> Self {
15        let emptry = Mmap::new_empty();
16        Self {
17            mmap: emptry,
18            offset: 0,
19        }
20    }
21
22    pub fn new(size: usize) -> Result<Self> {
23        let mmap = Mmap::new(size)?;
24        Ok(Self { mmap, offset: 0 })
25    }
26}
27
28impl Reset for MmapOffset {
29    fn reset(&mut self) {
30        self.offset = 0;
31    }
32}
33
34#[derive(Debug)]
35pub struct Mmap {
36    memory: SendSyncPtr<[u8]>,
37}
38
39impl Mmap {
40    pub fn new_empty() -> Self {
41        Self {
42            memory: empty_mmap(),
43        }
44    }
45
46    pub fn new(size: usize) -> Result<Self> {
47        let ptr = unsafe {
48            mm::mmap_anonymous(
49                ptr::null_mut(),
50                size,
51                ProtFlags::READ | ProtFlags::WRITE,
52                MapFlags::PRIVATE | MapFlags::NORESERVE,
53            )?
54        };
55        let memory = std::ptr::slice_from_raw_parts_mut(ptr.cast(), size);
56        let memory = SendSyncPtr::new(NonNull::new(memory).unwrap());
57        Ok(Self { memory })
58    }
59
60    pub fn is_empty(&self) -> bool {
61        self.memory.as_non_null().is_empty()
62    }
63}
64
65impl Drop for Mmap {
66    fn drop(&mut self) {
67        unsafe {
68            let ptr = self.memory.as_ptr().cast();
69            let len = self.memory.len();
70            if len == 0 {
71                return;
72            }
73            rustix::mm::munmap(ptr, len).expect("munmap failed");
74        }
75    }
76}