@@ -48,10 +48,12 @@ impl SharedMemorySnapshotManager {
4848 shared_mem : & mut S ,
4949 dirty_page_map : Option < & Vec < u64 > > ,
5050 layout : & SandboxMemoryLayout ,
51+ mapped_rgns : u64 ,
5152 ) -> Result < Self > {
5253 // Build a snapshot of memory from the dirty_page_map
5354
54- let diff = Self :: build_snapshot_from_dirty_page_map ( shared_mem, dirty_page_map) ?;
55+ let diff =
56+ Self :: build_snapshot_from_dirty_page_map ( shared_mem, dirty_page_map, mapped_rgns) ?;
5557
5658 // Get the input output buffer details from the layout so that they can be reset to their initial state
5759 let input_data_size_offset = layout. get_input_data_size_offset ( ) ;
@@ -86,6 +88,7 @@ impl SharedMemorySnapshotManager {
8688 fn build_snapshot_from_dirty_page_map < S : SharedMemory > (
8789 shared_mem : & mut S ,
8890 dirty_page_map : Option < & Vec < u64 > > ,
91+ mapped_rgns : u64 ,
8992 ) -> Result < PageSnapshot > {
9093 // If there is no dirty page map, return an empty snapshot
9194 if dirty_page_map. is_none ( ) {
@@ -146,7 +149,7 @@ impl SharedMemorySnapshotManager {
146149 }
147150
148151 // Create the snapshot with the pre-allocated buffer
149- let snapshot = PageSnapshot :: with_pages_and_buffer ( dirty_pages, buffer) ;
152+ let snapshot = PageSnapshot :: with_pages_and_buffer ( dirty_pages, buffer, mapped_rgns ) ;
150153
151154 Ok ( snapshot)
152155 }
@@ -155,8 +158,10 @@ impl SharedMemorySnapshotManager {
155158 & mut self ,
156159 shared_mem : & mut S ,
157160 dirty_page_map : Option < & Vec < u64 > > ,
161+ mapped_rgns : u64 ,
158162 ) -> Result < ( ) > {
159- let snapshot = Self :: build_snapshot_from_dirty_page_map ( shared_mem, dirty_page_map) ?;
163+ let snapshot =
164+ Self :: build_snapshot_from_dirty_page_map ( shared_mem, dirty_page_map, mapped_rgns) ?;
160165 self . snapshots . push ( snapshot) ;
161166 Ok ( ( ) )
162167 }
@@ -168,7 +173,7 @@ impl SharedMemorySnapshotManager {
168173 & mut self ,
169174 shared_mem : & mut S ,
170175 dirty_bitmap : & [ u64 ] ,
171- ) -> Result < ( ) > {
176+ ) -> Result < u64 > {
172177 // check the each index in the dirty bitmap and restore only the corresponding pages from the snapshots vector
173178 // starting at the last snapshot look for the page in each snapshot if it exists and restore it
174179 // if it does not exist set the page to zero
@@ -232,14 +237,16 @@ impl SharedMemorySnapshotManager {
232237 self . output_data_buffer_offset ,
233238 SandboxMemoryLayout :: STACK_POINTER_SIZE_BYTES ,
234239 )
235- } ) ?
240+ } ) ??;
241+
242+ Ok ( self . snapshots . last ( ) . unwrap ( ) . mapped_rgns ( ) )
236243 }
237244
238245 pub ( super ) fn pop_and_restore_state_from_snapshot < S : SharedMemory > (
239246 & mut self ,
240247 shared_mem : & mut S ,
241248 dirty_bitmap : & [ u64 ] ,
242- ) -> Result < ( ) > {
249+ ) -> Result < u64 > {
243250 // Check that there is a snapshot to restore from
244251 if self . snapshots . is_empty ( ) {
245252 return Err ( crate :: HyperlightError :: NoMemorySnapshot ) ;
@@ -256,9 +263,7 @@ impl SharedMemorySnapshotManager {
256263 }
257264
258265 // restore the state from the last snapshot
259- self . restore_from_snapshot ( shared_mem, & merged_bitmap) ?;
260-
261- Ok ( ( ) )
266+ self . restore_from_snapshot ( shared_mem, & merged_bitmap)
262267 }
263268
264269 fn get_bitmap_from_snapshot ( & self , snapshot_index : usize ) -> Vec < u64 > {
@@ -390,9 +395,13 @@ mod tests {
390395 }
391396
392397 // Create snapshot
393- let mut snapshot_manager =
394- super :: SharedMemorySnapshotManager :: new ( & mut shared_mem, Some ( & dirty_pages) , & layout)
395- . unwrap ( ) ;
398+ let mut snapshot_manager = super :: SharedMemorySnapshotManager :: new (
399+ & mut shared_mem,
400+ Some ( & dirty_pages) ,
401+ & layout,
402+ 0 ,
403+ )
404+ . unwrap ( ) ;
396405
397406 // Modify memory
398407 let modified_data = vec ! [ 0xBB ; PAGE_SIZE_USIZE ] ;
@@ -468,9 +477,13 @@ mod tests {
468477 }
469478
470479 // Create initial snapshot (State 1)
471- let mut snapshot_manager =
472- super :: SharedMemorySnapshotManager :: new ( & mut shared_mem, Some ( & dirty_pages) , & layout)
473- . unwrap ( ) ;
480+ let mut snapshot_manager = super :: SharedMemorySnapshotManager :: new (
481+ & mut shared_mem,
482+ Some ( & dirty_pages) ,
483+ & layout,
484+ 0 ,
485+ )
486+ . unwrap ( ) ;
474487
475488 // State 2: Modify and create second snapshot
476489 let tracker2 = shared_mem. start_tracking_dirty_pages ( ) . unwrap ( ) ;
@@ -494,7 +507,7 @@ mod tests {
494507 }
495508
496509 snapshot_manager
497- . create_new_snapshot ( & mut shared_mem, Some ( & dirty_pages2) )
510+ . create_new_snapshot ( & mut shared_mem, Some ( & dirty_pages2) , 0 )
498511 . unwrap ( ) ;
499512
500513 // State 3: Modify again
@@ -594,9 +607,13 @@ mod tests {
594607 }
595608
596609 // Create snapshot
597- let mut snapshot_manager =
598- super :: SharedMemorySnapshotManager :: new ( & mut shared_mem, Some ( & dirty_pages) , & layout)
599- . unwrap ( ) ;
610+ let mut snapshot_manager = super :: SharedMemorySnapshotManager :: new (
611+ & mut shared_mem,
612+ Some ( & dirty_pages) ,
613+ & layout,
614+ 0 ,
615+ )
616+ . unwrap ( ) ;
600617
601618 // Modify first and third pages
602619 let modified_data = [ vec ! [ 0x11 ; PAGE_SIZE_USIZE ] , vec ! [ 0x22 ; PAGE_SIZE_USIZE ] ] ;
@@ -680,9 +697,13 @@ mod tests {
680697 }
681698 }
682699
683- let mut snapshot_manager =
684- super :: SharedMemorySnapshotManager :: new ( & mut shared_mem, Some ( & dirty_pages) , & layout)
685- . unwrap ( ) ;
700+ let mut snapshot_manager = super :: SharedMemorySnapshotManager :: new (
701+ & mut shared_mem,
702+ Some ( & dirty_pages) ,
703+ & layout,
704+ 0 ,
705+ )
706+ . unwrap ( ) ;
686707
687708 // Cycle 2: Modify and snapshot
688709 let tracker2 = shared_mem. start_tracking_dirty_pages ( ) . unwrap ( ) ;
@@ -713,7 +734,7 @@ mod tests {
713734 }
714735
715736 snapshot_manager
716- . create_new_snapshot ( & mut shared_mem, Some ( & dirty_pages2) )
737+ . create_new_snapshot ( & mut shared_mem, Some ( & dirty_pages2) , 0 )
717738 . unwrap ( ) ;
718739
719740 // Cycle 3: Modify again
@@ -814,6 +835,7 @@ mod tests {
814835 & mut shared_mem,
815836 Some ( & dirty_pages_snapshot) ,
816837 & layout,
838+ 0 ,
817839 )
818840 . unwrap ( ) ;
819841
@@ -966,9 +988,13 @@ mod tests {
966988 }
967989
968990 // Create initial checkpoint
969- let mut snapshot_manager =
970- super :: SharedMemorySnapshotManager :: new ( & mut shared_mem, Some ( & dirty_pages) , & layout)
971- . unwrap ( ) ;
991+ let mut snapshot_manager = super :: SharedMemorySnapshotManager :: new (
992+ & mut shared_mem,
993+ Some ( & dirty_pages) ,
994+ & layout,
995+ 0 ,
996+ )
997+ . unwrap ( ) ;
972998
973999 // Simulate function call 1: modify pages 0 and 2
9741000 let tracker1 = shared_mem. start_tracking_dirty_pages ( ) . unwrap ( ) ;
@@ -998,7 +1024,7 @@ mod tests {
9981024
9991025 // Checkpoint after function 1
10001026 snapshot_manager
1001- . create_new_snapshot ( & mut shared_mem, Some ( & dirty_pages1) )
1027+ . create_new_snapshot ( & mut shared_mem, Some ( & dirty_pages1) , 0 )
10021028 . unwrap ( ) ;
10031029
10041030 // Simulate function call 2: modify pages 1 and 3
@@ -1029,7 +1055,7 @@ mod tests {
10291055
10301056 // Checkpoint after function 2
10311057 snapshot_manager
1032- . create_new_snapshot ( & mut shared_mem, Some ( & dirty_pages2) )
1058+ . create_new_snapshot ( & mut shared_mem, Some ( & dirty_pages2) , 0 )
10331059 . unwrap ( ) ;
10341060
10351061 // Simulate function call 3: modify all pages
@@ -1228,9 +1254,13 @@ mod tests {
12281254 }
12291255
12301256 // Create snapshot
1231- let mut snapshot_manager =
1232- super :: SharedMemorySnapshotManager :: new ( & mut shared_mem, Some ( & dirty_pages) , & layout)
1233- . unwrap ( ) ;
1257+ let mut snapshot_manager = super :: SharedMemorySnapshotManager :: new (
1258+ & mut shared_mem,
1259+ Some ( & dirty_pages) ,
1260+ & layout,
1261+ 0 ,
1262+ )
1263+ . unwrap ( ) ;
12341264
12351265 // Modify only the dirty pages
12361266 let modified_patterns = [
0 commit comments