summaryrefslogtreecommitdiffstats
path: root/win_dump.c
diff options
context:
space:
mode:
authorViktor Prutyanov2018-08-29 20:30:56 +0200
committerPaolo Bonzini2018-10-02 18:47:55 +0200
commit7184de64a1cf23a72191484b9a6995c3bfc9fb0b (patch)
tree74ddec894dd66b2170213fda33cca16fb00fb055 /win_dump.c
parentcpus: access .qemu_icount_bias with atomic64 (diff)
downloadqemu-7184de64a1cf23a72191484b9a6995c3bfc9fb0b.tar.gz
qemu-7184de64a1cf23a72191484b9a6995c3bfc9fb0b.tar.xz
qemu-7184de64a1cf23a72191484b9a6995c3bfc9fb0b.zip
dump: fix Windows dump memory run mapping
We should map and use guest memory run by parts if it can't be mapped as a whole. After this patch, continuos guest physical memory blocks which are not continuos in host virtual address space will be processed correctly. Signed-off-by: Viktor Prutyanov <viktor.prutyanov@virtuozzo.com> Message-Id: <1535567456-6904-1-git-send-email-viktor.prutyanov@virtuozzo.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'win_dump.c')
-rw-r--r--win_dump.c40
1 files changed, 22 insertions, 18 deletions
diff --git a/win_dump.c b/win_dump.c
index b15c191ad7..e10a7831c2 100644
--- a/win_dump.c
+++ b/win_dump.c
@@ -30,28 +30,32 @@ static size_t write_run(WinDumpPhyMemRun64 *run, int fd, Error **errp)
void *buf;
uint64_t addr = run->BasePage << TARGET_PAGE_BITS;
uint64_t size = run->PageCount << TARGET_PAGE_BITS;
- uint64_t len = size;
+ uint64_t len, l;
+ size_t total = 0;
- buf = cpu_physical_memory_map(addr, &len, false);
- if (!buf) {
- error_setg(errp, "win-dump: failed to map run");
- return 0;
- }
- if (len != size) {
- error_setg(errp, "win-dump: failed to map entire run");
- len = 0;
- goto out_unmap;
- }
+ while (size) {
+ len = size;
- len = qemu_write_full(fd, buf, len);
- if (len != size) {
- error_setg(errp, QERR_IO_ERROR);
- }
+ buf = cpu_physical_memory_map(addr, &len, false);
+ if (!buf) {
+ error_setg(errp, "win-dump: failed to map physical range"
+ " 0x%016" PRIx64 "-0x%016" PRIx64, addr, addr + size - 1);
+ return 0;
+ }
+
+ l = qemu_write_full(fd, buf, len);
+ cpu_physical_memory_unmap(buf, addr, false, len);
+ if (l != len) {
+ error_setg(errp, QERR_IO_ERROR);
+ return 0;
+ }
-out_unmap:
- cpu_physical_memory_unmap(buf, addr, false, len);
+ addr += l;
+ size -= l;
+ total += l;
+ }
- return len;
+ return total;
}
static void write_runs(DumpState *s, WinDumpHeader64 *h, Error **errp)