* [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.