@@ -1093,9 +1093,26 @@ void
memory_region_add_subregion_overlap(MemoryRegion *mr,
void memory_region_del_subregion(MemoryRegion *mr,
MemoryRegion *subregion)
{
+ MemoryRegion *target_region;
+ ram_addr_t base, offs;
+
assert(subregion->parent == mr);
subregion->parent = NULL;
QTAILQ_REMOVE(&mr->subregions, subregion, subregions_link);
+
+ if (subregion->alias) {
+ base = subregion->alias_offset;
+ target_region = subregion->alias;
+ } else {
+ base = 0;
+ target_region = subregion;
+ }
+ if (target_region->dirty_log_mask) {
+ for (offs = 0; offs < subregion->size; offs += TARGET_PAGE_SIZE) {
+ memory_region_set_dirty(target_region, base + offs);
+ }
+ }
+
memory_region_update_topology();
}