All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [Bug 1305400] [NEW] qmp-version of memsave makes a zero filled dump
@ 2014-04-10  4:04 Andrey Karpov
  2018-05-02 10:35 ` [Qemu-devel] [Bug 1305400] " Thomas Huth
  2018-07-02  4:17 ` Launchpad Bug Tracker
  0 siblings, 2 replies; 3+ messages in thread
From: Andrey Karpov @ 2014-04-10  4:04 UTC (permalink / raw)
  To: qemu-devel

Public bug reported:

calling the memsave function through hmp and qmp makes a different
results. it happened because hmp_memsave calls synchronization of cpu,
but qmp_marshal_input_memsave does not. so virDomainMemoryPeek (libvirt
api) does not work correctly

1) hmp:
void hmp_memsave(Monitor *mon, const QDict *qdict)
{
    uint32_t size = qdict_get_int(qdict, "size");
    const char *filename = qdict_get_str(qdict, "filename");
    uint64_t addr = qdict_get_int(qdict, "val");
    Error *errp = NULL;

    qmp_memsave(addr, size, filename, true, <<<< monitor_get_cpu_index() >>>, &errp);
    hmp_handle_error(mon, &errp);
}
int monitor_get_cpu_index(void)
{
    CPUState *cpu = ENV_GET_CPU(<<< mon_get_cpu >>>());
    return cpu->cpu_index;
}
static CPUArchState *mon_get_cpu(void)
{
    if (!cur_mon->mon_cpu) {
        monitor_set_cpu(0);
    }
    <<< cpu_synchronize_state(cur_mon->mon_cpu); >>>
    return cur_mon->mon_cpu->env_ptr;
}

2) qmp
int qmp_marshal_input_memsave(Monitor *mon, const QDict *qdict, QObject **ret)
{
    Error *local_err = NULL;
    Error **errp = &local_err;
    QDict *args = (QDict *)qdict;
    QmpInputVisitor *mi;
    QapiDeallocVisitor *md;
    Visitor *v;
    int64_t val;
    int64_t size;
    char * filename = NULL;
    bool has_cpu_index = false;
    int64_t cpu_index;

    mi = qmp_input_visitor_new_strict(QOBJECT(args));
    v = qmp_input_get_visitor(mi);
    visit_type_int(v, &val, "val", errp);
    visit_type_int(v, &size, "size", errp);
    visit_type_str(v, &filename, "filename", errp);
    visit_start_optional(v, &has_cpu_index, "cpu-index", errp);
    if (has_cpu_index) {
        visit_type_int(v, &cpu_index, "cpu-index", errp);
    }
    visit_end_optional(v, errp);
    qmp_input_visitor_cleanup(mi);

    if (error_is_set(errp)) {
        goto out;
    }
    <<< qmp_memsave(val, size, filename, has_cpu_index, cpu_index, errp); >>>

out:
    md = qapi_dealloc_visitor_new();
    v = qapi_dealloc_get_visitor(md);
    visit_type_int(v, &val, "val", NULL);
    visit_type_int(v, &size, "size", NULL);
    visit_type_str(v, &filename, "filename", NULL);
    visit_start_optional(v, &has_cpu_index, "cpu-index", NULL);
    if (has_cpu_index) {
        visit_type_int(v, &cpu_index, "cpu-index", NULL);
    }
    visit_end_optional(v, NULL);
    qapi_dealloc_visitor_cleanup(md);

    if (local_err) {
        qerror_report_err(local_err);
        error_free(local_err);
        return -1;
    }
    return 0;
}

how to reproduce:

1) run qemu as it makes a libvirtd
./qemu-system-x86_64 -name gentoo -machine pc-i440fx-1.7,accel=kvm,usb=off -m 1024 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid 135b3e47-43ca-bc68-e23b-354a2f62a023 -no-user-config -nodefaults -chardev socket,id=charmonitor,path=./gentoo.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -boot menu=off,strict=on -kernel ./bzImage -append root="/dev/vda2 vga=38f" -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=./gentoo.img,if=none,id=drive-virtio-disk0,format=raw -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive file=./install-amd64-minimal-20140320.iso,if=none,id=drive-ide0-1-0,readonly=on,format=raw -device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0,bootindex=2 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 127.0.0.1:0 -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,bus=pci.0,addr=0x2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 -vnc 127.0.0.1:2 -monitor stdio

