Statistics
| Branch: | Revision:

root / vmstate.h @ fb5590f7

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