Commit b47d3af7 authored by Juan Quintela's avatar Juan Quintela Committed by Mark Cave-Ayland
Browse files

vmstate: Introduce VMSTATE_VARRAY_MULTPLY



This allows to send a partial array where the size is another
structure field multiplied by a constant.

Signed-off-by: default avatarJuan Quintela <quintela@redhat.com>
[PMM: updated to current master]
Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
Signed-off-by: default avatarMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
parent 55174749
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -102,6 +102,7 @@ enum VMStateFlags {
    VMS_VARRAY_UINT32    = 0x800,  /* Array with size in uint32_t field*/
    VMS_MUST_EXIST       = 0x1000, /* Field must exist in input */
    VMS_ALLOC            = 0x2000, /* Alloc a buffer on the destination */
    VMS_MULTIPLY_ELEMENTS = 0x4000, /* multiply varray size by field->num */
};

typedef struct {
@@ -246,6 +247,16 @@ extern const VMStateInfo vmstate_info_bitmap;
    .offset     = vmstate_offset_2darray(_state, _field, _type, _n1, _n2),  \
}

#define VMSTATE_VARRAY_MULTIPLY(_field, _state, _field_num, _multiply, _info, _type) { \
    .name       = (stringify(_field)),                               \
    .num_offset = vmstate_offset_value(_state, _field_num, uint32_t),\
    .num        = (_multiply),                                       \
    .info       = &(_info),                                          \
    .size       = sizeof(_type),                                     \
    .flags      = VMS_VARRAY_UINT32|VMS_MULTIPLY_ELEMENTS,           \
    .offset     = offsetof(_state, _field),                          \
}

#define VMSTATE_ARRAY_TEST(_field, _state, _num, _test, _info, _type) {\
    .name         = (stringify(_field)),                              \
    .field_exists = (_test),                                          \
+4 −0
Original line number Diff line number Diff line
@@ -28,6 +28,10 @@ static int vmstate_n_elems(void *opaque, VMStateField *field)
        n_elems = *(uint8_t *)(opaque+field->num_offset);
    }

    if (field->flags & VMS_MULTIPLY_ELEMENTS) {
        n_elems *= field->num;
    }

    return n_elems;
}