2) attach to qemu through qmp-shell (taken from qemu sources)
python ./qmp-shell ./gentoo.monitor

3) make some commands in sequence
(qmp-shell) memsave memsave val=-2130706432 size=100 filename=./test01
(stdio monitor) memsave 0xffffffff81000000 100 ./test02
(qmp-shell) memsave memsave val=-2130706432 size=100 filename=./test03

result:
test01 - zero filled
test02 - right
test03 - right

** Affects: qemu
     Importance: Undecided
         Status: New


** Tags: memsave qmp virdomainmemorypeek

-- 
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/1305400

Title:
  qmp-version of memsave makes a zero filled dump

Status in QEMU:
  New

Bug description:
  calling the memsave function through hmp and qmp makes a different
  results. it happened because hmp_memsave calls synchronization of cpu,
  but qmp_marshal_input_memsave does not. so virDomainMemoryPeek
  (libvirt api) does not work correctly

  1) hmp:
  void hmp_memsave(Monitor *mon, const QDict *qdict)
  {
      uint32_t size = qdict_get_int(qdict, "size");
      const char *filename = qdict_get_str(qdict, "filename");
      uint64_t addr = qdict_get_int(qdict, "val");
      Error *errp = NULL;

      qmp_memsave(addr, size, filename, true, <<<< monitor_get_cpu_index() >>>, &errp);
      hmp_handle_error(mon, &errp);
  }
  int monitor_get_cpu_index(void)
  {
      CPUState *cpu = ENV_GET_CPU(<<< mon_get_cpu >>>());
      return cpu->cpu_index;
  }
  static CPUArchState *mon_get_cpu(void)
  {
      if (!cur_mon->mon_cpu) {
          monitor_set_cpu(0);
      }
      <<< cpu_synchronize_state(cur_mon->mon_cpu); >>>
      return cur_mon->mon_cpu->env_ptr;
  }

  2) qmp
  int qmp_marshal_input_memsave(Monitor *mon, const QDict *qdict, QObject **ret)
  {
      Error *local_err = NULL;
      Error **errp = &local_err;
      QDict *args = (QDict *)qdict;
      QmpInputVisitor *mi;
      QapiDeallocVisitor *md;
      Visitor *v;
      int64_t val;
      int64_t size;
      char * filename = NULL;
      bool has_cpu_index = false;
      int64_t cpu_index;

      mi = qmp_input_visitor_new_strict(QOBJECT(args));
      v = qmp_input_get_visitor(mi);
      visit_type_int(v, &val, "val", errp);
      visit_type_int(v, &size, "size", errp);
      visit_type_str(v, &filename, "filename", errp);
      visit_start_optional(v, &has_cpu_index, "cpu-index", errp);
      if (has_cpu_index) {
          visit_type_int(v, &cpu_index, "cpu-index", errp);
      }
      visit_end_optional(v, errp);
      qmp_input_visitor_cleanup(mi);

      if (error_is_set(errp)) {
          goto out;
      }
      <<< qmp_memsave(val, size, filename, has_cpu_index, cpu_index, errp); >>>

  out:
      md = qapi_dealloc_visitor_new();
      v = qapi_dealloc_get_visitor(md);
      visit_type_int(v, &val, "val", NULL);
      visit_type_int(v, &size, "size", NULL);
      visit_type_str(v, &filename, "filename", NULL);
      visit_start_optional(v, &has_cpu_index, "cpu-index", NULL);
      if (has_cpu_index) {
          visit_type_int(v, &cpu_index, "cpu-index", NULL);
      }
      visit_end_optional(v, NULL);
      qapi_dealloc_visitor_cleanup(md);

      if (local_err) {
          qerror_report_err(local_err);
          error_free(local_err);
          return -1;
      }
      return 0;
  }

  how to reproduce:

  1) run qemu as it makes a libvirtd
  ./qemu-system-x86_64 -name gentoo -machine pc-i440fx-1.7,accel=kvm,usb=off -m 1024 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid 135b3e47-43ca-bc68-e23b-354a2f62a023 -no-user-config -nodefaults -chardev socket,id=charmonitor,path=./gentoo.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -boot menu=off,strict=on -kernel ./bzImage -append root="/dev/vda2 vga=38f" -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=./gentoo.img,if=none,id=drive-virtio-disk0,format=raw -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive file=./install-amd64-minimal-20140320.iso,if=none,id=drive-ide0-1-0,readonly=on,format=raw -device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0,bootindex=2 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 127.0.0.1:0 -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,bus=pci.0,addr=0x2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 -vnc 127.0.0.1:2 -monitor stdio

  2) attach to qemu through qmp-shell (taken from qemu sources)
  python ./qmp-shell ./gentoo.monitor

  3) make some commands in sequence
  (qmp-shell) memsave memsave val=-2130706432 size=100 filename=./test01
  (stdio monitor) memsave 0xffffffff81000000 100 ./test02
  (qmp-shell) memsave memsave val=-2130706432 size=100 filename=./test03

  result:
  test01 - zero filled
  test02 - right
  test03 - right

