- size_t page_count = mc_page_count(size);
-
- uint64_t* pagemap = NULL;
- if (mc_model_checker->parent_snapshot) {
- pagemap = (uint64_t*) alloca(sizeof(uint64_t) * page_count);
- mc_read_pagemap(pagemap, mc_page_number(NULL, start_addr), page_count);
- }
-
- // Take incremental snapshot:
- new_reg->page_numbers = mc_take_page_snapshot_region(start_addr, page_count, pagemap, ref_reg->page_numbers);
-
- return new_reg;
-}
-
-void mc_region_restore_sparse(mc_mem_region_t reg, mc_mem_region_t ref_reg)
-{
- xbt_assert((((uintptr_t)reg->start_addr) & (xbt_pagesize-1)) == 0,
- "Not at the beginning of a page");
- size_t page_count = mc_page_count(reg->size);
-
- uint64_t* pagemap = NULL;
-
- // Read soft-dirty bits if necessary in order to know which pages have changed:
- if (mc_model_checker->parent_snapshot) {
- pagemap = (uint64_t*) alloca(sizeof(uint64_t) * page_count);
- mc_read_pagemap(pagemap, mc_page_number(NULL, reg->start_addr), page_count);
- }
-
- // Incremental per-page snapshot restoration:
- mc_restore_page_snapshot_region(reg, page_count, pagemap, ref_reg);
+ xbt_assert(mc_page_count(reg->size()) == reg->page_data().page_count());
+ mc_restore_page_snapshot_region(process,
+ (void*) reg->permanent_address().address(), reg->page_data());