Patchwork [02/58] vmstate: Fix varrays with uint8 indexes

login
register
mail settings
Submitter Juan Quintela
Date Feb. 24, 2011, 5:56 p.m.
Message ID <061d6a10262c1c3d1c74ef92e5e705c6136fd1fb.1298569508.git.quintela@redhat.com>
Download mbox | patch
Permalink /patch/84462/
State New
Headers show

Comments

Juan Quintela - Feb. 24, 2011, 5:56 p.m.
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
 hw/hw.h  |    5 +++--
 savevm.c |    2 ++
 2 files changed, 5 insertions(+), 2 deletions(-)

Patch

diff --git a/hw/hw.h b/hw/hw.h
index 209f568..4a02799 100644
--- a/hw/hw.h
+++ b/hw/hw.h
@@ -298,6 +298,7 @@  enum VMStateFlags {
     VMS_VARRAY_UINT16    = 0x080,  /* Array with size in uint16_t field */
     VMS_VBUFFER          = 0x100,  /* Buffer with size in int32_t field */
     VMS_MULTIPLY         = 0x200,  /* multiply "size" field by field_size */
+    VMS_VARRAY_UINT8     = 0x400,  /* Array with size in uint8_t field*/
 };

 typedef struct {
@@ -488,11 +489,11 @@  extern const VMStateInfo vmstate_info_unused_buffer;

 #define VMSTATE_STRUCT_VARRAY_UINT8(_field, _state, _field_num, _version, _vmsd, _type) { \
     .name       = (stringify(_field)),                               \
-    .num_offset = vmstate_offset_value(_state, _field_num, uint8_t),  \
+    .num_offset = vmstate_offset_value(_state, _field_num, uint8_t), \
     .version_id = (_version),                                        \
     .vmsd       = &(_vmsd),                                          \
     .size       = sizeof(_type),                                     \
-    .flags      = VMS_STRUCT|VMS_VARRAY_INT32,                       \
+    .flags      = VMS_STRUCT|VMS_VARRAY_UINT8,                       \
     .offset     = offsetof(_state, _field),                          \
 }

diff --git a/savevm.c b/savevm.c
index ce063d1..4db036b 100644
--- a/savevm.c
+++ b/savevm.c
@@ -1331,6 +1331,8 @@  int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
                 n_elems = *(int32_t *)(opaque+field->num_offset);
             } else if (field->flags & VMS_VARRAY_UINT16) {
                 n_elems = *(uint16_t *)(opaque+field->num_offset);
+            } else if (field->flags & VMS_VARRAY_UINT8) {
+                n_elems = *(uint8_t *)(opaque+field->num_offset);
             }
             if (field->flags & VMS_POINTER) {
                 base_addr = *(void **)base_addr + field->start;