To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/1305400/+subscriptions

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Qemu-devel] [Bug 1305400] Re: qmp-version of memsave makes a zero filled dump
  2014-04-10  4:04 [Qemu-devel] [Bug 1305400] [NEW] qmp-version of memsave makes a zero filled dump Andrey Karpov
@ 2018-05-02 10:35 ` Thomas Huth
  2018-07-02  4:17 ` Launchpad Bug Tracker
  1 sibling, 0 replies; 3+ messages in thread
From: Thomas Huth @ 2018-05-02 10:35 UTC (permalink / raw)
  To: qemu-devel

Looking through old bug tickets... can you still reproduce this issue
with the latest version of QEMU? Or could we close this ticket nowadays?

** Changed in: qemu
       Status: New => Incomplete

-- 
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/1305400

Title:
  qmp-version of memsave makes a zero filled dump

Status in QEMU:
  Incomplete

Bug description:
  calling the memsave function through hmp and qmp makes a different
  results. it happened because hmp_memsave calls synchronization of cpu,
  but qmp_marshal_input_memsave does not. so virDomainMemoryPeek
  (libvirt api) does not work correctly

  1) hmp:
  void hmp_memsave(Monitor *mon, const QDict *qdict)
  {
      uint32_t size = qdict_get_int(qdict, "size");
      const char *filename = qdict_get_str(qdict, "filename");
      uint64_t addr = qdict_get_int(qdict, "val");
      Error *errp = NULL;

      qmp_memsave(addr, size, filename, true, <<<< monitor_get_cpu_index() >>>, &errp);
      hmp_handle_error(mon, &errp);
  }
  int monitor_get_cpu_index(void)
  {
      CPUState *cpu = ENV_GET_CPU(<<< mon_get_cpu >>>());
      return cpu->cpu_index;
  }
  static CPUArchState *mon_get_cpu(void)
  {
      if (!cur_mon->mon_cpu) {
          monitor_set_cpu(0);
      }
      <<< cpu_synchronize_state(cur_mon->mon_cpu); >>>
      return cur_mon->mon_cpu->env_ptr;
  }

  2) qmp
  int qmp_marshal_input_memsave(Monitor *mon, const QDict *qdict, QObject **ret)
  {
      Error *local_err = NULL;
      Error **errp = &local_err;
      QDict *args = (QDict *)qdict;
      QmpInputVisitor *mi;
      QapiDeallocVisitor *md;
      Visitor *v;
      int64_t val;
      int64_t size;
      char * filename = NULL;
      bool has_cpu_index = false;
      int64_t cpu_index;

      mi = qmp_input_visitor_new_strict(QOBJECT(args));
      v = qmp_input_get_visitor(mi);
      visit_type_int(v, &val, "val", errp);
      visit_type_int(v, &size, "size", errp);
      visit_type_str(v, &filename, "filename", errp);
      visit_start_optional(v, &has_cpu_index, "cpu-index", errp);
      if (has_cpu_index) {
          visit_type_int(v, &cpu_index, "cpu-index", errp);
      }
      visit_end_optional(v, errp);
      qmp_input_visitor_cleanup(mi);

      if (error_is_set(errp)) {
          goto out;
      }
      <<< qmp_memsave(val, size, filename, has_cpu_index, cpu_index, errp); >>>

  out:
      md = qapi_dealloc_visitor_new();
      v = qapi_dealloc_get_visitor(md);
      visit_type_int(v, &val, "val", NULL);
      visit_type_int(v, &size, "size", NULL);
      visit_type_str(v, &filename, "filename", NULL);
      visit_start_optional(v, &has_cpu_index, "cpu-index", NULL);
      if (has_cpu_index) {
          visit_type_int(v, &cpu_index, "cpu-index", NULL);
      }
      visit_end_optional(v, NULL);
      qapi_dealloc_visitor_cleanup(md);

      if (local_err) {
          qerror_report_err(local_err);
          error_free(local_err);
          return -1;
      }
      return 0;
  }

  how to reproduce:

  1) run qemu as it makes a libvirtd
  ./qemu-system-x86_64 -name gentoo -machine pc-i440fx-1.7,accel=kvm,usb=off -m 1024 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid 135b3e47-43ca-bc68-e23b-354a2f62a023 -no-user-config -nodefaults -chardev socket,id=charmonitor,path=./gentoo.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -boot menu=off,strict=on -kernel ./bzImage -append root="/dev/vda2 vga=38f" -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=./gentoo.img,if=none,id=drive-virtio-disk0,format=raw -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive file=./install-amd64-minimal-20140320.iso,if=none,id=drive-ide0-1-0,readonly=on,format=raw -device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0,bootindex=2 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 127.0.0.1:0 -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,bus=pci.0,addr=0x2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 -vnc 127.0.0.1:2 -monitor stdio

  2) attach to qemu through qmp-shell (taken from qemu sources)
  python ./qmp-shell ./gentoo.monitor

  3) make some commands in sequence
  (qmp-shell) memsave memsave val=-2130706432 size=100 filename=./test01
  (stdio monitor) memsave 0xffffffff81000000 100 ./test02
  (qmp-shell) memsave memsave val=-2130706432 size=100 filename=./test03

  result:
  test01 - zero filled
  test02 - right
  test03 - right

