zkvmc_core/
image.rs

1use crate::{memory::write_bytes, send_sync_ptr::SendSyncPtr};
2use rustc_hash::FxHashMap;
3
4pub struct Image {
5    entry: u32,
6    segments: FxHashMap<u32, Vec<u8>>,
7}
8
9impl Image {
10    pub fn new<'a, T>(entry: u32, iter: T) -> Self
11    where
12        T: IntoIterator<Item = (u32, &'a [u8])>,
13    {
14        Self {
15            entry,
16            segments: iter
17                .into_iter()
18                .map(|(addr, data)| (addr, data.to_vec()))
19                .collect(),
20        }
21    }
22
23    pub fn load(&mut self, pc: &mut u32, ptr: SendSyncPtr<u8>) {
24        *pc = self.entry;
25        for (addr, data) in self.segments.iter() {
26            unsafe {
27                write_bytes(ptr.as_ptr(), *addr, data);
28            }
29        }
30    }
31}