Statistics
| Branch: | Revision:

root / vmstate.h @ 4e339882

History | View | Annotate | Download (29.4 kB)

1 701a8f76 Paolo Bonzini
/*
2 701a8f76 Paolo Bonzini
 * QEMU migration/snapshot declarations
3 701a8f76 Paolo Bonzini
 *
4 701a8f76 Paolo Bonzini
 * Copyright (c) 2009-2011 Red Hat, Inc.
5 701a8f76 Paolo Bonzini
 *
6 701a8f76 Paolo Bonzini
 * Original author: Juan Quintela <quintela@redhat.com>
7 701a8f76 Paolo Bonzini
 *
8 701a8f76 Paolo Bonzini
 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 701a8f76 Paolo Bonzini
 * of this software and associated documentation files (the "Software"), to deal
10 701a8f76 Paolo Bonzini
 * in the Software without restriction, including without limitation the rights
11 701a8f76 Paolo Bonzini
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 701a8f76 Paolo Bonzini
 * copies of the Software, and to permit persons to whom the Software is
13 701a8f76 Paolo Bonzini
 * furnished to do so, subject to the following conditions:
14 701a8f76 Paolo Bonzini
 *
15 701a8f76 Paolo Bonzini
 * The above copyright notice and this permission notice shall be included in
16 701a8f76 Paolo Bonzini
 * all copies or substantial portions of the Software.
17 701a8f76 Paolo Bonzini
 *
18 701a8f76 Paolo Bonzini
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 701a8f76 Paolo Bonzini
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 701a8f76 Paolo Bonzini
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 701a8f76 Paolo Bonzini
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 701a8f76 Paolo Bonzini
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 701a8f76 Paolo Bonzini
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 701a8f76 Paolo Bonzini
 * THE SOFTWARE.
25 701a8f76 Paolo Bonzini
 */
26 701a8f76 Paolo Bonzini
#ifndef QEMU_VMSTATE_H
27 701a8f76 Paolo Bonzini
#define QEMU_VMSTATE_H 1
28 701a8f76 Paolo Bonzini
29 701a8f76 Paolo Bonzini
typedef void SaveSetParamsHandler(int blk_enable, int shared, void * opaque);
30 701a8f76 Paolo Bonzini
typedef void SaveStateHandler(QEMUFile *f, void *opaque);
31 539de124 Luiz Capitulino
typedef int SaveLiveStateHandler(QEMUFile *f, int stage, void *opaque);
32 701a8f76 Paolo Bonzini
typedef int LoadStateHandler(QEMUFile *f, void *opaque, int version_id);
33 701a8f76 Paolo Bonzini
34 701a8f76 Paolo Bonzini
int register_savevm(DeviceState *dev,
35 701a8f76 Paolo Bonzini
                    const char *idstr,
36 701a8f76 Paolo Bonzini
                    int instance_id,
37 701a8f76 Paolo Bonzini
                    int version_id,
38 701a8f76 Paolo Bonzini
                    SaveStateHandler *save_state,
39 701a8f76 Paolo Bonzini
                    LoadStateHandler *load_state,
40 701a8f76 Paolo Bonzini
                    void *opaque);
41 701a8f76 Paolo Bonzini
42 701a8f76 Paolo Bonzini
int register_savevm_live(DeviceState *dev,
43 701a8f76 Paolo Bonzini
                         const char *idstr,
44 701a8f76 Paolo Bonzini
                         int instance_id,
45 701a8f76 Paolo Bonzini
                         int version_id,
46 701a8f76 Paolo Bonzini
                         SaveSetParamsHandler *set_params,
47 701a8f76 Paolo Bonzini
                         SaveLiveStateHandler *save_live_state,
48 701a8f76 Paolo Bonzini
                         SaveStateHandler *save_state,
49 701a8f76 Paolo Bonzini
                         LoadStateHandler *load_state,
50 701a8f76 Paolo Bonzini
                         void *opaque);
51 701a8f76 Paolo Bonzini
52 701a8f76 Paolo Bonzini
void unregister_savevm(DeviceState *dev, const char *idstr, void *opaque);
53 701a8f76 Paolo Bonzini
void register_device_unmigratable(DeviceState *dev, const char *idstr,
54 701a8f76 Paolo Bonzini
                                                                void *opaque);
