@@ -48,10 +48,12 @@ impl SharedMemorySnapshotManager {
48
48
shared_mem : & mut S ,
49
49
dirty_page_map : Option < & Vec < u64 > > ,
50
50
layout : & SandboxMemoryLayout ,
51
+ mapped_rgns : u64 ,
51
52
) -> Result < Self > {
52
53
// Build a snapshot of memory from the dirty_page_map
53
54
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) ?;
55
57
56
58
// Get the input output buffer details from the layout so that they can be reset to their initial state
57
59
let input_data_size_offset = layout. get_input_data_size_offset ( ) ;
@@ -86,6 +88,7 @@ impl SharedMemorySnapshotManager {
86
88
fn build_snapshot_from_dirty_page_map < S : SharedMemory > (
87
89
shared_mem : & mut S ,
88
90
dirty_page_map : Option < & Vec < u64 > > ,
91
+ mapped_rgns : u64 ,
89
92
) -> Result < PageSnapshot > {
90
93
// If there is no dirty page map, return an empty snapshot
91
94
if dirty_page_map. is_none ( ) {
@@ -146,7 +149,7 @@ impl SharedMemorySnapshotManager {
146
149
}
147
150
148
151
// 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 ) ;
150
153
151
154
Ok ( snapshot)
152
155
}
@@ -155,8 +158,10 @@ impl SharedMemorySnapshotManager {
155
158
& mut self ,
156
159
shared_mem : & mut S ,
157
160
dirty_page_map : Option < & Vec < u64 > > ,
161
+ mapped_rgns : u64 ,
158
162
) -> 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) ?;
160
165
self . snapshots . push ( snapshot) ;
161
166
Ok ( ( ) )
162
167
}
@@ -168,7 +173,7 @@ impl SharedMemorySnapshotManager {
168
173
& mut self ,
169
174
shared_mem : & mut S ,
170
175
dirty_bitmap : & [ u64 ] ,
171
- ) -> Result < ( ) > {
176
+ ) -> Result < u64 > {
172
177
// check the each index in the dirty bitmap and restore only the corresponding pages from the snapshots vector
173
178
// starting at the last snapshot look for the page in each snapshot if it exists and restore it
174
179
// if it does not exist set the page to zero
@@ -232,14 +237,16 @@ impl SharedMemorySnapshotManager {
232
237
self . output_data_buffer_offset ,
233
238
SandboxMemoryLayout :: STACK_POINTER_SIZE_BYTES ,
234
239
)
235
- } ) ?
240
+ } ) ??;
241
+
242
+ Ok ( self . snapshots . last ( ) . unwrap ( ) . mapped_rgns ( ) )
236
243
}
237
244
238
245
pub ( super ) fn pop_and_restore_state_from_snapshot < S : SharedMemory > (
239
246
& mut self ,
240
247
shared_mem : & mut S ,
241
248
dirty_bitmap : & [ u64 ] ,
242
- ) -> Result < ( ) > {
249
+ ) -> Result < u64 > {
243
250
// Check that there is a snapshot to restore from
244
251
if self . snapshots . is_empty ( ) {
245
252
return Err ( crate :: HyperlightError :: NoMemorySnapshot ) ;
@@ -256,9 +263,7 @@ impl SharedMemorySnapshotManager {
256
263
}
257
264
258
265
// 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)
262
267
}
263
268
264
269
fn get_bitmap_from_snapshot ( & self , snapshot_index : usize ) -> Vec < u64 > {
@@ -390,9 +395,13 @@ mod tests {
390
395
}
391
396
392
397
// 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 ( ) ;
396
405
397
406
// Modify memory
398
407
let modified_data = vec ! [ 0xBB ; PAGE_SIZE_USIZE ] ;
@@ -468,9 +477,13 @@ mod tests {
468
477
}
469
478
470
479
// 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 ( ) ;
474
487
475
488
// State 2: Modify and create second snapshot
476
489
let tracker2 = shared_mem. start_tracking_dirty_pages ( ) . unwrap ( ) ;
@@ -494,7 +507,7 @@ mod tests {
494
507
}
495
508
496
509
snapshot_manager
497
- . create_new_snapshot ( & mut shared_mem, Some ( & dirty_pages2) )
510
+ . create_new_snapshot ( & mut shared_mem, Some ( & dirty_pages2) , 0 )
498
511
. unwrap ( ) ;
499
512
500
513
// State 3: Modify again
@@ -594,9 +607,13 @@ mod tests {
594
607
}
595
608
596
609
// 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 ( ) ;
600
617
601
618
// Modify first and third pages
602
619
let modified_data = [ vec ! [ 0x11 ; PAGE_SIZE_USIZE ] , vec ! [ 0x22 ; PAGE_SIZE_USIZE ] ] ;
@@ -680,9 +697,13 @@ mod tests {
680
697
}
681
698
}
682
699
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 ( ) ;
686
707
687
708
// Cycle 2: Modify and snapshot
688
709
let tracker2 = shared_mem. start_tracking_dirty_pages ( ) . unwrap ( ) ;
@@ -713,7 +734,7 @@ mod tests {
713
734
}
714
735
715
736
snapshot_manager
716
- . create_new_snapshot ( & mut shared_mem, Some ( & dirty_pages2) )
737
+ . create_new_snapshot ( & mut shared_mem, Some ( & dirty_pages2) , 0 )
717
738
. unwrap ( ) ;
718
739
719
740
// Cycle 3: Modify again
@@ -814,6 +835,7 @@ mod tests {
814
835
& mut shared_mem,
815
836
Some ( & dirty_pages_snapshot) ,
816
837
& layout,
838
+ 0 ,
817
839
)
818
840
. unwrap ( ) ;
819
841
@@ -966,9 +988,13 @@ mod tests {
966
988
}
967
989
968
990
// 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 ( ) ;
972
998
973
999
// Simulate function call 1: modify pages 0 and 2
974
1000
let tracker1 = shared_mem. start_tracking_dirty_pages ( ) . unwrap ( ) ;
@@ -998,7 +1024,7 @@ mod tests {
998
1024
999
1025
// Checkpoint after function 1
1000
1026
snapshot_manager
1001
- . create_new_snapshot ( & mut shared_mem, Some ( & dirty_pages1) )
1027
+ . create_new_snapshot ( & mut shared_mem, Some ( & dirty_pages1) , 0 )
1002
1028
. unwrap ( ) ;
1003
1029
1004
1030
// Simulate function call 2: modify pages 1 and 3
@@ -1029,7 +1055,7 @@ mod tests {
1029
1055
1030
1056
// Checkpoint after function 2
1031
1057
snapshot_manager
1032
- . create_new_snapshot ( & mut shared_mem, Some ( & dirty_pages2) )
1058
+ . create_new_snapshot ( & mut shared_mem, Some ( & dirty_pages2) , 0 )
1033
1059
. unwrap ( ) ;
1034
1060
1035
1061
// Simulate function call 3: modify all pages
@@ -1228,9 +1254,13 @@ mod tests {
1228
1254
}
1229
1255
1230
1256
// 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 ( ) ;
1234
1264
1235
1265
// Modify only the dirty pages
1236
1266
let modified_patterns = [
0 commit comments