-mc_mem_region_t mc_region_new_sparse(int type, void *start_addr, size_t size, mc_mem_region_t ref_reg)
-{
- mc_mem_region_t new_reg = xbt_new(s_mc_mem_region_t, 1);
-
- new_reg->start_addr = start_addr;
- new_reg->data = NULL;
- new_reg->size = size;
- new_reg->page_numbers = NULL;
-
- xbt_assert((((uintptr_t)start_addr) & (xbt_pagesize-1)) == 0,
- "Not at the beginning of a page");
- size_t page_count = mc_page_count(size);
-
- uint64_t* pagemap = NULL;
- if (_sg_mc_soft_dirty && mc_model_checker->parent_snapshot) {
- pagemap = (uint64_t*) mmalloc_no_memset((xbt_mheap_t) mc_heap, 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==NULL ? NULL : ref_reg->page_numbers);
-
- if(pagemap) {
- mfree((xbt_mheap_t) mc_heap, pagemap);
- }
- return new_reg;
-}
-
-void mc_region_restore_sparse(mc_mem_region_t reg, mc_mem_region_t ref_reg)