55 701a8f76 Paolo Bonzini
56 701a8f76 Paolo Bonzini
57 701a8f76 Paolo Bonzini
typedef struct VMStateInfo VMStateInfo;
58 701a8f76 Paolo Bonzini
typedef struct VMStateDescription VMStateDescription;
59 701a8f76 Paolo Bonzini
60 701a8f76 Paolo Bonzini
struct VMStateInfo {
61 701a8f76 Paolo Bonzini
    const char *name;
62 701a8f76 Paolo Bonzini
    int (*get)(QEMUFile *f, void *pv, size_t size);
63 701a8f76 Paolo Bonzini
    void (*put)(QEMUFile *f, void *pv, size_t size);
64 701a8f76 Paolo Bonzini
};
65 701a8f76 Paolo Bonzini
66 701a8f76 Paolo Bonzini
enum VMStateFlags {
67 701a8f76 Paolo Bonzini
    VMS_SINGLE           = 0x001,
68 701a8f76 Paolo Bonzini
    VMS_POINTER          = 0x002,
69 701a8f76 Paolo Bonzini
    VMS_ARRAY            = 0x004,
70 701a8f76 Paolo Bonzini
    VMS_STRUCT           = 0x008,
71 701a8f76 Paolo Bonzini
    VMS_VARRAY_INT32     = 0x010,  /* Array with size in int32_t field*/
72 701a8f76 Paolo Bonzini
    VMS_BUFFER           = 0x020,  /* static sized buffer */
73 701a8f76 Paolo Bonzini
    VMS_ARRAY_OF_POINTER = 0x040,
74 701a8f76 Paolo Bonzini
    VMS_VARRAY_UINT16    = 0x080,  /* Array with size in uint16_t field */
75 701a8f76 Paolo Bonzini
    VMS_VBUFFER          = 0x100,  /* Buffer with size in int32_t field */
76 701a8f76 Paolo Bonzini
    VMS_MULTIPLY         = 0x200,  /* multiply "size" field by field_size */
77 701a8f76 Paolo Bonzini
    VMS_VARRAY_UINT8     = 0x400,  /* Array with size in uint8_t field*/
78 701a8f76 Paolo Bonzini
    VMS_VARRAY_UINT32    = 0x800,  /* Array with size in uint32_t field*/
79 701a8f76 Paolo Bonzini
};
80 701a8f76 Paolo Bonzini
81 701a8f76 Paolo Bonzini
typedef struct {
82 701a8f76 Paolo Bonzini
    const char *name;
83 701a8f76 Paolo Bonzini
    size_t offset;
84 701a8f76 Paolo Bonzini
    size_t size;
85 701a8f76 Paolo Bonzini
    size_t start;
86 701a8f76 Paolo Bonzini
    int num;
87 701a8f76 Paolo Bonzini
    size_t num_offset;
88 701a8f76 Paolo Bonzini
    size_t size_offset;
89 701a8f76 Paolo Bonzini
    const VMStateInfo *info;
90 701a8f76 Paolo Bonzini
    enum VMStateFlags flags;
91 701a8f76 Paolo Bonzini
    const VMStateDescription *vmsd;
92 701a8f76 Paolo Bonzini
    int version_id;
93 701a8f76 Paolo Bonzini
    bool (*field_exists)(void *opaque, int version_id);
94 701a8f76 Paolo Bonzini
} VMStateField;
95 701a8f76 Paolo Bonzini
96 701a8f76 Paolo Bonzini
typedef struct VMStateSubsection {
97 701a8f76 Paolo Bonzini
    const VMStateDescription *vmsd;
98 701a8f76 Paolo Bonzini
    bool (*needed)(void *opaque);
99 701a8f76 Paolo Bonzini
} VMStateSubsection;
100 701a8f76 Paolo Bonzini
101 701a8f76 Paolo Bonzini
struct VMStateDescription {
102 701a8f76 Paolo Bonzini
    const char *name;
103 701a8f76 Paolo Bonzini
    int unmigratable;
104 701a8f76 Paolo Bonzini
    int version_id;
105 701a8f76 Paolo Bonzini
    int minimum_version_id;
106 701a8f76 Paolo Bonzini
    int minimum_version_id_old;
107 701a8f76 Paolo Bonzini
    LoadStateHandler *load_state_old;
108 701a8f76 Paolo Bonzini
    int (*pre_load)(void *opaque);
109 701a8f76 Paolo Bonzini
    int (*post_load)(void *opaque, int version_id);
110 701a8f76 Paolo Bonzini
    void (*pre_save)(void *opaque);
111 701a8f76 Paolo Bonzini
    VMStateField *fields;
112 701a8f76 Paolo Bonzini
    const VMStateSubsection *subsections;
113 701a8f76 Paolo Bonzini
};
114 701a8f76 Paolo Bonzini
115 701a8f76 Paolo Bonzini
extern const VMStateInfo vmstate_info_bool;
116 701a8f76 Paolo Bonzini
117 701a8f76 Paolo Bonzini
extern const VMStateInfo vmstate_info_int8;
118 701a8f76 Paolo Bonzini
extern const VMStateInfo vmstate_info_int16;
119 701a8f76 Paolo Bonzini
extern const VMStateInfo vmstate_info_int32;
120 701a8f76 Paolo Bonzini
extern const VMStateInfo vmstate_info_int64;
121 701a8f76 Paolo Bonzini
122 701a8f76 Paolo Bonzini
extern const VMStateInfo vmstate_info_uint8_equal;
123 701a8f76 Paolo Bonzini
extern const VMStateInfo vmstate_info_uint16_equal;
124 701a8f76 Paolo Bonzini
extern const VMStateInfo vmstate_info_int32_equal;
125 701a8f76 Paolo Bonzini
extern const VMStateInfo vmstate_info_uint32_equal;
126 701a8f76 Paolo Bonzini
extern const VMStateInfo vmstate_info_int32_le;
127 701a8f76 Paolo Bonzini
128 701a8f76 Paolo Bonzini
extern const VMStateInfo vmstate_info_uint8;
129 701a8f76 Paolo Bonzini
extern const VMStateInfo vmstate_info_uint16;
130 701a8f76 Paolo Bonzini
extern const VMStateInfo vmstate_info_uint32;
131 701a8f76 Paolo Bonzini
extern const VMStateInfo vmstate_info_uint64;
132 701a8f76 Paolo Bonzini
133 701a8f76 Paolo Bonzini
extern const VMStateInfo vmstate_info_timer;
134 701a8f76 Paolo Bonzini
extern const VMStateInfo vmstate_info_buffer;
135 701a8f76 Paolo Bonzini
extern const VMStateInfo vmstate_info_unused_buffer;
136 701a8f76 Paolo Bonzini
137 701a8f76 Paolo Bonzini
#define type_check_array(t1,t2,n) ((t1(*)[n])0 - (t2*)0)
138 701a8f76 Paolo Bonzini
#define type_check_pointer(t1,t2) ((t1**)0 - (t2*)0)
139 701a8f76 Paolo Bonzini
140 701a8f76 Paolo Bonzini
#define vmstate_offset_value(_state, _field, _type)                  \
141 701a8f76 Paolo Bonzini
    (offsetof(_state, _field) +                                      \
142 701a8f76 Paolo Bonzini
     type_check(_type, typeof_field(_state, _field)))
143 701a8f76 Paolo Bonzini
144 701a8f76 Paolo Bonzini
#define vmstate_offset_pointer(_state, _field, _type)                \
145 701a8f76 Paolo Bonzini
    (offsetof(_state, _field) +                                      \
146 701a8f76 Paolo Bonzini
     type_check_pointer(_type, typeof_field(_state, _field)))
147 701a8f76 Paolo Bonzini
148 701a8f76 Paolo Bonzini
#define vmstate_offset_array(_state, _field, _type, _num)            \
149 701a8f76 Paolo Bonzini
    (offsetof(_state, _field) +                                      \
150 701a8f76 Paolo Bonzini
     type_check_array(_type, typeof_field(_state, _field), _num))
151 701a8f76 Paolo Bonzini
152 701a8f76 Paolo Bonzini
#define vmstate_offset_sub_array(_state, _field, _type, _start)      \
153 701a8f76 Paolo Bonzini
    (offsetof(_state, _field[_start]))
154 701a8f76 Paolo Bonzini
155 701a8f76 Paolo Bonzini
#define vmstate_offset_buffer(_state, _field)                        \
156 701a8f76 Paolo Bonzini
    vmstate_offset_array(_state, _field, uint8_t,                    \
157 701a8f76 Paolo Bonzini
                         sizeof(typeof_field(_state, _field)))
158 701a8f76 Paolo Bonzini
159 701a8f76 Paolo Bonzini
#define VMSTATE_SINGLE_TEST(_field, _state, _test, _version, _info, _type) { \
160 701a8f76 Paolo Bonzini
    .name         = (stringify(_field)),                             \
161 701a8f76 Paolo Bonzini
    .version_id   = (_version),                                      \
162 701a8f76 Paolo Bonzini
    .field_exists = (_test),                                         \
163 701a8f76 Paolo Bonzini
    .size         = sizeof(_type),                                   \
164 701a8f76 Paolo Bonzini
    .info         = &(_info),                                        \
165 701a8f76 Paolo Bonzini
    .flags        = VMS_SINGLE,                                      \
166 701a8f76 Paolo Bonzini
    .offset       = vmstate_offset_value(_state, _field, _type),     \
