diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2012-08-08 16:47:43 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2012-08-08 18:53:15 +0100 |
commit | 21ad9311b5c5ec57b184f0a2f1f52018beeebdb3 (patch) | |
tree | 9bfba589c2ad3830a4ba6ba06484b217d70363c2 /savevm.c | |
parent | b2ed1239975215445e6cb662562d47a6ef03d945 (diff) |
vmstate: Add support for saving/loading bitmaps
Add support for saving/loading bitmap.h bitmaps in vmstate.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'savevm.c')
-rw-r--r-- | savevm.c | 47 |
1 files changed, 47 insertions, 0 deletions
@@ -86,6 +86,7 @@ #include "memory.h" #include "qmp-commands.h" #include "trace.h" +#include "bitops.h" #define SELF_ANNOUNCE_ROUNDS 5 @@ -1159,6 +1160,52 @@ const VMStateInfo vmstate_info_unused_buffer = { .put = put_unused_buffer, }; +/* bitmaps (as defined by bitmap.h). Note that size here + * is the size of the bitmap in bits. + * The on-the-wire format of a bitmap is 64 bit words + * with the bits in big endian order. The in-memory format + * is an array of 'unsigned long', which may be either + * 32 or 64 bits. + */ +/* This is the number of 64 bit words sent over the wire */ +#define BITS_TO_U64S(nr) DIV_ROUND_UP(nr, 64) +static int get_bitmap(QEMUFile *f, void *pv, size_t size) +{ + unsigned long *bmp = pv; + int i, idx = 0; + for (i = 0; i < BITS_TO_U64S(size); i++) { + uint64_t w = qemu_get_be64(f); + bmp[idx++] = w; +#if LONG_MAX == 0x7FFFFFFF + if (idx < BITS_TO_LONGS(size)) { + bmp[idx++] = w >> 32; + } +#endif + } + return 0; +} + +static void put_bitmap(QEMUFile *f, void *pv, size_t size) +{ + unsigned long *bmp = pv; + int i, idx = 0; + for (i = 0; i < BITS_TO_U64S(size); i++) { + uint64_t w = bmp[idx++]; +#if LONG_MAX == 0x7FFFFFFF + if (idx < BITS_TO_LONGS(size)) { + w |= ((uint64_t)bmp[idx++]) << 32; + } +#endif + qemu_put_be64(f, w); + } +} + +const VMStateInfo vmstate_info_bitmap = { + .name = "bitmap", + .get = get_bitmap, + .put = put_bitmap, +}; + typedef struct CompatEntry { char idstr[256]; int instance_id; |