zkvmc_core/memory/
mmap.rs1use 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}