167 701a8f76 Paolo Bonzini
}
168 701a8f76 Paolo Bonzini
169 701a8f76 Paolo Bonzini
#define VMSTATE_POINTER(_field, _state, _version, _info, _type) {    \
170 701a8f76 Paolo Bonzini
    .name       = (stringify(_field)),                               \
171 701a8f76 Paolo Bonzini
    .version_id = (_version),                                        \
172 701a8f76 Paolo Bonzini
    .info       = &(_info),                                          \
173 701a8f76 Paolo Bonzini
    .size       = sizeof(_type),                                     \
174 701a8f76 Paolo Bonzini
    .flags      = VMS_SINGLE|VMS_POINTER,                            \
175 701a8f76 Paolo Bonzini
    .offset     = vmstate_offset_value(_state, _field, _type),       \
176 701a8f76 Paolo Bonzini
}
177 701a8f76 Paolo Bonzini
178 701a8f76 Paolo Bonzini
#define VMSTATE_POINTER_TEST(_field, _state, _test, _info, _type) {  \
179 701a8f76 Paolo Bonzini
    .name       = (stringify(_field)),                               \
180 701a8f76 Paolo Bonzini
    .info       = &(_info),                                          \
181 701a8f76 Paolo Bonzini
    .field_exists = (_test),                                         \
182 701a8f76 Paolo Bonzini
    .size       = sizeof(_type),                                     \
183 701a8f76 Paolo Bonzini
    .flags      = VMS_SINGLE|VMS_POINTER,                            \
184 701a8f76 Paolo Bonzini
    .offset     = vmstate_offset_value(_state, _field, _type),       \
185 701a8f76 Paolo Bonzini
}
186 701a8f76 Paolo Bonzini
187 701a8f76 Paolo Bonzini
#define VMSTATE_ARRAY(_field, _state, _num, _version, _info, _type) {\
188 701a8f76 Paolo Bonzini
    .name       = (stringify(_field)),                               \
189 701a8f76 Paolo Bonzini
    .version_id = (_version),                                        \
190 701a8f76 Paolo Bonzini
    .num        = (_num),                                            \
191 701a8f76 Paolo Bonzini
    .info       = &(_info),                                          \
192 701a8f76 Paolo Bonzini
    .size       = sizeof(_type),                                     \
193 701a8f76 Paolo Bonzini
    .flags      = VMS_ARRAY,                                         \
194 701a8f76 Paolo Bonzini
    .offset     = vmstate_offset_array(_state, _field, _type, _num), \
195 701a8f76 Paolo Bonzini
}
196 701a8f76 Paolo Bonzini
197 701a8f76 Paolo Bonzini
#define VMSTATE_ARRAY_TEST(_field, _state, _num, _test, _info, _type) {\
198 701a8f76 Paolo Bonzini
    .name         = (stringify(_field)),                              \
199 701a8f76 Paolo Bonzini
    .field_exists = (_test),                                          \
200 701a8f76 Paolo Bonzini
    .num          = (_num),                                           \
201 701a8f76 Paolo Bonzini
    .info         = &(_info),                                         \
202 701a8f76 Paolo Bonzini
    .size         = sizeof(_type),                                    \
203 701a8f76 Paolo Bonzini
    .flags        = VMS_ARRAY,                                        \
204 701a8f76 Paolo Bonzini
    .offset       = vmstate_offset_array(_state, _field, _type, _num),\
205 701a8f76 Paolo Bonzini
}
206 701a8f76 Paolo Bonzini
207 701a8f76 Paolo Bonzini
#define VMSTATE_SUB_ARRAY(_field, _state, _start, _num, _version, _info, _type) { \
208 701a8f76 Paolo Bonzini
    .name       = (stringify(_field)),                               \
209 701a8f76 Paolo Bonzini
    .version_id = (_version),                                        \
210 701a8f76 Paolo Bonzini
    .num        = (_num),                                            \
211 701a8f76 Paolo Bonzini
    .info       = &(_info),                                          \
212 701a8f76 Paolo Bonzini
    .size       = sizeof(_type),                                     \
213 701a8f76 Paolo Bonzini
    .flags      = VMS_ARRAY,                                         \
214 701a8f76 Paolo Bonzini
    .offset     = vmstate_offset_sub_array(_state, _field, _type, _start), \
215 701a8f76 Paolo Bonzini
}
216 701a8f76 Paolo Bonzini
217 701a8f76 Paolo Bonzini
#define VMSTATE_ARRAY_INT32_UNSAFE(_field, _state, _field_num, _info, _type) {\
218 701a8f76 Paolo Bonzini
    .name       = (stringify(_field)),                               \
219 701a8f76 Paolo Bonzini
    .num_offset = vmstate_offset_value(_state, _field_num, int32_t), \
220 701a8f76 Paolo Bonzini
    .info       = &(_info),                                          \
221 701a8f76 Paolo Bonzini
    .size       = sizeof(_type),                                     \
222 701a8f76 Paolo Bonzini
    .flags      = VMS_VARRAY_INT32,                                  \
223 701a8f76 Paolo Bonzini
    .offset     = offsetof(_state, _field),                          \
224 701a8f76 Paolo Bonzini
}
225 701a8f76 Paolo Bonzini
226 701a8f76 Paolo Bonzini
#define VMSTATE_VARRAY_INT32(_field, _state, _field_num, _version, _info, _type) {\
227 701a8f76 Paolo Bonzini
    .name       = (stringify(_field)),                               \
228 701a8f76 Paolo Bonzini
    .version_id = (_version),                                        \
229 701a8f76 Paolo Bonzini
    .num_offset = vmstate_offset_value(_state, _field_num, int32_t), \
230 701a8f76 Paolo Bonzini
    .info       = &(_info),                                          \
231 701a8f76 Paolo Bonzini
    .size       = sizeof(_type),                                     \
232 701a8f76 Paolo Bonzini
    .flags      = VMS_VARRAY_INT32|VMS_POINTER,                      \
233 701a8f76 Paolo Bonzini
    .offset     = vmstate_offset_pointer(_state, _field, _type),     \
234 701a8f76 Paolo Bonzini
}
235 701a8f76 Paolo Bonzini
236 701a8f76 Paolo Bonzini
#define VMSTATE_VARRAY_UINT32(_field, _state, _field_num, _version, _info, _type) {\
237 701a8f76 Paolo Bonzini
    .name       = (stringify(_field)),                               \
238 701a8f76 Paolo Bonzini
    .version_id = (_version),                                        \
239 701a8f76 Paolo Bonzini
    .num_offset = vmstate_offset_value(_state, _field_num, uint32_t),\
240 701a8f76 Paolo Bonzini
    .info       = &(_info),                                          \
241 701a8f76 Paolo Bonzini
    .size       = sizeof(_type),                                     \
242 701a8f76 Paolo Bonzini
    .flags      = VMS_VARRAY_UINT32|VMS_POINTER,                     \
243 701a8f76 Paolo Bonzini
    .offset     = vmstate_offset_pointer(_state, _field, _type),     \
