|
@@ -923,13 +923,19 @@ DirtyBitmapSnapshot *cpu_physical_memory_snapshot_and_clear_dirty
|
|
|
(MemoryRegion *mr, hwaddr offset, hwaddr length, unsigned client)
|
|
|
{
|
|
|
DirtyMemoryBlocks *blocks;
|
|
|
- ram_addr_t start = memory_region_get_ram_addr(mr) + offset;
|
|
|
+ ram_addr_t start, first, last;
|
|
|
unsigned long align = 1UL << (TARGET_PAGE_BITS + BITS_PER_LEVEL);
|
|
|
- ram_addr_t first = QEMU_ALIGN_DOWN(start, align);
|
|
|
- ram_addr_t last = QEMU_ALIGN_UP(start + length, align);
|
|
|
DirtyBitmapSnapshot *snap;
|
|
|
unsigned long page, end, dest;
|
|
|
|
|
|
+ start = memory_region_get_ram_addr(mr);
|
|
|
+ /* We know we're only called for RAM MemoryRegions */
|
|
|
+ assert(start != RAM_ADDR_INVALID);
|
|
|
+ start += offset;
|
|
|
+
|
|
|
+ first = QEMU_ALIGN_DOWN(start, align);
|
|
|
+ last = QEMU_ALIGN_UP(start + length, align);
|
|
|
+
|
|
|
snap = g_malloc0(sizeof(*snap) +
|
|
|
((last - first) >> (TARGET_PAGE_BITS + 3)));
|
|
|
snap->start = first;
|
|
@@ -2659,7 +2665,11 @@ static void invalidate_and_set_dirty(MemoryRegion *mr, hwaddr addr,
|
|
|
hwaddr length)
|
|
|
{
|
|
|
uint8_t dirty_log_mask = memory_region_get_dirty_log_mask(mr);
|
|
|
- addr += memory_region_get_ram_addr(mr);
|
|
|
+ ram_addr_t ramaddr = memory_region_get_ram_addr(mr);
|
|
|
+
|
|
|
+ /* We know we're only called for RAM MemoryRegions */
|
|
|
+ assert(ramaddr != RAM_ADDR_INVALID);
|
|
|
+ addr += ramaddr;
|
|
|
|
|
|
/* No early return if dirty_log_mask is or becomes 0, because
|
|
|
* cpu_physical_memory_set_dirty_range will still call
|