X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=win_dump.c;h=0142655d3d06ae4fecbfd65136a0a00056d1fad9;hb=6b7ac49d570c66754fad1b80cc200c7596d1facd;hp=b15c191ad738488e86da7afa191796515b6f3f67;hpb=2ad9b50f713053dcd6c44b2b5e3bbdb0cfe8a52d;p=mirror_qemu.git diff --git a/win_dump.c b/win_dump.c index b15c191ad7..0142655d3d 100644 --- a/win_dump.c +++ b/win_dump.c @@ -9,6 +9,7 @@ */ #include "qemu/osdep.h" +#include "qemu-common.h" #include "qemu/cutils.h" #include "elf.h" #include "cpu.h" @@ -30,28 +31,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)