244 701a8f76 Paolo Bonzini
}
245 701a8f76 Paolo Bonzini
246 701a8f76 Paolo Bonzini
#define VMSTATE_VARRAY_UINT16_UNSAFE(_field, _state, _field_num, _version, _info, _type) {\
247 701a8f76 Paolo Bonzini
    .name       = (stringify(_field)),                               \
248 701a8f76 Paolo Bonzini
    .version_id = (_version),                                        \
249 701a8f76 Paolo Bonzini
    .num_offset = vmstate_offset_value(_state, _field_num, uint16_t),\
250 701a8f76 Paolo Bonzini
    .info       = &(_info),                                          \
251 701a8f76 Paolo Bonzini
    .size       = sizeof(_type),                                     \
252 701a8f76 Paolo Bonzini
    .flags      = VMS_VARRAY_UINT16,                                 \
253 701a8f76 Paolo Bonzini
    .offset     = offsetof(_state, _field),                          \
254 701a8f76 Paolo Bonzini
}
255 701a8f76 Paolo Bonzini
256 701a8f76 Paolo Bonzini
#define VMSTATE_STRUCT_TEST(_field, _state, _test, _version, _vmsd, _type) { \
257 701a8f76 Paolo Bonzini
    .name         = (stringify(_field)),                             \
258 701a8f76 Paolo Bonzini
    .version_id   = (_version),                                      \
259 701a8f76 Paolo Bonzini
    .field_exists = (_test),                                         \
260 701a8f76 Paolo Bonzini
    .vmsd         = &(_vmsd),                                        \
261 701a8f76 Paolo Bonzini
    .size         = sizeof(_type),                                   \
262 701a8f76 Paolo Bonzini
    .flags        = VMS_STRUCT,                                      \
263 701a8f76 Paolo Bonzini
    .offset       = vmstate_offset_value(_state, _field, _type),     \
264 701a8f76 Paolo Bonzini
}
265 701a8f76 Paolo Bonzini
266 701a8f76 Paolo Bonzini
#define VMSTATE_STRUCT_POINTER_TEST(_field, _state, _test, _vmsd, _type) { \
267 701a8f76 Paolo Bonzini
    .name         = (stringify(_field)),                             \
268 701a8f76 Paolo Bonzini
    .field_exists = (_test),                                         \
269 701a8f76 Paolo Bonzini
    .vmsd         = &(_vmsd),                                        \
270 701a8f76 Paolo Bonzini
    .size         = sizeof(_type),                                   \
271 701a8f76 Paolo Bonzini
    .flags        = VMS_STRUCT|VMS_POINTER,                          \
272 701a8f76 Paolo Bonzini
    .offset       = vmstate_offset_value(_state, _field, _type),     \
273 701a8f76 Paolo Bonzini
}
274 701a8f76 Paolo Bonzini
275 701a8f76 Paolo Bonzini
#define VMSTATE_ARRAY_OF_POINTER(_field, _state, _num, _version, _info, _type) {\
276 701a8f76 Paolo Bonzini
    .name       = (stringify(_field)),                               \
277 701a8f76 Paolo Bonzini
    .version_id = (_version),                                        \
278 701a8f76 Paolo Bonzini
    .num        = (_num),                                            \
279 701a8f76 Paolo Bonzini
    .info       = &(_info),                                          \
280 701a8f76 Paolo Bonzini
    .size       = sizeof(_type),                                     \
281 701a8f76 Paolo Bonzini
    .flags      = VMS_ARRAY|VMS_ARRAY_OF_POINTER,                    \
282 701a8f76 Paolo Bonzini
    .offset     = vmstate_offset_array(_state, _field, _type, _num), \
283 701a8f76 Paolo Bonzini
}
284 701a8f76 Paolo Bonzini
285 701a8f76 Paolo Bonzini
#define VMSTATE_STRUCT_ARRAY_TEST(_field, _state, _num, _test, _version, _vmsd, _type) { \
286 701a8f76 Paolo Bonzini
    .name         = (stringify(_field)),                             \
287 701a8f76 Paolo Bonzini
    .num          = (_num),                                          \
288 701a8f76 Paolo Bonzini
    .field_exists = (_test),                                         \
289 701a8f76 Paolo Bonzini
    .version_id   = (_version),                                      \
290 701a8f76 Paolo Bonzini
    .vmsd         = &(_vmsd),                                        \
291 701a8f76 Paolo Bonzini
    .size         = sizeof(_type),                                   \
292 701a8f76 Paolo Bonzini
    .flags        = VMS_STRUCT|VMS_ARRAY,                            \
293 701a8f76 Paolo Bonzini
    .offset       = vmstate_offset_array(_state, _field, _type, _num),\
294 701a8f76 Paolo Bonzini
}
295 701a8f76 Paolo Bonzini
296 701a8f76 Paolo Bonzini
#define VMSTATE_STRUCT_VARRAY_UINT8(_field, _state, _field_num, _version, _vmsd, _type) { \
297 701a8f76 Paolo Bonzini
    .name       = (stringify(_field)),                               \
298 701a8f76 Paolo Bonzini
    .num_offset = vmstate_offset_value(_state, _field_num, uint8_t), \
299 701a8f76 Paolo Bonzini
    .version_id = (_version),                                        \
300 701a8f76 Paolo Bonzini
    .vmsd       = &(_vmsd),                                          \
301 701a8f76 Paolo Bonzini
    .size       = sizeof(_type),                                     \
302 701a8f76 Paolo Bonzini
    .flags      = VMS_STRUCT|VMS_VARRAY_UINT8,                       \
303 701a8f76 Paolo Bonzini
    .offset     = offsetof(_state, _field),                          \
304 701a8f76 Paolo Bonzini
}
305 701a8f76 Paolo Bonzini
306 701a8f76 Paolo Bonzini
#define VMSTATE_STRUCT_VARRAY_POINTER_INT32(_field, _state, _field_num, _vmsd, _type) { \
307 701a8f76 Paolo Bonzini
    .name       = (stringify(_field)),                               \
308 701a8f76 Paolo Bonzini
    .version_id = 0,                                                 \
309 701a8f76 Paolo Bonzini
    .num_offset = vmstate_offset_value(_state, _field_num, int32_t), \
310 701a8f76 Paolo Bonzini
    .size       = sizeof(_type),                                     \
311 701a8f76 Paolo Bonzini
    .vmsd       = &(_vmsd),                                          \
312 701a8f76 Paolo Bonzini
    .flags      = VMS_POINTER | VMS_VARRAY_INT32 | VMS_STRUCT,       \
313 701a8f76 Paolo Bonzini
    .offset     = vmstate_offset_pointer(_state, _field, _type),     \
314 701a8f76 Paolo Bonzini
}
315 701a8f76 Paolo Bonzini
316 701a8f76 Paolo Bonzini
#define VMSTATE_STRUCT_VARRAY_POINTER_UINT16(_field, _state, _field_num, _vmsd, _type) { \
317 701a8f76 Paolo Bonzini
    .name       = (stringify(_field)),                               \
