From: David Gibson <david@gibson.dropbear.id.au>
To: agraf@suse.de, quintela@redhat.com
Cc: qemu-ppc@nongnu.org, qemu-devel@nongnu.org,
David Gibson <david@gibson.dropbear.id.au>
Subject: [Qemu-devel] [PATCH 08/15] savevm: Implement VMS_DIVIDE flag
Date: Mon, 15 Oct 2012 10:24:35 +1000 [thread overview]
Message-ID: <1350260682-21428-9-git-send-email-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <1350260682-21428-1-git-send-email-david@gibson.dropbear.id.au>
The vmstate infrastructure includes a VMS_MULTIPY flag, and associated
VMSTATE_VBUFFER_MULTIPLY helper macro. These can be used to save a
variably sized buffer where the size in bytes of the buffer isn't directly
accessible as a structure field, but an element count from which the size
can be derived is.
This patch adds an analogous VMS_DIVIDE option, which handles a variably
sized buffer whose size is a submultiple of a field, rather than a
multiple. For example a buffer containing per-page structures whose size
is derived from a field storing the total address space described by the
structures could use this construct.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
savevm.c | 8 ++++++++
vmstate.h | 13 +++++++++++++
2 files changed, 21 insertions(+)
diff --git a/savevm.c b/savevm.c
index 02e9da0..d830837 100644
--- a/savevm.c
+++ b/savevm.c
@@ -1460,6 +1460,10 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
if (field->flags & VMS_MULTIPLY) {
size *= field->size;
}
+ if (field->flags & VMS_DIVIDE) {
+ assert((size % field->size) == 0);
+ size /= field->size;
+ }
}
if (field->flags & VMS_ARRAY) {
n_elems = field->num;
@@ -1524,6 +1528,10 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
if (field->flags & VMS_MULTIPLY) {
size *= field->size;
}
+ if (field->flags & VMS_DIVIDE) {
+ assert((size % field->size) == 0);
+ size /= field->size;
+ }
}
if (field->flags & VMS_ARRAY) {
n_elems = field->num;
diff --git a/vmstate.h b/vmstate.h
index 6bfdb6a..634dbde 100644
--- a/vmstate.h
+++ b/vmstate.h
@@ -82,6 +82,7 @@ enum VMStateFlags {
VMS_MULTIPLY = 0x200, /* multiply "size" field by field_size */
VMS_VARRAY_UINT8 = 0x400, /* Array with size in uint8_t field*/
VMS_VARRAY_UINT32 = 0x800, /* Array with size in uint32_t field*/
+ VMS_DIVIDE = 0x1000, /* divide "size" field by field_size */
};
typedef struct {
@@ -384,6 +385,18 @@ extern const VMStateInfo vmstate_info_unused_buffer;
.start = (_start), \
}
+#define VMSTATE_VBUFFER_DIVIDE(_field, _state, _version, _test, _start, _field_size, _divide) { \
+ .name = (stringify(_field)), \
+ .version_id = (_version), \
+ .field_exists = (_test), \
+ .size_offset = vmstate_offset_value(_state, _field_size, uint32_t),\
+ .size = (_divide), \
+ .info = &vmstate_info_buffer, \
+ .flags = VMS_VBUFFER|VMS_POINTER|VMS_DIVIDE, \
+ .offset = offsetof(_state, _field), \
+ .start = (_start), \
+}
+
#define VMSTATE_VBUFFER(_field, _state, _version, _test, _start, _field_size) { \
.name = (stringify(_field)), \
.version_id = (_version), \
--
1.7.10.4
next prev parent reply other threads:[~2012-10-15 0:23 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-15 0:24 [Qemu-devel] RFC: savevm/migration support for pseries David Gibson
2012-10-15 0:24 ` [Qemu-devel] [PATCH 01/15] pseries: Split xics irq configuration from state information David Gibson
2012-10-15 0:24 ` [Qemu-devel] [PATCH 02/15] target-pcc: Convert ppcemb_tlb_t to use fixed 64-bit RPN David Gibson
2012-10-15 0:24 ` [Qemu-devel] [PATCH 03/15] savevm: Add VMSTATE_UINT64_EQUAL helpers David Gibson
2012-10-15 0:24 ` [Qemu-devel] [PATCH 04/15] savevm: Add VMSTATE_UINTTL_EQUAL helper David Gibson
2012-10-15 0:24 ` [Qemu-devel] [PATCH 05/15] savevm: Add VMSTATE_FLOAT64 helpers David Gibson
2012-10-15 0:24 ` [Qemu-devel] [PATCH 06/15] savevm: Add VMSTATE_STRUCT_VARRAY_POINTER_UINT32 David Gibson
2012-10-15 0:24 ` [Qemu-devel] [PATCH 07/15] savevm: Fix bugs in the VMSTATE_VBUFFER_MULTIPLY definition David Gibson
2012-10-15 0:24 ` David Gibson [this message]
2012-10-15 0:24 ` [Qemu-devel] [PATCH 09/15] target-ppc: Convert ppc cpu savevm to VMStateDescription David Gibson
2012-10-15 0:24 ` [Qemu-devel] [PATCH 10/15] pseries: savevm support for XICS interrupt controller David Gibson
2012-10-15 0:24 ` [Qemu-devel] [PATCH 11/15] pseries: savevm support for VIO devices David Gibson
2012-10-15 0:24 ` [Qemu-devel] [PATCH 12/15] pseries: savevm support for PAPR VIO logical lan David Gibson
2012-10-15 0:24 ` [Qemu-devel] [PATCH 13/15] pseries: savevm support for PAPR TCE tables David Gibson
2012-10-15 0:24 ` [Qemu-devel] [PATCH 14/15] pseries: savevm support for PAPR virtual SCSI David Gibson
2012-10-15 0:24 ` [Qemu-devel] [PATCH 15/15] pseries: savevm support for pseries machine David Gibson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1350260682-21428-9-git-send-email-david@gibson.dropbear.id.au \
--to=david@gibson.dropbear.id.au \
--cc=agraf@suse.de \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=quintela@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).