* Re: [Qemu-devel] [PATCH] dump: fix Windows dump memory run mapping
2018-08-29 18:30 [Qemu-devel] [PATCH] dump: fix Windows dump memory run mapping Viktor Prutyanov
@ 2018-09-05 14:06 ` Прутьянов, Виктор Владимирович
2018-09-09 18:28 ` Viktor Prutyanov
2018-09-11 13:02 ` Paolo Bonzini
2 siblings, 0 replies; 4+ messages in thread
From: Прутьянов, Виктор Владимирович @ 2018-09-05 14:06 UTC (permalink / raw)
To: qemu-devel; +Cc: pbonzini, Roman Kagan
2018-08-29 21:30 GMT+03:00 Viktor Prutyanov <viktor.prutyanov@virtuozzo.com>:
>
> 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>
> ---
> win_dump.c | 40 ++++++++++++++++++++++------------------
> 1 file changed, 22 insertions(+), 18 deletions(-)
>
> diff --git a/win_dump.c b/win_dump.c
> index b15c191..aa39d9c 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%016lx-0x%016lx", 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)
> --
> 2.7.4
>
ping
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [Qemu-devel] [PATCH] dump: fix Windows dump memory run mapping
2018-08-29 18:30 [Qemu-devel] [PATCH] dump: fix Windows dump memory run mapping Viktor Prutyanov
2018-09-05 14:06 ` Прутьянов, Виктор Владимирович
@ 2018-09-09 18:28 ` Viktor Prutyanov
2018-09-11 13:02 ` Paolo Bonzini
2 siblings, 0 replies; 4+ messages in thread
From: Viktor Prutyanov @ 2018-09-09 18:28 UTC (permalink / raw)
To: pbonzini; +Cc: qemu-devel, rkagan
В Wed, 29 Aug 2018 21:30:56 +0300
Viktor Prutyanov <viktor.prutyanov@virtuozzo.com> пишет:
> 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>
> ---
> win_dump.c | 40 ++++++++++++++++++++++------------------
> 1 file changed, 22 insertions(+), 18 deletions(-)
>
> diff --git a/win_dump.c b/win_dump.c
> index b15c191..aa39d9c 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%016lx-0x%016lx", 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)
ping
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [Qemu-devel] [PATCH] dump: fix Windows dump memory run mapping
2018-08-29 18:30 [Qemu-devel] [PATCH] dump: fix Windows dump memory run mapping Viktor Prutyanov
2018-09-05 14:06 ` Прутьянов, Виктор Владимирович
2018-09-09 18:28 ` Viktor Prutyanov
@ 2018-09-11 13:02 ` Paolo Bonzini
2 siblings, 0 replies; 4+ messages in thread
From: Paolo Bonzini @ 2018-09-11 13:02 UTC (permalink / raw)
To: Viktor Prutyanov; +Cc: qemu-devel, rkagan, viktor.prutyanov
On 29/08/2018 20:30, Viktor Prutyanov wrote:
> 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>
> ---
> win_dump.c | 40 ++++++++++++++++++++++------------------
> 1 file changed, 22 insertions(+), 18 deletions(-)
>
> diff --git a/win_dump.c b/win_dump.c
> index b15c191..aa39d9c 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%016lx-0x%016lx", 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)
>
Queued, thanks.
Paolo
^ permalink raw reply [flat|nested] 4+ messages in thread