318 701a8f76 Paolo Bonzini
    .version_id = 0,                                                 \
319 701a8f76 Paolo Bonzini
    .num_offset = vmstate_offset_value(_state, _field_num, uint16_t),\
320 701a8f76 Paolo Bonzini
    .size       = sizeof(_type),                                     \
321 701a8f76 Paolo Bonzini
    .vmsd       = &(_vmsd),                                          \
322 701a8f76 Paolo Bonzini
    .flags      = VMS_POINTER | VMS_VARRAY_UINT16 | VMS_STRUCT,      \
323 701a8f76 Paolo Bonzini
    .offset     = vmstate_offset_pointer(_state, _field, _type),     \
324 701a8f76 Paolo Bonzini
}
325 701a8f76 Paolo Bonzini
326 701a8f76 Paolo Bonzini
#define VMSTATE_STRUCT_VARRAY_INT32(_field, _state, _field_num, _version, _vmsd, _type) { \
327 701a8f76 Paolo Bonzini
    .name       = (stringify(_field)),                               \
328 701a8f76 Paolo Bonzini
    .num_offset = vmstate_offset_value(_state, _field_num, int32_t), \
329 701a8f76 Paolo Bonzini
    .version_id = (_version),                                        \
330 701a8f76 Paolo Bonzini
    .vmsd       = &(_vmsd),                                          \
331 701a8f76 Paolo Bonzini
    .size       = sizeof(_type),                                     \
332 701a8f76 Paolo Bonzini
    .flags      = VMS_STRUCT|VMS_VARRAY_INT32,                       \
333 701a8f76 Paolo Bonzini
    .offset     = offsetof(_state, _field),                          \
334 701a8f76 Paolo Bonzini
}
335 701a8f76 Paolo Bonzini
336 701a8f76 Paolo Bonzini
#define VMSTATE_STRUCT_VARRAY_UINT32(_field, _state, _field_num, _version, _vmsd, _type) { \
337 701a8f76 Paolo Bonzini
    .name       = (stringify(_field)),                               \
338 701a8f76 Paolo Bonzini
    .num_offset = vmstate_offset_value(_state, _field_num, uint32_t), \
339 701a8f76 Paolo Bonzini
    .version_id = (_version),                                        \
340 701a8f76 Paolo Bonzini
    .vmsd       = &(_vmsd),                                          \
341 701a8f76 Paolo Bonzini
    .size       = sizeof(_type),                                     \
342 701a8f76 Paolo Bonzini
    .flags      = VMS_STRUCT|VMS_VARRAY_UINT32,                      \
343 701a8f76 Paolo Bonzini
    .offset     = offsetof(_state, _field),                          \
344 701a8f76 Paolo Bonzini
}
345 701a8f76 Paolo Bonzini
346 701a8f76 Paolo Bonzini
#define VMSTATE_STATIC_BUFFER(_field, _state, _version, _test, _start, _size) { \
347 701a8f76 Paolo Bonzini
    .name         = (stringify(_field)),                             \
348 701a8f76 Paolo Bonzini
    .version_id   = (_version),                                      \
349 701a8f76 Paolo Bonzini
    .field_exists = (_test),                                         \
350 701a8f76 Paolo Bonzini
    .size         = (_size - _start),                                \
351 701a8f76 Paolo Bonzini
    .info         = &vmstate_info_buffer,                            \
352 701a8f76 Paolo Bonzini
    .flags        = VMS_BUFFER,                                      \
353 701a8f76 Paolo Bonzini
    .offset       = vmstate_offset_buffer(_state, _field) + _start,  \
354 701a8f76 Paolo Bonzini
}
355 701a8f76 Paolo Bonzini
356 701a8f76 Paolo Bonzini
#define VMSTATE_BUFFER_MULTIPLY(_field, _state, _version, _test, _start, _field_size, _multiply) { \
357 701a8f76 Paolo Bonzini
    .name         = (stringify(_field)),                             \
358 701a8f76 Paolo Bonzini
    .version_id   = (_version),                                      \
359 701a8f76 Paolo Bonzini
    .field_exists = (_test),                                         \
360 701a8f76 Paolo Bonzini
    .size_offset  = vmstate_offset_value(_state, _field_size, uint32_t),\
361 701a8f76 Paolo Bonzini
    .size         = (_multiply),                                      \
362 701a8f76 Paolo Bonzini
    .info         = &vmstate_info_buffer,                            \
363 701a8f76 Paolo Bonzini
    .flags        = VMS_VBUFFER|VMS_MULTIPLY,                        \
364 701a8f76 Paolo Bonzini
    .offset       = offsetof(_state, _field),                        \
365 701a8f76 Paolo Bonzini
    .start        = (_start),                                        \
366 701a8f76 Paolo Bonzini
}
367 701a8f76 Paolo Bonzini
368 701a8f76 Paolo Bonzini
#define VMSTATE_VBUFFER(_field, _state, _version, _test, _start, _field_size) { \
369 701a8f76 Paolo Bonzini
    .name         = (stringify(_field)),                             \
370 701a8f76 Paolo Bonzini
    .version_id   = (_version),                                      \
371 701a8f76 Paolo Bonzini
    .field_exists = (_test),                                         \
372 701a8f76 Paolo Bonzini
    .size_offset  = vmstate_offset_value(_state, _field_size, int32_t),\
373 701a8f76 Paolo Bonzini
    .info         = &vmstate_info_buffer,                            \
374 701a8f76 Paolo Bonzini
    .flags        = VMS_VBUFFER|VMS_POINTER,                         \
375 701a8f76 Paolo Bonzini
    .offset       = offsetof(_state, _field),                        \
376 701a8f76 Paolo Bonzini
    .start        = (_start),                                        \
377 701a8f76 Paolo Bonzini
}
378 701a8f76 Paolo Bonzini
379 701a8f76 Paolo Bonzini
#define VMSTATE_VBUFFER_UINT32(_field, _state, _version, _test, _start, _field_size) { \
380 701a8f76 Paolo Bonzini
    .name         = (stringify(_field)),                             \
381 701a8f76 Paolo Bonzini
    .version_id   = (_version),                                      \
382 701a8f76 Paolo Bonzini
    .field_exists = (_test),                                         \
383 701a8f76 Paolo Bonzini
    .size_offset  = vmstate_offset_value(_state, _field_size, uint32_t),\
384 701a8f76 Paolo Bonzini
    .info         = &vmstate_info_buffer,                            \
385 701a8f76 Paolo Bonzini
    .flags        = VMS_VBUFFER|VMS_POINTER,                         \
386 701a8f76 Paolo Bonzini
    .offset       = offsetof(_state, _field),                        \
387 701a8f76 Paolo Bonzini
    .start        = (_start),                                        \