To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/1305400/+subscriptions

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Qemu-devel] [Bug 1305400] Re: qmp-version of memsave makes a zero filled dump
  2014-04-10  4:04 [Qemu-devel] [Bug 1305400] [NEW] qmp-version of memsave makes a zero filled dump Andrey Karpov
  2018-05-02 10:35 ` [Qemu-devel] [Bug 1305400] " Thomas Huth
@ 2018-07-02  4:17 ` Launchpad Bug Tracker
  1 sibling, 0 replies; 3+ messages in thread
From: Launchpad Bug Tracker @ 2018-07-02  4:17 UTC (permalink / raw)
  To: qemu-devel

[Expired for QEMU because there has been no activity for 60 days.]

** Changed in: qemu
       Status: Incomplete => Expired

-- 
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/1305400

Title:
  qmp-version of memsave makes a zero filled dump

Status in QEMU:
  Expired

Bug description:
  calling the memsave function through hmp and qmp makes a different
  results. it happened because hmp_memsave calls synchronization of cpu,
  but qmp_marshal_input_memsave does not. so virDomainMemoryPeek
  (libvirt api) does not work correctly

  1) hmp:
  void hmp_memsave(Monitor *mon, const QDict *qdict)
  {
      uint32_t size = qdict_get_int(qdict, "size");
      const char *filename = qdict_get_str(qdict, "filename");
      uint64_t addr = qdict_get_int(qdict, "val");
      Error *errp = NULL;

      qmp_memsave(addr, size, filename, true, <<<< monitor_get_cpu_index() >>>, &errp);
      hmp_handle_error(mon, &errp);
  }
  int monitor_get_cpu_index(void)
  {
      CPUState *cpu = ENV_GET_CPU(<<< mon_get_cpu >>>());
      return cpu->cpu_index;
  }
  static CPUArchState *mon_get_cpu(void)
  {
      if (!cur_mon->mon_cpu) {
          monitor_set_cpu(0);
      }
      <<< cpu_synchronize_state(cur_mon->mon_cpu); >>>
      return cur_mon->mon_cpu->env_ptr;
  }

  2) qmp
  int qmp_marshal_input_memsave(Monitor *mon, const QDict *qdict, QObject **ret)
  {
      Error *local_err = NULL;
      Error **errp = &local_err;
      QDict *args = (QDict *)qdict;
      QmpInputVisitor *mi;
      QapiDeallocVisitor *md;
      Visitor *v;
      int64_t val;
      int64_t size;
      char * filename = NULL;
      bool has_cpu_index = false;
      int64_t cpu_index;

      mi = qmp_input_visitor_new_strict(QOBJECT(args));
      v = qmp_input_get_visitor(mi);
      visit_type_int(v, &val, "val", errp);
      visit_type_int(v, &size, "size", errp);
      visit_type_str(v, &filename, "filename", errp);
      visit_start_optional(v, &has_cpu_index, "cpu-index", errp);
      if (has_cpu_index) {
          visit_type_int(v, &cpu_index, "cpu-index", errp);
      }
      visit_end_optional(v, errp);
      qmp_input_visitor_cleanup(mi);

      if (error_is_set(errp)) {
          goto out;
      }
      <<< qmp_memsave(val, size, filename, has_cpu_index, cpu_index, errp); >>>

  out:
      md = qapi_dealloc_visitor_new();
      v = qapi_dealloc_get_visitor(md);
      visit_type_int(v, &val, "val", NULL);
      visit_type_int(v, &size, "size", NULL);
      visit_type_str(v, &filename, "filename", NULL);
      visit_start_optional(v, &has_cpu_index, "cpu-index", NULL);
      if (has_cpu_index) {
          visit_type_int(v, &cpu_index, "cpu-index", NULL);
      }
      visit_end_optional(v, NULL);
      qapi_dealloc_visitor_cleanup(md);

      if (local_err) {
          qerror_report_err(local_err);
          error_free(local_err);
          return -1;
      }
      return 0;
  }

  how to reproduce:

  1) run qemu as it makes a libvirtd
  ./qemu-system-x86_64 -name gentoo -machine pc-i440fx-1.7,accel=kvm,usb=off -m 1024 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid 135b3e47-43ca-bc68-e23b-354a2f62a023 -no-user-config -nodefaults -chardev socket,id=charmonitor,path=./gentoo.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -boot menu=off,strict=on -kernel ./bzImage -append root="/dev/vda2 vga=38f" -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=./gentoo.img,if=none,id=drive-virtio-disk0,format=raw -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive file=./install-amd64-minimal-20140320.iso,if=none,id=drive-ide0-1-0,readonly=on,format=raw -device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0,bootindex=2 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 127.0.0.1:0 -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,bus=pci.0,addr=0x2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 -vnc 127.0.0.1:2 -monitor stdio

  2) attach to qemu through qmp-shell (taken from qemu sources)
  python ./qmp-shell ./gentoo.monitor

  3) make some commands in sequence
  (qmp-shell) memsave memsave val=-2130706432 size=100 filename=./test01
  (stdio monitor) memsave 0xffffffff81000000 100 ./test02
  (qmp-shell) memsave memsave val=-2130706432 size=100 filename=./test03

  result:
  test01 - zero filled
  test02 - right
  test03 - right

To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/1305400/+subscriptions

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2018-07-02  4:30 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-04-10  4:04 [Qemu-devel] [Bug 1305400] [NEW] qmp-version of memsave makes a zero filled dump Andrey Karpov
2018-05-02 10:35 ` [Qemu-devel] [Bug 1305400] " Thomas Huth
2018-07-02  4:17 ` Launchpad Bug Tracker

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.