+static mc_mem_region_t MC_region_new(void *start_addr, size_t size);
+static void MC_region_restore(mc_mem_region_t reg);
+static void MC_region_destroy(mc_mem_region_t reg);
+
+static void MC_snapshot_add_region(mc_snapshot_t snapshot, void *start_addr, size_t size);
+
+static mc_mem_region_t MC_region_new(void *start_addr, size_t size)
+{
+ mc_mem_region_t new_reg = xbt_new0(s_mc_mem_region_t, 1);
+ new_reg->start_addr = start_addr;
+ new_reg->size = size;
+ new_reg->data = xbt_malloc0(size);
+ memcpy(new_reg->data, start_addr, size);
+ return new_reg;
+}
+
+static void MC_region_restore(mc_mem_region_t reg)
+{
+ /*FIXME: check if start_addr is still mapped, if it is not, then map it
+ before copying the data */
+ memcpy(reg->start_addr, reg->data, reg->size);
+}
+
+static void MC_region_destroy(mc_mem_region_t reg)
+{
+ xbt_free(reg->data);
+ xbt_free(reg);
+}
+
+static void MC_snapshot_add_region(mc_snapshot_t snapshot, void *start_addr, size_t size)
+{
+ mc_mem_region_t new_reg = MC_region_new(start_addr, size);
+ snapshot->regions = xbt_realloc(snapshot->regions, (snapshot->num_reg + 1) * sizeof(mc_mem_region_t));
+ snapshot->regions[snapshot->num_reg] = new_reg;
+ snapshot->num_reg++;
+ return;
+}
+