388 701a8f76 Paolo Bonzini
}
389 701a8f76 Paolo Bonzini
390 701a8f76 Paolo Bonzini
#define VMSTATE_BUFFER_UNSAFE_INFO(_field, _state, _version, _info, _size) { \
391 701a8f76 Paolo Bonzini
    .name       = (stringify(_field)),                               \
392 701a8f76 Paolo Bonzini
    .version_id = (_version),                                        \
393 701a8f76 Paolo Bonzini
    .size       = (_size),                                           \
394 701a8f76 Paolo Bonzini
    .info       = &(_info),                                          \
395 701a8f76 Paolo Bonzini
    .flags      = VMS_BUFFER,                                        \
396 701a8f76 Paolo Bonzini
    .offset     = offsetof(_state, _field),                          \
397 701a8f76 Paolo Bonzini
}
398 701a8f76 Paolo Bonzini
399 701a8f76 Paolo Bonzini
#define VMSTATE_UNUSED_BUFFER(_test, _version, _size) {              \
400 701a8f76 Paolo Bonzini
    .name         = "unused",                                        \
401 701a8f76 Paolo Bonzini
    .field_exists = (_test),                                         \
402 701a8f76 Paolo Bonzini
    .version_id   = (_version),                                      \
403 701a8f76 Paolo Bonzini
    .size         = (_size),                                         \
404 701a8f76 Paolo Bonzini
    .info         = &vmstate_info_unused_buffer,                     \
405 701a8f76 Paolo Bonzini
    .flags        = VMS_BUFFER,                                      \
406 701a8f76 Paolo Bonzini
}
407 701a8f76 Paolo Bonzini
408 701a8f76 Paolo Bonzini
/* _f : field name
409 701a8f76 Paolo Bonzini
   _f_n : num of elements field_name
410 701a8f76 Paolo Bonzini
   _n : num of elements
411 701a8f76 Paolo Bonzini
   _s : struct state name
412 701a8f76 Paolo Bonzini
   _v : version
413 701a8f76 Paolo Bonzini
*/
414 701a8f76 Paolo Bonzini
415 701a8f76 Paolo Bonzini
#define VMSTATE_SINGLE(_field, _state, _version, _info, _type)        \
416 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE_TEST(_field, _state, NULL, _version, _info, _type)
417 701a8f76 Paolo Bonzini
418 701a8f76 Paolo Bonzini
#define VMSTATE_STRUCT(_field, _state, _version, _vmsd, _type)        \
419 701a8f76 Paolo Bonzini
    VMSTATE_STRUCT_TEST(_field, _state, NULL, _version, _vmsd, _type)
420 701a8f76 Paolo Bonzini
421 701a8f76 Paolo Bonzini
#define VMSTATE_STRUCT_POINTER(_field, _state, _vmsd, _type)          \
422 701a8f76 Paolo Bonzini
    VMSTATE_STRUCT_POINTER_TEST(_field, _state, NULL, _vmsd, _type)
423 701a8f76 Paolo Bonzini
424 701a8f76 Paolo Bonzini
#define VMSTATE_STRUCT_ARRAY(_field, _state, _num, _version, _vmsd, _type) \
425 701a8f76 Paolo Bonzini
    VMSTATE_STRUCT_ARRAY_TEST(_field, _state, _num, NULL, _version,   \
426 701a8f76 Paolo Bonzini
            _vmsd, _type)
427 701a8f76 Paolo Bonzini
428 701a8f76 Paolo Bonzini
#define VMSTATE_BOOL_V(_f, _s, _v)                                    \
429 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_bool, bool)
430 701a8f76 Paolo Bonzini
431 701a8f76 Paolo Bonzini
#define VMSTATE_INT8_V(_f, _s, _v)                                    \
432 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_int8, int8_t)
433 701a8f76 Paolo Bonzini
#define VMSTATE_INT16_V(_f, _s, _v)                                   \
434 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_int16, int16_t)
435 701a8f76 Paolo Bonzini
#define VMSTATE_INT32_V(_f, _s, _v)                                   \
436 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_int32, int32_t)
437 701a8f76 Paolo Bonzini
#define VMSTATE_INT64_V(_f, _s, _v)                                   \
438 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_int64, int64_t)
439 701a8f76 Paolo Bonzini
440 701a8f76 Paolo Bonzini
#define VMSTATE_UINT8_V(_f, _s, _v)                                   \
441 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_uint8, uint8_t)
442 701a8f76 Paolo Bonzini
#define VMSTATE_UINT16_V(_f, _s, _v)                                  \
443 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_uint16, uint16_t)
444 701a8f76 Paolo Bonzini
#define VMSTATE_UINT32_V(_f, _s, _v)                                  \
445 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_uint32, uint32_t)
446 701a8f76 Paolo Bonzini
#define VMSTATE_UINT64_V(_f, _s, _v)                                  \
447 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_uint64, uint64_t)
448 701a8f76 Paolo Bonzini
449 701a8f76 Paolo Bonzini
#define VMSTATE_BOOL(_f, _s)                                          \
450 701a8f76 Paolo Bonzini
    VMSTATE_BOOL_V(_f, _s, 0)
451 701a8f76 Paolo Bonzini
452 701a8f76 Paolo Bonzini
#define VMSTATE_INT8(_f, _s)                                          \
453 701a8f76 Paolo Bonzini
    VMSTATE_INT8_V(_f, _s, 0)
454 701a8f76 Paolo Bonzini
#define VMSTATE_INT16(_f, _s)                                         \
455 701a8f76 Paolo Bonzini
    VMSTATE_INT16_V(_f, _s, 0)
456 701a8f76 Paolo Bonzini
#define VMSTATE_INT32(_f, _s)                                         \
457 701a8f76 Paolo Bonzini
    VMSTATE_INT32_V(_f, _s, 0)
458 701a8f76 Paolo Bonzini
#define VMSTATE_INT64(_f, _s)                                         \
459 701a8f76 Paolo Bonzini
    VMSTATE_INT64_V(_f, _s, 0)
460 701a8f76 Paolo Bonzini
461 701a8f76 Paolo Bonzini
#define VMSTATE_UINT8(_f, _s)                                         \
462 701a8f76 Paolo Bonzini
    VMSTATE_UINT8_V(_f, _s, 0)
463 701a8f76 Paolo Bonzini
#define VMSTATE_UINT16(_f, _s)                                        \
464 701a8f76 Paolo Bonzini
    VMSTATE_UINT16_V(_f, _s, 0)
465 701a8f76 Paolo Bonzini
#define VMSTATE_UINT32(_f, _s)                                        \
466 701a8f76 Paolo Bonzini
    VMSTATE_UINT32_V(_f, _s, 0)
467 701a8f76 Paolo Bonzini
#define VMSTATE_UINT64(_f, _s)                                        \
468 701a8f76 Paolo Bonzini
    VMSTATE_UINT64_V(_f, _s, 0)
