]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
hw/loader: fix roms during cpr
authorSteve Sistare <steven.sistare@oracle.com>
Fri, 7 Mar 2025 20:55:53 +0000 (12:55 -0800)
committerFabiano Rosas <farosas@suse.de>
Fri, 14 Mar 2025 12:29:19 +0000 (09:29 -0300)
During normal migration, new QEMU creates and initializes memory regions,
then loads the preserved contents of the region from vmstate.

During CPR, memory regions are preserved in place, then the realize
method initializes the regions contents, losing the old contents.  To
fix, skip the re-init during CPR.

Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
Message-ID: <1741380954-341079-4-git-send-email-steven.sistare@oracle.com>
Signed-off-by: Fabiano Rosas <farosas@suse.de>
hw/core/loader.c

index 332b879a0bf032ccc2df8160cbadc1f7785d0da4..ce6ff1b52e3bc52d6c0d99ab47c57fc49f1dc2cf 100644 (file)
@@ -51,6 +51,7 @@
 #include "trace.h"
 #include "hw/hw.h"
 #include "disas/disas.h"
+#include "migration/cpr.h"
 #include "migration/vmstate.h"
 #include "monitor/monitor.h"
 #include "system/reset.h"
@@ -1029,7 +1030,9 @@ static void *rom_set_mr(Rom *rom, Object *owner, const char *name, bool ro)
     vmstate_register_ram_global(rom->mr);
 
     data = memory_region_get_ram_ptr(rom->mr);
-    memcpy(data, rom->data, rom->datasize);
+    if (!cpr_is_incoming()) {
+        memcpy(data, rom->data, rom->datasize);
+    }
 
     return data;
 }