@@ -1715,6 +1715,37 @@ mod tests {
17151715 oracle_file. read_exact( & mut oracle_buf) . unwrap( ) ;
17161716 prop_assert_eq!( & opt_buf, & oracle_buf) ;
17171717 }
1718+
1719+ #[ test]
1720+ fn store_dirty_bitmap_correctness(
1721+ region_specs in proptest:: collection:: vec( region_spec( ) , 1 ..=3 ) ,
1722+ ) {
1723+ let page_size = get_page_size( ) . unwrap( ) ;
1724+ let ( guest_memory, kvm_bitmap, _) = build_memory( & region_specs) ;
1725+
1726+ guest_memory. store_dirty_bitmap( & kvm_bitmap, page_size) ;
1727+
1728+ // Verify: every KVM-dirty page on a plugged slot is now
1729+ // dirty in the firecracker bitmap.
1730+ for ( region, spec) in guest_memory. iter( ) . zip( region_specs. iter( ) ) {
1731+ for ( slot_idx, ( slot, plugged) ) in region. slots( ) . enumerate( ) {
1732+ if !plugged {
1733+ continue ;
1734+ }
1735+ let num_pages = slot. slice. len( ) / page_size;
1736+ let bm = & spec. kvm_bitmaps[ slot_idx] ;
1737+ let fc = slot. slice. bitmap( ) ;
1738+ for page in 0 ..num_pages {
1739+ let kvm_dirty =
1740+ ( ( bm[ page / 64 ] >> ( page % 64 ) ) & 1 ) == 1 ;
1741+ let fc_dirty = fc. dirty_at( page * page_size) ;
1742+ // Bitmap starts clean, so after store_dirty_bitmap
1743+ // the fc bitmap must exactly match the KVM bitmap.
1744+ prop_assert_eq!( fc_dirty, kvm_dirty, "mismatch at page {}" , page) ;
1745+ }
1746+ }
1747+ }
1748+ }
17181749 }
17191750 }
17201751}
0 commit comments