469 701a8f76 Paolo Bonzini
470 701a8f76 Paolo Bonzini
#define VMSTATE_UINT8_EQUAL(_f, _s)                                   \
471 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE(_f, _s, 0, vmstate_info_uint8_equal, uint8_t)
472 701a8f76 Paolo Bonzini
473 701a8f76 Paolo Bonzini
#define VMSTATE_UINT16_EQUAL(_f, _s)                                  \
474 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE(_f, _s, 0, vmstate_info_uint16_equal, uint16_t)
475 701a8f76 Paolo Bonzini
476 701a8f76 Paolo Bonzini
#define VMSTATE_UINT16_EQUAL_V(_f, _s, _v)                            \
477 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_uint16_equal, uint16_t)
478 701a8f76 Paolo Bonzini
479 701a8f76 Paolo Bonzini
#define VMSTATE_INT32_EQUAL(_f, _s)                                   \
480 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE(_f, _s, 0, vmstate_info_int32_equal, int32_t)
481 701a8f76 Paolo Bonzini
482 701a8f76 Paolo Bonzini
#define VMSTATE_UINT32_EQUAL(_f, _s)                                   \
483 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE(_f, _s, 0, vmstate_info_uint32_equal, uint32_t)
484 701a8f76 Paolo Bonzini
485 701a8f76 Paolo Bonzini
#define VMSTATE_INT32_LE(_f, _s)                                   \
486 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE(_f, _s, 0, vmstate_info_int32_le, int32_t)
487 701a8f76 Paolo Bonzini
488 701a8f76 Paolo Bonzini
#define VMSTATE_UINT8_TEST(_f, _s, _t)                               \
489 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE_TEST(_f, _s, _t, 0, vmstate_info_uint8, uint8_t)
490 701a8f76 Paolo Bonzini
491 701a8f76 Paolo Bonzini
#define VMSTATE_UINT16_TEST(_f, _s, _t)                               \
492 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE_TEST(_f, _s, _t, 0, vmstate_info_uint16, uint16_t)
493 701a8f76 Paolo Bonzini
494 701a8f76 Paolo Bonzini
#define VMSTATE_UINT32_TEST(_f, _s, _t)                                  \
495 701a8f76 Paolo Bonzini
    VMSTATE_SINGLE_TEST(_f, _s, _t, 0, vmstate_info_uint32, uint32_t)
496 701a8f76 Paolo Bonzini
497 701a8f76 Paolo Bonzini
#define VMSTATE_TIMER_TEST(_f, _s, _test)                             \
498 701a8f76 Paolo Bonzini
    VMSTATE_POINTER_TEST(_f, _s, _test, vmstate_info_timer, QEMUTimer *)
499 701a8f76 Paolo Bonzini
500 701a8f76 Paolo Bonzini
#define VMSTATE_TIMER(_f, _s)                                         \
501 701a8f76 Paolo Bonzini
    VMSTATE_TIMER_TEST(_f, _s, NULL)
502 701a8f76 Paolo Bonzini
503 701a8f76 Paolo Bonzini
#define VMSTATE_TIMER_ARRAY(_f, _s, _n)                              \
504 701a8f76 Paolo Bonzini
    VMSTATE_ARRAY_OF_POINTER(_f, _s, _n, 0, vmstate_info_timer, QEMUTimer *)
505 701a8f76 Paolo Bonzini
506 701a8f76 Paolo Bonzini
#define VMSTATE_BOOL_ARRAY_V(_f, _s, _n, _v)                         \
507 701a8f76 Paolo Bonzini
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_bool, bool)
508 701a8f76 Paolo Bonzini
509 701a8f76 Paolo Bonzini
#define VMSTATE_BOOL_ARRAY(_f, _s, _n)                               \
510 701a8f76 Paolo Bonzini
    VMSTATE_BOOL_ARRAY_V(_f, _s, _n, 0)
511 701a8f76 Paolo Bonzini
512 701a8f76 Paolo Bonzini
#define VMSTATE_UINT16_ARRAY_V(_f, _s, _n, _v)                         \
513 701a8f76 Paolo Bonzini
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint16, uint16_t)
514 701a8f76 Paolo Bonzini
515 701a8f76 Paolo Bonzini
#define VMSTATE_UINT16_ARRAY(_f, _s, _n)                               \
516 701a8f76 Paolo Bonzini
    VMSTATE_UINT16_ARRAY_V(_f, _s, _n, 0)
517 701a8f76 Paolo Bonzini
518 701a8f76 Paolo Bonzini
#define VMSTATE_UINT8_ARRAY_V(_f, _s, _n, _v)                         \
519 701a8f76 Paolo Bonzini
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint8, uint8_t)
520 701a8f76 Paolo Bonzini
521 701a8f76 Paolo Bonzini
#define VMSTATE_UINT8_ARRAY(_f, _s, _n)                               \
522 701a8f76 Paolo Bonzini
    VMSTATE_UINT8_ARRAY_V(_f, _s, _n, 0)
523 701a8f76 Paolo Bonzini
524 701a8f76 Paolo Bonzini
#define VMSTATE_UINT32_ARRAY_V(_f, _s, _n, _v)                        \
525 701a8f76 Paolo Bonzini
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint32, uint32_t)
526 701a8f76 Paolo Bonzini
527 701a8f76 Paolo Bonzini
#define VMSTATE_UINT32_ARRAY(_f, _s, _n)                              \
528 701a8f76 Paolo Bonzini
    VMSTATE_UINT32_ARRAY_V(_f, _s, _n, 0)
529 701a8f76 Paolo Bonzini
530 701a8f76 Paolo Bonzini
#define VMSTATE_UINT64_ARRAY_V(_f, _s, _n, _v)                        \
531 701a8f76 Paolo Bonzini
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint64, uint64_t)
532 701a8f76 Paolo Bonzini
533 701a8f76 Paolo Bonzini
#define VMSTATE_UINT64_ARRAY(_f, _s, _n)                              \
534 701a8f76 Paolo Bonzini
    VMSTATE_UINT64_ARRAY_V(_f, _s, _n, 0)
535 701a8f76 Paolo Bonzini
536 701a8f76 Paolo Bonzini
#define VMSTATE_INT16_ARRAY_V(_f, _s, _n, _v)                         \
537 701a8f76 Paolo Bonzini
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_int16, int16_t)
538 701a8f76 Paolo Bonzini
539 701a8f76 Paolo Bonzini
#define VMSTATE_INT16_ARRAY(_f, _s, _n)                               \
540 701a8f76 Paolo Bonzini
    VMSTATE_INT16_ARRAY_V(_f, _s, _n, 0)
541 701a8f76 Paolo Bonzini
542 701a8f76 Paolo Bonzini
#define VMSTATE_INT32_ARRAY_V(_f, _s, _n, _v)                         \
543 701a8f76 Paolo Bonzini
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_int32, int32_t)
544 701a8f76 Paolo Bonzini
545 701a8f76 Paolo Bonzini
#define VMSTATE_INT32_ARRAY(_f, _s, _n)                               \
546 701a8f76 Paolo Bonzini
    VMSTATE_INT32_ARRAY_V(_f, _s, _n, 0)
547 701a8f76 Paolo Bonzini
548 701a8f76 Paolo Bonzini
#define VMSTATE_UINT32_SUB_ARRAY(_f, _s, _start, _num)                \
549 701a8f76 Paolo Bonzini
    VMSTATE_SUB_ARRAY(_f, _s, _start, _num, 0, vmstate_info_uint32, uint32_t)
550 701a8f76 Paolo Bonzini
551 701a8f76 Paolo Bonzini
#define VMSTATE_UINT32_ARRAY(_f, _s, _n)                              \
552 701a8f76 Paolo Bonzini
    VMSTATE_UINT32_ARRAY_V(_f, _s, _n, 0)
553 701a8f76 Paolo Bonzini
554 701a8f76 Paolo Bonzini
#define VMSTATE_INT64_ARRAY_V(_f, _s, _n, _v)                         \
555 701a8f76 Paolo Bonzini
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_int64, int64_t)
556 701a8f76 Paolo Bonzini
557 701a8f76 Paolo Bonzini
#define VMSTATE_INT64_ARRAY(_f, _s, _n)                               \
558 701a8f76 Paolo Bonzini
    VMSTATE_INT64_ARRAY_V(_f, _s, _n, 0)
559 701a8f76 Paolo Bonzini
560 701a8f76 Paolo Bonzini
#define VMSTATE_BUFFER_V(_f, _s, _v)                                  \
561 701a8f76 Paolo Bonzini
    VMSTATE_STATIC_BUFFER(_f, _s, _v, NULL, 0, sizeof(typeof_field(_s, _f)))
562 701a8f76 Paolo Bonzini
563 701a8f76 Paolo Bonzini
#define VMSTATE_BUFFER(_f, _s)                                        \
564 701a8f76 Paolo Bonzini
    VMSTATE_BUFFER_V(_f, _s, 0)
565 701a8f76 Paolo Bonzini
566 701a8f76 Paolo Bonzini
#define VMSTATE_PARTIAL_BUFFER(_f, _s, _size)                         \
567 701a8f76 Paolo Bonzini
    VMSTATE_STATIC_BUFFER(_f, _s, 0, NULL, 0, _size)
568 701a8f76 Paolo Bonzini
569 701a8f76 Paolo Bonzini
#define VMSTATE_BUFFER_START_MIDDLE(_f, _s, _start) \
570 701a8f76 Paolo Bonzini
    VMSTATE_STATIC_BUFFER(_f, _s, 0, NULL, _start, sizeof(typeof_field(_s, _f)))
571 701a8f76 Paolo Bonzini
572 701a8f76 Paolo Bonzini
#define VMSTATE_PARTIAL_VBUFFER(_f, _s, _size)                        \
573 701a8f76 Paolo Bonzini
    VMSTATE_VBUFFER(_f, _s, 0, NULL, 0, _size)
574 701a8f76 Paolo Bonzini
575 701a8f76 Paolo Bonzini
#define VMSTATE_PARTIAL_VBUFFER_UINT32(_f, _s, _size)                        \
576 701a8f76 Paolo Bonzini
    VMSTATE_VBUFFER_UINT32(_f, _s, 0, NULL, 0, _size)
577 701a8f76 Paolo Bonzini
578 701a8f76 Paolo Bonzini
#define VMSTATE_SUB_VBUFFER(_f, _s, _start, _size)                    \
579 701a8f76 Paolo Bonzini
    VMSTATE_VBUFFER(_f, _s, 0, NULL, _start, _size)
580 701a8f76 Paolo Bonzini
581 701a8f76 Paolo Bonzini
#define VMSTATE_BUFFER_TEST(_f, _s, _test)                            \
582 701a8f76 Paolo Bonzini
    VMSTATE_STATIC_BUFFER(_f, _s, 0, _test, 0, sizeof(typeof_field(_s, _f)))
583 701a8f76 Paolo Bonzini
584 701a8f76 Paolo Bonzini
#define VMSTATE_BUFFER_UNSAFE(_field, _state, _version, _size)        \
585 701a8f76 Paolo Bonzini
    VMSTATE_BUFFER_UNSAFE_INFO(_field, _state, _version, vmstate_info_buffer, _size)
586 701a8f76 Paolo Bonzini
587 701a8f76 Paolo Bonzini
#define VMSTATE_UNUSED_V(_v, _size)                                   \
588 701a8f76 Paolo Bonzini
    VMSTATE_UNUSED_BUFFER(NULL, _v, _size)
589 701a8f76 Paolo Bonzini
590 701a8f76 Paolo Bonzini
#define VMSTATE_UNUSED(_size)                                         \
591 701a8f76 Paolo Bonzini
    VMSTATE_UNUSED_V(0, _size)
592 701a8f76 Paolo Bonzini
593 701a8f76 Paolo Bonzini
#define VMSTATE_UNUSED_TEST(_test, _size)                             \
594 701a8f76 Paolo Bonzini
    VMSTATE_UNUSED_BUFFER(_test, 0, _size)
595 701a8f76 Paolo Bonzini
596 701a8f76 Paolo Bonzini
#define VMSTATE_END_OF_LIST()                                         \
597 701a8f76 Paolo Bonzini
    {}
598 701a8f76 Paolo Bonzini
599 701a8f76 Paolo Bonzini
int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
600 701a8f76 Paolo Bonzini
                       void *opaque, int version_id);
601 701a8f76 Paolo Bonzini
void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
602 701a8f76 Paolo Bonzini
                        void *opaque);
603 701a8f76 Paolo Bonzini
int vmstate_register(DeviceState *dev, int instance_id,
604 701a8f76 Paolo Bonzini
                     const VMStateDescription *vmsd, void *base);
605 701a8f76 Paolo Bonzini
int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
606 701a8f76 Paolo Bonzini
                                   const VMStateDescription *vmsd,
607 701a8f76 Paolo Bonzini
                                   void *base, int alias_id,
608 701a8f76 Paolo Bonzini
                                   int required_for_version);
609 701a8f76 Paolo Bonzini
void vmstate_unregister(DeviceState *dev, const VMStateDescription *vmsd,
610 701a8f76 Paolo Bonzini
                        void *opaque);
611 701a8f76 Paolo Bonzini
612 701a8f76 Paolo Bonzini
struct MemoryRegion;
613 701a8f76 Paolo Bonzini
void vmstate_register_ram(struct MemoryRegion *memory, DeviceState *dev);
614 701a8f76 Paolo Bonzini
void vmstate_unregister_ram(struct MemoryRegion *memory, DeviceState *dev);
615 701a8f76 Paolo Bonzini
void vmstate_register_ram_global(struct MemoryRegion *memory);
616 701a8f76 Paolo Bonzini
617 701a8f76 Paolo Bonzini
#endif