Statistics
| Branch: | Revision:

root / hw / hw.h @ ef845c3b

History | View | Annotate | Download (24.8 kB)

1 87ecb68b pbrook
/* Declarations for use by hardware emulation.  */
2 87ecb68b pbrook
#ifndef QEMU_HW_H
3 87ecb68b pbrook
#define QEMU_HW_H
4 87ecb68b pbrook
5 87ecb68b pbrook
#include "qemu-common.h"
6 1ad2134f Paul Brook
7 1ad2134f Paul Brook
#if defined(TARGET_PHYS_ADDR_BITS) && !defined(NEED_CPU_H)
8 1ad2134f Paul Brook
#include "targphys.h"
9 1ad2134f Paul Brook
#include "poison.h"
10 1ad2134f Paul Brook
#include "cpu-common.h"
11 1ad2134f Paul Brook
#endif
12 1ad2134f Paul Brook
13 f11f6a5f Juan Quintela
#include <stdbool.h>
14 32993977 Isaku Yamahata
#include "ioport.h"
15 87ecb68b pbrook
#include "irq.h"
16 87ecb68b pbrook
17 87ecb68b pbrook
/* VM Load/Save */
18 87ecb68b pbrook
19 5dafc53f aliguori
/* This function writes a chunk of data to a file at the given position.
20 5dafc53f aliguori
 * The pos argument can be ignored if the file is only being used for
21 5dafc53f aliguori
 * streaming.  The handler should try to write all of the data it can.
22 5dafc53f aliguori
 */
23 871d2f07 aliguori
typedef int (QEMUFilePutBufferFunc)(void *opaque, const uint8_t *buf,
24 871d2f07 aliguori
                                    int64_t pos, int size);
25 5dafc53f aliguori
26 5dafc53f aliguori
/* Read a chunk of data from a file at the given position.  The pos argument
27 5dafc53f aliguori
 * can be ignored if the file is only be used for streaming.  The number of
28 5dafc53f aliguori
 * bytes actually read should be returned.
29 5dafc53f aliguori
 */
30 5dafc53f aliguori
typedef int (QEMUFileGetBufferFunc)(void *opaque, uint8_t *buf,
31 5dafc53f aliguori
                                    int64_t pos, int size);
32 5dafc53f aliguori
33 5dafc53f aliguori
/* Close a file and return an error code */
34 5dafc53f aliguori
typedef int (QEMUFileCloseFunc)(void *opaque);
35 5dafc53f aliguori
36 5dafc53f aliguori
/* Called to determine if the file has exceeded it's bandwidth allocation.  The
37 5dafc53f aliguori
 * bandwidth capping is a soft limit, not a hard limit.
38 5dafc53f aliguori
 */
39 5dafc53f aliguori
typedef int (QEMUFileRateLimit)(void *opaque);
40 5dafc53f aliguori
41 19629537 Glauber Costa
/* Called to change the current bandwidth allocation. This function must return
42 19629537 Glauber Costa
 * the new actual bandwidth. It should be new_rate if everything goes ok, and
43 19629537 Glauber Costa
 * the old rate otherwise
44 19629537 Glauber Costa
 */
45 19629537 Glauber Costa
typedef size_t (QEMUFileSetRateLimit)(void *opaque, size_t new_rate);
46 19629537 Glauber Costa
47 5dafc53f aliguori
QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer,
48 5dafc53f aliguori
                         QEMUFileGetBufferFunc *get_buffer,
49 5dafc53f aliguori
                         QEMUFileCloseFunc *close,
50 19629537 Glauber Costa
                         QEMUFileRateLimit *rate_limit,
51 19629537 Glauber Costa
                         QEMUFileSetRateLimit *set_rate_limit);
52 87ecb68b pbrook
QEMUFile *qemu_fopen(const char *filename, const char *mode);
53 5ac1fad3 Paolo Bonzini
QEMUFile *qemu_fdopen(int fd, const char *mode);
54 c1d36665 aliguori
QEMUFile *qemu_fopen_socket(int fd);
55 065e2813 aliguori
QEMUFile *qemu_popen(FILE *popen_file, const char *mode);
56 065e2813 aliguori
QEMUFile *qemu_popen_cmd(const char *command, const char *mode);
57 7f79dd28 Paolo Bonzini
int qemu_stdio_fd(QEMUFile *f);
58 87ecb68b pbrook
void qemu_fflush(QEMUFile *f);
59 5dafc53f aliguori
int qemu_fclose(QEMUFile *f);
60 2ca83a8d blueswir1
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size);
61 2ca83a8d blueswir1
void qemu_put_byte(QEMUFile *f, int v);
62 b6c4f71f blueswir1
63 b6c4f71f blueswir1
static inline void qemu_put_ubyte(QEMUFile *f, unsigned int v)
64 b6c4f71f blueswir1
{
65 b6c4f71f blueswir1
    qemu_put_byte(f, (int)v);
66 b6c4f71f blueswir1
}
67 b6c4f71f blueswir1
68 b6c4f71f blueswir1
#define qemu_put_sbyte qemu_put_byte
69 b6c4f71f blueswir1
70 2ca83a8d blueswir1
void qemu_put_be16(QEMUFile *f, unsigned int v);
71 2ca83a8d blueswir1
void qemu_put_be32(QEMUFile *f, unsigned int v);
72 87ecb68b pbrook
void qemu_put_be64(QEMUFile *f, uint64_t v);
73 2ca83a8d blueswir1
int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size);
74 2ca83a8d blueswir1
int qemu_get_byte(QEMUFile *f);
75 b6c4f71f blueswir1
76 b6c4f71f blueswir1
static inline unsigned int qemu_get_ubyte(QEMUFile *f)
77 b6c4f71f blueswir1
{
78 b6c4f71f blueswir1
    return (unsigned int)qemu_get_byte(f);
79 b6c4f71f blueswir1
}
80 b6c4f71f blueswir1
81 b6c4f71f blueswir1
#define qemu_get_sbyte qemu_get_byte
82 b6c4f71f blueswir1
83 2ca83a8d blueswir1
unsigned int qemu_get_be16(QEMUFile *f);
84 2ca83a8d blueswir1
unsigned int qemu_get_be32(QEMUFile *f);
85 87ecb68b pbrook
uint64_t qemu_get_be64(QEMUFile *f);
86 5dafc53f aliguori
int qemu_file_rate_limit(QEMUFile *f);
87 19629537 Glauber Costa
size_t qemu_file_set_rate_limit(QEMUFile *f, size_t new_rate);
88 871d2f07 aliguori
int qemu_file_has_error(QEMUFile *f);
89 4dabe248 aliguori
void qemu_file_set_error(QEMUFile *f);
90 5dafc53f aliguori
91 5dafc53f aliguori
/* Try to send any outstanding data.  This function is useful when output is
92 5dafc53f aliguori
 * halted due to rate limiting or EAGAIN errors occur as it can be used to
93 5dafc53f aliguori
 * resume output. */
94 5dafc53f aliguori
void qemu_file_put_notify(QEMUFile *f);
95 87ecb68b pbrook
96 87ecb68b pbrook
static inline void qemu_put_be64s(QEMUFile *f, const uint64_t *pv)
97 87ecb68b pbrook
{
98 87ecb68b pbrook
    qemu_put_be64(f, *pv);
99 87ecb68b pbrook
}
100 87ecb68b pbrook
101 87ecb68b pbrook
static inline void qemu_put_be32s(QEMUFile *f, const uint32_t *pv)
102 87ecb68b pbrook
{
103 87ecb68b pbrook
    qemu_put_be32(f, *pv);
104 87ecb68b pbrook
}
105 87ecb68b pbrook
106 87ecb68b pbrook
static inline void qemu_put_be16s(QEMUFile *f, const uint16_t *pv)
107 87ecb68b pbrook
{
108 87ecb68b pbrook
    qemu_put_be16(f, *pv);
109 87ecb68b pbrook
}
110 87ecb68b pbrook
111 87ecb68b pbrook
static inline void qemu_put_8s(QEMUFile *f, const uint8_t *pv)
112 87ecb68b pbrook
{
113 87ecb68b pbrook
    qemu_put_byte(f, *pv);
114 87ecb68b pbrook
}
115 87ecb68b pbrook
116 87ecb68b pbrook
static inline void qemu_get_be64s(QEMUFile *f, uint64_t *pv)
117 87ecb68b pbrook
{
118 87ecb68b pbrook
    *pv = qemu_get_be64(f);
119 87ecb68b pbrook
}
120 87ecb68b pbrook
121 87ecb68b pbrook
static inline void qemu_get_be32s(QEMUFile *f, uint32_t *pv)
122 87ecb68b pbrook
{
123 87ecb68b pbrook
    *pv = qemu_get_be32(f);
124 87ecb68b pbrook
}
125 87ecb68b pbrook
126 87ecb68b pbrook
static inline void qemu_get_be16s(QEMUFile *f, uint16_t *pv)
127 87ecb68b pbrook
{
128 87ecb68b pbrook
    *pv = qemu_get_be16(f);
129 87ecb68b pbrook
}
130 87ecb68b pbrook
131 87ecb68b pbrook
static inline void qemu_get_8s(QEMUFile *f, uint8_t *pv)
132 87ecb68b pbrook
{
133 87ecb68b pbrook
    *pv = qemu_get_byte(f);
134 87ecb68b pbrook
}
135 87ecb68b pbrook
136 b6c4f71f blueswir1
// Signed versions for type safety
137 b6c4f71f blueswir1
static inline void qemu_put_sbuffer(QEMUFile *f, const int8_t *buf, int size)
138 b6c4f71f blueswir1
{
139 b6c4f71f blueswir1
    qemu_put_buffer(f, (const uint8_t *)buf, size);
140 b6c4f71f blueswir1
}
141 b6c4f71f blueswir1
142 b6c4f71f blueswir1
static inline void qemu_put_sbe16(QEMUFile *f, int v)
143 b6c4f71f blueswir1
{
144 b6c4f71f blueswir1
    qemu_put_be16(f, (unsigned int)v);
145 b6c4f71f blueswir1
}
146 b6c4f71f blueswir1
147 b6c4f71f blueswir1
static inline void qemu_put_sbe32(QEMUFile *f, int v)
148 b6c4f71f blueswir1
{
149 b6c4f71f blueswir1
    qemu_put_be32(f, (unsigned int)v);
150 b6c4f71f blueswir1
}
151 b6c4f71f blueswir1
152 b6c4f71f blueswir1
static inline void qemu_put_sbe64(QEMUFile *f, int64_t v)
153 b6c4f71f blueswir1
{
154 b6c4f71f blueswir1
    qemu_put_be64(f, (uint64_t)v);
155 b6c4f71f blueswir1
}
156 b6c4f71f blueswir1
157 b6c4f71f blueswir1
static inline size_t qemu_get_sbuffer(QEMUFile *f, int8_t *buf, int size)
158 b6c4f71f blueswir1
{
159 b6c4f71f blueswir1
    return qemu_get_buffer(f, (uint8_t *)buf, size);
160 b6c4f71f blueswir1
}
161 b6c4f71f blueswir1
162 b6c4f71f blueswir1
static inline int qemu_get_sbe16(QEMUFile *f)
163 b6c4f71f blueswir1
{
164 b6c4f71f blueswir1
    return (int)qemu_get_be16(f);
165 b6c4f71f blueswir1
}
166 b6c4f71f blueswir1
167 b6c4f71f blueswir1
static inline int qemu_get_sbe32(QEMUFile *f)
168 b6c4f71f blueswir1
{
169 b6c4f71f blueswir1
    return (int)qemu_get_be32(f);
170 b6c4f71f blueswir1
}
171 b6c4f71f blueswir1
172 b6c4f71f blueswir1
static inline int64_t qemu_get_sbe64(QEMUFile *f)
173 b6c4f71f blueswir1
{
174 b6c4f71f blueswir1
    return (int64_t)qemu_get_be64(f);
175 b6c4f71f blueswir1
}
176 b6c4f71f blueswir1
177 b6c4f71f blueswir1
static inline void qemu_put_s8s(QEMUFile *f, const int8_t *pv)
178 b6c4f71f blueswir1
{
179 b6c4f71f blueswir1
    qemu_put_8s(f, (const uint8_t *)pv);
180 b6c4f71f blueswir1
}
181 b6c4f71f blueswir1
182 b6c4f71f blueswir1
static inline void qemu_put_sbe16s(QEMUFile *f, const int16_t *pv)
183 b6c4f71f blueswir1
{
184 b6c4f71f blueswir1
    qemu_put_be16s(f, (const uint16_t *)pv);
185 b6c4f71f blueswir1
}
186 b6c4f71f blueswir1
187 b6c4f71f blueswir1
static inline void qemu_put_sbe32s(QEMUFile *f, const int32_t *pv)
188 b6c4f71f blueswir1
{
189 b6c4f71f blueswir1
    qemu_put_be32s(f, (const uint32_t *)pv);
190 b6c4f71f blueswir1
}
191 b6c4f71f blueswir1
192 b6c4f71f blueswir1
static inline void qemu_put_sbe64s(QEMUFile *f, const int64_t *pv)
193 b6c4f71f blueswir1
{
194 b6c4f71f blueswir1
    qemu_put_be64s(f, (const uint64_t *)pv);
195 b6c4f71f blueswir1
}
196 b6c4f71f blueswir1
197 b6c4f71f blueswir1
static inline void qemu_get_s8s(QEMUFile *f, int8_t *pv)
198 b6c4f71f blueswir1
{
199 b6c4f71f blueswir1
    qemu_get_8s(f, (uint8_t *)pv);
200 b6c4f71f blueswir1
}
201 b6c4f71f blueswir1
202 b6c4f71f blueswir1
static inline void qemu_get_sbe16s(QEMUFile *f, int16_t *pv)
203 b6c4f71f blueswir1
{
204 b6c4f71f blueswir1
    qemu_get_be16s(f, (uint16_t *)pv);
205 b6c4f71f blueswir1
}
206 b6c4f71f blueswir1
207 b6c4f71f blueswir1
static inline void qemu_get_sbe32s(QEMUFile *f, int32_t *pv)
208 b6c4f71f blueswir1
{
209 b6c4f71f blueswir1
    qemu_get_be32s(f, (uint32_t *)pv);
210 b6c4f71f blueswir1
}
211 b6c4f71f blueswir1
212 b6c4f71f blueswir1
static inline void qemu_get_sbe64s(QEMUFile *f, int64_t *pv)
213 b6c4f71f blueswir1
{
214 b6c4f71f blueswir1
    qemu_get_be64s(f, (uint64_t *)pv);
215 b6c4f71f blueswir1
}
216 b6c4f71f blueswir1
217 87ecb68b pbrook
#ifdef NEED_CPU_H
218 87ecb68b pbrook
#if TARGET_LONG_BITS == 64
219 87ecb68b pbrook
#define qemu_put_betl qemu_put_be64
220 87ecb68b pbrook
#define qemu_get_betl qemu_get_be64
221 87ecb68b pbrook
#define qemu_put_betls qemu_put_be64s
222 87ecb68b pbrook
#define qemu_get_betls qemu_get_be64s
223 b6c4f71f blueswir1
#define qemu_put_sbetl qemu_put_sbe64
224 b6c4f71f blueswir1
#define qemu_get_sbetl qemu_get_sbe64
225 b6c4f71f blueswir1
#define qemu_put_sbetls qemu_put_sbe64s
226 b6c4f71f blueswir1
#define qemu_get_sbetls qemu_get_sbe64s
227 87ecb68b pbrook
#else
228 87ecb68b pbrook
#define qemu_put_betl qemu_put_be32
229 87ecb68b pbrook
#define qemu_get_betl qemu_get_be32
230 87ecb68b pbrook
#define qemu_put_betls qemu_put_be32s
231 87ecb68b pbrook
#define qemu_get_betls qemu_get_be32s
232 b6c4f71f blueswir1
#define qemu_put_sbetl qemu_put_sbe32
233 b6c4f71f blueswir1
#define qemu_get_sbetl qemu_get_sbe32
234 b6c4f71f blueswir1
#define qemu_put_sbetls qemu_put_sbe32s
235 b6c4f71f blueswir1
#define qemu_get_sbetls qemu_get_sbe32s
236 87ecb68b pbrook
#endif
237 87ecb68b pbrook
#endif
238 87ecb68b pbrook
239 87ecb68b pbrook
int64_t qemu_ftell(QEMUFile *f);
240 87ecb68b pbrook
int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence);
241 87ecb68b pbrook
242 87ecb68b pbrook
typedef void SaveStateHandler(QEMUFile *f, void *opaque);
243 9366f418 aliguori
typedef int SaveLiveStateHandler(QEMUFile *f, int stage, void *opaque);
244 87ecb68b pbrook
typedef int LoadStateHandler(QEMUFile *f, void *opaque, int version_id);
245 87ecb68b pbrook
246 87ecb68b pbrook
int register_savevm(const char *idstr,
247 87ecb68b pbrook
                    int instance_id,
248 87ecb68b pbrook
                    int version_id,
249 87ecb68b pbrook
                    SaveStateHandler *save_state,
250 87ecb68b pbrook
                    LoadStateHandler *load_state,
251 87ecb68b pbrook
                    void *opaque);
252 87ecb68b pbrook
253 9366f418 aliguori
int register_savevm_live(const char *idstr,
254 9366f418 aliguori
                         int instance_id,
255 9366f418 aliguori
                         int version_id,
256 9366f418 aliguori
                         SaveLiveStateHandler *save_live_state,
257 9366f418 aliguori
                         SaveStateHandler *save_state,
258 9366f418 aliguori
                         LoadStateHandler *load_state,
259 9366f418 aliguori
                         void *opaque);
260 9366f418 aliguori
261 41bd13af aliguori
void unregister_savevm(const char *idstr, void *opaque);
262 41bd13af aliguori
263 87ecb68b pbrook
typedef void QEMUResetHandler(void *opaque);
264 87ecb68b pbrook
265 a08d4367 Jan Kiszka
void qemu_register_reset(QEMUResetHandler *func, void *opaque);
266 dda9b29f Jan Kiszka
void qemu_unregister_reset(QEMUResetHandler *func, void *opaque);
267 87ecb68b pbrook
268 76e30d0f Jan Kiszka
/* handler to set the boot_device order for a specific type of QEMUMachine */
269 0ecdffbb aurel32
/* return 0 if success */
270 76e30d0f Jan Kiszka
typedef int QEMUBootSetHandler(void *opaque, const char *boot_devices);
271 3b4366de blueswir1
void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque);
272 76e30d0f Jan Kiszka
int qemu_boot_set(const char *boot_devices);
273 0ecdffbb aurel32
274 9ed7d6ae Juan Quintela
typedef struct VMStateInfo VMStateInfo;
275 9ed7d6ae Juan Quintela
typedef struct VMStateDescription VMStateDescription;
276 9ed7d6ae Juan Quintela
277 9ed7d6ae Juan Quintela
struct VMStateInfo {
278 9ed7d6ae Juan Quintela
    const char *name;
279 9ed7d6ae Juan Quintela
    int (*get)(QEMUFile *f, void *pv, size_t size);
280 84e2e3eb Juan Quintela
    void (*put)(QEMUFile *f, void *pv, size_t size);
281 9ed7d6ae Juan Quintela
};
282 9ed7d6ae Juan Quintela
283 9ed7d6ae Juan Quintela
enum VMStateFlags {
284 9ed7d6ae Juan Quintela
    VMS_SINGLE  = 0x001,
285 dde0463b Juan Quintela
    VMS_POINTER = 0x002,
286 f752a6aa Juan Quintela
    VMS_ARRAY   = 0x004,
287 ec245e21 Juan Quintela
    VMS_STRUCT  = 0x008,
288 b00319a9 Juan Quintela
    VMS_VARRAY  = 0x010,  /* Array with size in another field */
289 6f67c50f Juan Quintela
    VMS_BUFFER  = 0x020,  /* static sized buffer */
290 19df438b Juan Quintela
    VMS_ARRAY_OF_POINTER = 0x040,
291 9ed7d6ae Juan Quintela
};
292 9ed7d6ae Juan Quintela
293 9ed7d6ae Juan Quintela
typedef struct {
294 9ed7d6ae Juan Quintela
    const char *name;
295 9ed7d6ae Juan Quintela
    size_t offset;
296 9ed7d6ae Juan Quintela
    size_t size;
297 f752a6aa Juan Quintela
    int num;
298 b00319a9 Juan Quintela
    size_t num_offset;
299 9ed7d6ae Juan Quintela
    const VMStateInfo *info;
300 9ed7d6ae Juan Quintela
    enum VMStateFlags flags;
301 ec245e21 Juan Quintela
    const VMStateDescription *vmsd;
302 9ed7d6ae Juan Quintela
    int version_id;
303 f11f6a5f Juan Quintela
    bool (*field_exists)(void *opaque, int version_id);
304 9ed7d6ae Juan Quintela
} VMStateField;
305 9ed7d6ae Juan Quintela
306 9ed7d6ae Juan Quintela
struct VMStateDescription {
307 9ed7d6ae Juan Quintela
    const char *name;
308 9ed7d6ae Juan Quintela
    int version_id;
309 9ed7d6ae Juan Quintela
    int minimum_version_id;
310 9ed7d6ae Juan Quintela
    int minimum_version_id_old;
311 9ed7d6ae Juan Quintela
    LoadStateHandler *load_state_old;
312 fd4d52de Juan Quintela
    int (*pre_load)(void *opaque);
313 e59fb374 Juan Quintela
    int (*post_load)(void *opaque, int version_id);
314 d4bfa4d7 Juan Quintela
    void (*pre_save)(void *opaque);
315 d4bfa4d7 Juan Quintela
    void (*post_save)(void *opaque);
316 9ed7d6ae Juan Quintela
    VMStateField *fields;
317 9ed7d6ae Juan Quintela
};
318 9ed7d6ae Juan Quintela
319 9ed7d6ae Juan Quintela
extern const VMStateInfo vmstate_info_int8;
320 9ed7d6ae Juan Quintela
extern const VMStateInfo vmstate_info_int16;
321 9ed7d6ae Juan Quintela
extern const VMStateInfo vmstate_info_int32;
322 9ed7d6ae Juan Quintela
extern const VMStateInfo vmstate_info_int64;
323 9ed7d6ae Juan Quintela
324 80cd83e7 Juan Quintela
extern const VMStateInfo vmstate_info_uint8_equal;
325 82501660 Juan Quintela
extern const VMStateInfo vmstate_info_int32_equal;
326 0a031e0a Juan Quintela
extern const VMStateInfo vmstate_info_int32_le;
327 82501660 Juan Quintela
328 9ed7d6ae Juan Quintela
extern const VMStateInfo vmstate_info_uint8;
329 9ed7d6ae Juan Quintela
extern const VMStateInfo vmstate_info_uint16;
330 9ed7d6ae Juan Quintela
extern const VMStateInfo vmstate_info_uint32;
331 9ed7d6ae Juan Quintela
extern const VMStateInfo vmstate_info_uint64;
332 9ed7d6ae Juan Quintela
333 dde0463b Juan Quintela
extern const VMStateInfo vmstate_info_timer;
334 55a6e51f Blue Swirl
extern const VMStateInfo vmstate_info_ptimer;
335 6f67c50f Juan Quintela
extern const VMStateInfo vmstate_info_buffer;
336 dde0463b Juan Quintela
337 f752a6aa Juan Quintela
#define type_check_array(t1,t2,n) ((t1(*)[n])0 - (t2*)0)
338 b00319a9 Juan Quintela
#define type_check_pointer(t1,t2) ((t1**)0 - (t2*)0)
339 f752a6aa Juan Quintela
340 9ed7d6ae Juan Quintela
#define VMSTATE_SINGLE(_field, _state, _version, _info, _type) {     \
341 9ed7d6ae Juan Quintela
    .name       = (stringify(_field)),                               \
342 9ed7d6ae Juan Quintela
    .version_id = (_version),                                        \
343 9ed7d6ae Juan Quintela
    .size       = sizeof(_type),                                     \
344 9ed7d6ae Juan Quintela
    .info       = &(_info),                                          \
345 9ed7d6ae Juan Quintela
    .flags      = VMS_SINGLE,                                        \
346 9ed7d6ae Juan Quintela
    .offset     = offsetof(_state, _field)                           \
347 9ed7d6ae Juan Quintela
            + type_check(_type,typeof_field(_state, _field))         \
348 9ed7d6ae Juan Quintela
}
349 9ed7d6ae Juan Quintela
350 f11f6a5f Juan Quintela
#define VMSTATE_SINGLE_TEST(_field, _state, _test, _info, _type) {   \
351 f11f6a5f Juan Quintela
    .name         = (stringify(_field)),                             \
352 f11f6a5f Juan Quintela
    .field_exists = (_test),                                         \
353 f11f6a5f Juan Quintela
    .size         = sizeof(_type),                                   \
354 f11f6a5f Juan Quintela
    .info         = &(_info),                                        \
355 f11f6a5f Juan Quintela
    .flags        = VMS_SINGLE,                                      \
356 f11f6a5f Juan Quintela
    .offset       = offsetof(_state, _field)                         \
357 f11f6a5f Juan Quintela
            + type_check(_type,typeof_field(_state, _field))         \
358 f11f6a5f Juan Quintela
}
359 f11f6a5f Juan Quintela
360 dde0463b Juan Quintela
#define VMSTATE_POINTER(_field, _state, _version, _info, _type) {    \
361 dde0463b Juan Quintela
    .name       = (stringify(_field)),                               \
362 dde0463b Juan Quintela
    .version_id = (_version),                                        \
363 dde0463b Juan Quintela
    .info       = &(_info),                                          \
364 dde0463b Juan Quintela
    .size       = sizeof(_type),                                     \
365 dde0463b Juan Quintela
    .flags      = VMS_SINGLE|VMS_POINTER,                            \
366 dde0463b Juan Quintela
    .offset     = offsetof(_state, _field)                           \
367 dde0463b Juan Quintela
            + type_check(_type,typeof_field(_state, _field))         \
368 dde0463b Juan Quintela
}
369 dde0463b Juan Quintela
370 f752a6aa Juan Quintela
#define VMSTATE_ARRAY(_field, _state, _num, _version, _info, _type) {\
371 f752a6aa Juan Quintela
    .name       = (stringify(_field)),                               \
372 f752a6aa Juan Quintela
    .version_id = (_version),                                        \
373 f752a6aa Juan Quintela
    .num        = (_num),                                            \
374 f752a6aa Juan Quintela
    .info       = &(_info),                                          \
375 f752a6aa Juan Quintela
    .size       = sizeof(_type),                                     \
376 f752a6aa Juan Quintela
    .flags      = VMS_ARRAY,                                         \
377 f752a6aa Juan Quintela
    .offset     = offsetof(_state, _field)                           \
378 f752a6aa Juan Quintela
        + type_check_array(_type,typeof_field(_state, _field),_num)  \
379 f752a6aa Juan Quintela
}
380 f752a6aa Juan Quintela
381 f11f6a5f Juan Quintela
#define VMSTATE_ARRAY_TEST(_field, _state, _num, _test, _info, _type) {\
382 f11f6a5f Juan Quintela
    .name         = (stringify(_field)),                              \
383 f11f6a5f Juan Quintela
    .field_exists = (_test),                                          \
384 f11f6a5f Juan Quintela
    .num          = (_num),                                           \
385 f11f6a5f Juan Quintela
    .info         = &(_info),                                         \
386 f11f6a5f Juan Quintela
    .size         = sizeof(_type),                                    \
387 f11f6a5f Juan Quintela
    .flags        = VMS_ARRAY,                                        \
388 f11f6a5f Juan Quintela
    .offset       = offsetof(_state, _field)                          \
389 f11f6a5f Juan Quintela
        + type_check_array(_type,typeof_field(_state, _field),_num)  \
390 f11f6a5f Juan Quintela
}
391 f11f6a5f Juan Quintela
392 b00319a9 Juan Quintela
#define VMSTATE_VARRAY(_field, _state, _field_num, _version, _info, _type) {\
393 b00319a9 Juan Quintela
    .name       = (stringify(_field)),                               \
394 b00319a9 Juan Quintela
    .version_id = (_version),                                        \
395 b00319a9 Juan Quintela
    .num_offset = offsetof(_state, _field_num)                       \
396 b00319a9 Juan Quintela
        + type_check(int32_t,typeof_field(_state, _field_num)),      \
397 b00319a9 Juan Quintela
    .info       = &(_info),                                          \
398 b00319a9 Juan Quintela
    .size       = sizeof(_type),                                     \
399 b00319a9 Juan Quintela
    .flags      = VMS_VARRAY|VMS_POINTER,                            \
400 b00319a9 Juan Quintela
    .offset     = offsetof(_state, _field)                           \
401 b00319a9 Juan Quintela
        + type_check_pointer(_type,typeof_field(_state, _field))     \
402 b00319a9 Juan Quintela
}
403 b00319a9 Juan Quintela
404 ec245e21 Juan Quintela
#define VMSTATE_STRUCT(_field, _state, _version, _vmsd, _type) {     \
405 ec245e21 Juan Quintela
    .name       = (stringify(_field)),                               \
406 ec245e21 Juan Quintela
    .version_id = (_version),                                        \
407 ec245e21 Juan Quintela
    .vmsd       = &(_vmsd),                                          \
408 ec245e21 Juan Quintela
    .size       = sizeof(_type),                                     \
409 ec245e21 Juan Quintela
    .flags      = VMS_STRUCT,                                        \
410 ec245e21 Juan Quintela
    .offset     = offsetof(_state, _field)                           \
411 ec245e21 Juan Quintela
            + type_check(_type,typeof_field(_state, _field))         \
412 ec245e21 Juan Quintela
}
413 ec245e21 Juan Quintela
414 840e9cef Juan Quintela
#define VMSTATE_STRUCT_POINTER(_field, _state, _vmsd, _type) {       \
415 840e9cef Juan Quintela
    .name       = (stringify(_field)),                               \
416 840e9cef Juan Quintela
    .vmsd       = &(_vmsd),                                          \
417 840e9cef Juan Quintela
    .size       = sizeof(_type),                                     \
418 840e9cef Juan Quintela
    .flags      = VMS_STRUCT|VMS_POINTER,                            \
419 840e9cef Juan Quintela
    .offset     = offsetof(_state, _field)                           \
420 840e9cef Juan Quintela
            + type_check(_type,typeof_field(_state, _field))         \
421 840e9cef Juan Quintela
}
422 840e9cef Juan Quintela
423 19df438b Juan Quintela
#define VMSTATE_ARRAY_OF_POINTER(_field, _state, _num, _version, _info, _type) {\
424 19df438b Juan Quintela
    .name       = (stringify(_field)),                               \
425 19df438b Juan Quintela
    .version_id = (_version),                                        \
426 19df438b Juan Quintela
    .num        = (_num),                                            \
427 19df438b Juan Quintela
    .info       = &(_info),                                          \
428 19df438b Juan Quintela
    .size       = sizeof(_type),                                     \
429 19df438b Juan Quintela
    .flags      = VMS_ARRAY|VMS_ARRAY_OF_POINTER,                    \
430 19df438b Juan Quintela
    .offset     = offsetof(_state, _field)                           \
431 19df438b Juan Quintela
        + type_check_array(_type,typeof_field(_state, _field),_num)  \
432 19df438b Juan Quintela
}
433 19df438b Juan Quintela
434 79c451b9 Juan Quintela
#define VMSTATE_STRUCT_ARRAY(_field, _state, _num, _version, _vmsd, _type) { \
435 79c451b9 Juan Quintela
    .name       = (stringify(_field)),                               \
436 79c451b9 Juan Quintela
    .num        = (_num),                                            \
437 79c451b9 Juan Quintela
    .version_id = (_version),                                        \
438 79c451b9 Juan Quintela
    .vmsd       = &(_vmsd),                                          \
439 79c451b9 Juan Quintela
    .size       = sizeof(_type),                                     \
440 79c451b9 Juan Quintela
    .flags      = VMS_STRUCT|VMS_ARRAY,                              \
441 79c451b9 Juan Quintela
    .offset     = offsetof(_state, _field)                           \
442 79c451b9 Juan Quintela
        + type_check_array(_type,typeof_field(_state, _field),_num)  \
443 79c451b9 Juan Quintela
}
444 79c451b9 Juan Quintela
445 6680f01c Juan Quintela
#define VMSTATE_STRUCT_ARRAY_SIZE_UINT8(_field, _state, _field__num, _version, _vmsd, _type) { \
446 6680f01c Juan Quintela
    .name       = (stringify(_field)),                               \
447 6680f01c Juan Quintela
    .num_offset = offsetof(_state, _field_num)                       \
448 6680f01c Juan Quintela
        + type_check(uint8_t,typeof_field(_state, _field_num)),       \
449 6680f01c Juan Quintela
    .version_id = (_version),                                        \
450 6680f01c Juan Quintela
    .vmsd       = &(_vmsd),                                          \
451 6680f01c Juan Quintela
    .size       = sizeof(_type),                                     \
452 6680f01c Juan Quintela
    .flags      = VMS_STRUCT|VMS_ARRAY,                              \
453 6680f01c Juan Quintela
    .offset     = offsetof(_state, _field)                           \
454 6680f01c Juan Quintela
        + type_check_array(_type,typeof_field(_state, _field),_num)  \
455 6680f01c Juan Quintela
}
456 6680f01c Juan Quintela
457 6f67c50f Juan Quintela
#define VMSTATE_STATIC_BUFFER(_field, _state, _version) {            \
458 6f67c50f Juan Quintela
    .name       = (stringify(_field)),                               \
459 6f67c50f Juan Quintela
    .version_id = (_version),                                        \
460 6f67c50f Juan Quintela
    .size       = sizeof(typeof_field(_state,_field)),               \
461 6f67c50f Juan Quintela
    .info       = &vmstate_info_buffer,                              \
462 6f67c50f Juan Quintela
    .flags      = VMS_BUFFER,                                        \
463 6f67c50f Juan Quintela
    .offset     = offsetof(_state, _field)                           \
464 6f67c50f Juan Quintela
        + type_check_array(uint8_t,typeof_field(_state, _field),sizeof(typeof_field(_state,_field))) \
465 6f67c50f Juan Quintela
}
466 6f67c50f Juan Quintela
467 7e72abc3 Juan Quintela
#define VMSTATE_BUFFER_START_MIDDLE(_field, _state, start) {         \
468 7e72abc3 Juan Quintela
    .name       = (stringify(_field)),                               \
469 7e72abc3 Juan Quintela
    .size       = sizeof(typeof_field(_state,_field)) - start,       \
470 7e72abc3 Juan Quintela
    .info       = &vmstate_info_buffer,                              \
471 7e72abc3 Juan Quintela
    .flags      = VMS_BUFFER,                                        \
472 7e72abc3 Juan Quintela
    .offset     = offsetof(_state, _field) + start                   \
473 7e72abc3 Juan Quintela
        + type_check_array(uint8_t,typeof_field(_state, _field),sizeof(typeof_field(_state,_field))) \
474 7e72abc3 Juan Quintela
}
475 7e72abc3 Juan Quintela
476 73534f2f Juan Quintela
extern const VMStateDescription vmstate_pci_device;
477 73534f2f Juan Quintela
478 73534f2f Juan Quintela
#define VMSTATE_PCI_DEVICE(_field, _state) {                         \
479 73534f2f Juan Quintela
    .name       = (stringify(_field)),                               \
480 73534f2f Juan Quintela
    .size       = sizeof(PCIDevice),                                 \
481 73534f2f Juan Quintela
    .vmsd       = &vmstate_pci_device,                               \
482 73534f2f Juan Quintela
    .flags      = VMS_STRUCT,                                        \
483 73534f2f Juan Quintela
    .offset     = offsetof(_state, _field)                           \
484 73534f2f Juan Quintela
            + type_check(PCIDevice,typeof_field(_state, _field))     \
485 73534f2f Juan Quintela
}
486 73534f2f Juan Quintela
487 1894839f Juan Quintela
extern const VMStateDescription vmstate_i2c_slave;
488 1894839f Juan Quintela
489 1894839f Juan Quintela
#define VMSTATE_I2C_SLAVE(_field, _state) {                          \
490 1894839f Juan Quintela
    .name       = (stringify(_field)),                               \
491 1894839f Juan Quintela
    .size       = sizeof(i2c_slave),                                 \
492 1894839f Juan Quintela
    .vmsd       = &vmstate_i2c_slave,                                \
493 1894839f Juan Quintela
    .flags      = VMS_STRUCT,                                        \
494 1894839f Juan Quintela
    .offset     = offsetof(_state, _field)                           \
495 1894839f Juan Quintela
            + type_check(i2c_slave,typeof_field(_state, _field))     \
496 1894839f Juan Quintela
}
497 1894839f Juan Quintela
498 9ed7d6ae Juan Quintela
/* _f : field name
499 b00319a9 Juan Quintela
   _f_n : num of elements field_name
500 f752a6aa Juan Quintela
   _n : num of elements
501 9ed7d6ae Juan Quintela
   _s : struct state name
502 9ed7d6ae Juan Quintela
   _v : version
503 9ed7d6ae Juan Quintela
*/
504 9ed7d6ae Juan Quintela
505 9ed7d6ae Juan Quintela
#define VMSTATE_INT8_V(_f, _s, _v)                                    \
506 9ed7d6ae Juan Quintela
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_int8, int8_t)
507 9ed7d6ae Juan Quintela
#define VMSTATE_INT16_V(_f, _s, _v)                                   \
508 9ed7d6ae Juan Quintela
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_int16, int16_t)
509 9ed7d6ae Juan Quintela
#define VMSTATE_INT32_V(_f, _s, _v)                                   \
510 9ed7d6ae Juan Quintela
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_int32, int32_t)
511 9ed7d6ae Juan Quintela
#define VMSTATE_INT64_V(_f, _s, _v)                                   \
512 9ed7d6ae Juan Quintela
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_int64, int64_t)
513 9ed7d6ae Juan Quintela
514 9ed7d6ae Juan Quintela
#define VMSTATE_UINT8_V(_f, _s, _v)                                   \
515 9ed7d6ae Juan Quintela
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_uint8, uint8_t)
516 9ed7d6ae Juan Quintela
#define VMSTATE_UINT16_V(_f, _s, _v)                                  \
517 9ed7d6ae Juan Quintela
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_uint16, uint16_t)
518 9ed7d6ae Juan Quintela
#define VMSTATE_UINT32_V(_f, _s, _v)                                  \
519 9ed7d6ae Juan Quintela
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_uint32, uint32_t)
520 9ed7d6ae Juan Quintela
#define VMSTATE_UINT64_V(_f, _s, _v)                                  \
521 9ed7d6ae Juan Quintela
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_uint64, uint64_t)
522 9ed7d6ae Juan Quintela
523 9ed7d6ae Juan Quintela
#define VMSTATE_INT8(_f, _s)                                          \
524 9ed7d6ae Juan Quintela
    VMSTATE_INT8_V(_f, _s, 0)
525 9ed7d6ae Juan Quintela
#define VMSTATE_INT16(_f, _s)                                         \
526 9ed7d6ae Juan Quintela
    VMSTATE_INT16_V(_f, _s, 0)
527 9ed7d6ae Juan Quintela
#define VMSTATE_INT32(_f, _s)                                         \
528 9ed7d6ae Juan Quintela
    VMSTATE_INT32_V(_f, _s, 0)
529 9ed7d6ae Juan Quintela
#define VMSTATE_INT64(_f, _s)                                         \
530 9ed7d6ae Juan Quintela
    VMSTATE_INT64_V(_f, _s, 0)
531 9ed7d6ae Juan Quintela
532 9ed7d6ae Juan Quintela
#define VMSTATE_UINT8(_f, _s)                                         \
533 9ed7d6ae Juan Quintela
    VMSTATE_UINT8_V(_f, _s, 0)
534 9ed7d6ae Juan Quintela
#define VMSTATE_UINT16(_f, _s)                                        \
535 9ed7d6ae Juan Quintela
    VMSTATE_UINT16_V(_f, _s, 0)
536 9ed7d6ae Juan Quintela
#define VMSTATE_UINT32(_f, _s)                                        \
537 9ed7d6ae Juan Quintela
    VMSTATE_UINT32_V(_f, _s, 0)
538 9ed7d6ae Juan Quintela
#define VMSTATE_UINT64(_f, _s)                                        \
539 9ed7d6ae Juan Quintela
    VMSTATE_UINT64_V(_f, _s, 0)
540 9ed7d6ae Juan Quintela
541 80cd83e7 Juan Quintela
#define VMSTATE_UINT8_EQUAL(_f, _s)                                   \
542 80cd83e7 Juan Quintela
    VMSTATE_SINGLE(_f, _s, 0, vmstate_info_uint8_equal, uint8_t)
543 80cd83e7 Juan Quintela
544 82501660 Juan Quintela
#define VMSTATE_INT32_EQUAL(_f, _s)                                   \
545 82501660 Juan Quintela
    VMSTATE_SINGLE(_f, _s, 0, vmstate_info_int32_equal, int32_t)
546 82501660 Juan Quintela
547 0a031e0a Juan Quintela
#define VMSTATE_INT32_LE(_f, _s)                                   \
548 0a031e0a Juan Quintela
    VMSTATE_SINGLE(_f, _s, 0, vmstate_info_int32_le, int32_t)
549 0a031e0a Juan Quintela
550 f11f6a5f Juan Quintela
#define VMSTATE_UINT32_TEST(_f, _s, _t)                                  \
551 f11f6a5f Juan Quintela
    VMSTATE_SINGLE_TEST(_f, _s, _t, vmstate_info_uint32, uint32_t)
552 f11f6a5f Juan Quintela
553 dde0463b Juan Quintela
#define VMSTATE_TIMER_V(_f, _s, _v)                                   \
554 dde0463b Juan Quintela
    VMSTATE_POINTER(_f, _s, _v, vmstate_info_timer, QEMUTimer *)
555 dde0463b Juan Quintela
556 dde0463b Juan Quintela
#define VMSTATE_TIMER(_f, _s)                                         \
557 dde0463b Juan Quintela
    VMSTATE_TIMER_V(_f, _s, 0)
558 dde0463b Juan Quintela
559 19df438b Juan Quintela
#define VMSTATE_TIMER_ARRAY(_f, _s, _n)                              \
560 19df438b Juan Quintela
    VMSTATE_ARRAY_OF_POINTER(_f, _s, _n, 0, vmstate_info_timer, QEMUTimer *)
561 19df438b Juan Quintela
562 55a6e51f Blue Swirl
#define VMSTATE_PTIMER_V(_f, _s, _v)                                  \
563 55a6e51f Blue Swirl
    VMSTATE_POINTER(_f, _s, _v, vmstate_info_ptimer, ptimer_state *)
564 55a6e51f Blue Swirl
565 55a6e51f Blue Swirl
#define VMSTATE_PTIMER(_f, _s)                                        \
566 55a6e51f Blue Swirl
    VMSTATE_PTIMER_V(_f, _s, 0)
567 55a6e51f Blue Swirl
568 632cf073 Juan Quintela
#define VMSTATE_UINT16_ARRAY_V(_f, _s, _n, _v)                         \
569 632cf073 Juan Quintela
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint16, uint16_t)
570 632cf073 Juan Quintela
571 632cf073 Juan Quintela
#define VMSTATE_UINT16_ARRAY(_f, _s, _n)                               \
572 632cf073 Juan Quintela
    VMSTATE_UINT16_ARRAY_V(_f, _s, _n, 0)
573 632cf073 Juan Quintela
574 b6bd0bdc Juan Quintela
#define VMSTATE_UINT8_ARRAY_V(_f, _s, _n, _v)                         \
575 b6bd0bdc Juan Quintela
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint8, uint8_t)
576 b6bd0bdc Juan Quintela
577 b6bd0bdc Juan Quintela
#define VMSTATE_UINT8_ARRAY(_f, _s, _n)                               \
578 b6bd0bdc Juan Quintela
    VMSTATE_UINT8_ARRAY_V(_f, _s, _n, 0)
579 b6bd0bdc Juan Quintela
580 f752a6aa Juan Quintela
#define VMSTATE_UINT32_ARRAY_V(_f, _s, _n, _v)                        \
581 f752a6aa Juan Quintela
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint32, uint32_t)
582 f752a6aa Juan Quintela
583 f752a6aa Juan Quintela
#define VMSTATE_UINT32_ARRAY(_f, _s, _n)                              \
584 f752a6aa Juan Quintela
    VMSTATE_UINT32_ARRAY_V(_f, _s, _n, 0)
585 f752a6aa Juan Quintela
586 80a04bbe Juan Quintela
#define VMSTATE_UINT64_ARRAY_V(_f, _s, _n, _v)                        \
587 80a04bbe Juan Quintela
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint64, uint64_t)
588 80a04bbe Juan Quintela
589 80a04bbe Juan Quintela
#define VMSTATE_UINT64_ARRAY(_f, _s, _n)                              \
590 80a04bbe Juan Quintela
    VMSTATE_UINT64_ARRAY_V(_f, _s, _n, 0)
591 80a04bbe Juan Quintela
592 289070c7 Juan Quintela
#define VMSTATE_INT16_ARRAY_V(_f, _s, _n, _v)                         \
593 289070c7 Juan Quintela
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_int16, int16_t)
594 289070c7 Juan Quintela
595 289070c7 Juan Quintela
#define VMSTATE_INT16_ARRAY(_f, _s, _n)                               \
596 289070c7 Juan Quintela
    VMSTATE_INT16_ARRAY_V(_f, _s, _n, 0)
597 289070c7 Juan Quintela
598 f752a6aa Juan Quintela
#define VMSTATE_INT32_ARRAY_V(_f, _s, _n, _v)                         \
599 f752a6aa Juan Quintela
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_int32, int32_t)
600 f752a6aa Juan Quintela
601 f752a6aa Juan Quintela
#define VMSTATE_INT32_ARRAY(_f, _s, _n)                               \
602 f752a6aa Juan Quintela
    VMSTATE_INT32_ARRAY_V(_f, _s, _n, 0)
603 f752a6aa Juan Quintela
604 b00319a9 Juan Quintela
#define VMSTATE_INT32_VARRAY_V(_f, _s, _f_n, _v)                      \
605 b00319a9 Juan Quintela
    VMSTATE_VARRAY(_f, _s, _f_n, _v, vmstate_info_int32, int32_t)
606 b00319a9 Juan Quintela
607 b00319a9 Juan Quintela
#define VMSTATE_INT32_VARRAY(_f, _s, _f_n)                            \
608 b00319a9 Juan Quintela
    VMSTATE_INT32_VARRAY_V(_f, _s, _f_n, 0)
609 b00319a9 Juan Quintela
610 6f67c50f Juan Quintela
#define VMSTATE_BUFFER_V(_f, _s, _v)                                  \
611 6f67c50f Juan Quintela
    VMSTATE_STATIC_BUFFER(_f, _s, _v)
612 6f67c50f Juan Quintela
613 6f67c50f Juan Quintela
#define VMSTATE_BUFFER(_f, _s)                                        \
614 6f67c50f Juan Quintela
    VMSTATE_STATIC_BUFFER(_f, _s, 0)
615 6f67c50f Juan Quintela
616 f89a8e4e Juan Quintela
#ifdef NEED_CPU_H
617 f89a8e4e Juan Quintela
#if TARGET_LONG_BITS == 64
618 f89a8e4e Juan Quintela
#define VMSTATE_UINTTL_V(_f, _s, _v)                                  \
619 f89a8e4e Juan Quintela
    VMSTATE_UINT64_V(_f, _s, _v)
620 f89a8e4e Juan Quintela
#define VMSTATE_UINTTL_ARRAY_V(_f, _s, _n, _v)                        \
621 f89a8e4e Juan Quintela
    VMSTATE_UINT64_ARRAY_V(_f, _s, _n, _v)
622 f89a8e4e Juan Quintela
#else
623 f89a8e4e Juan Quintela
#define VMSTATE_UINTTL_V(_f, _s, _v)                                  \
624 f89a8e4e Juan Quintela
    VMSTATE_UINT32_V(_f, _s, _v)
625 f89a8e4e Juan Quintela
#define VMSTATE_UINTTL_ARRAY_V(_f, _s, _n, _v)                        \
626 f89a8e4e Juan Quintela
    VMSTATE_UINT32_ARRAY_V(_f, _s, _n, _v)
627 f89a8e4e Juan Quintela
#endif
628 f89a8e4e Juan Quintela
#define VMSTATE_UINTTL(_f, _s)                                        \
629 f89a8e4e Juan Quintela
    VMSTATE_UINTTL_V(_f, _s, 0)
630 f89a8e4e Juan Quintela
#define VMSTATE_UINTTL_ARRAY(_f, _s, _n)                              \
631 f89a8e4e Juan Quintela
    VMSTATE_UINTTL_ARRAY_V(_f, _s, _n, 0)
632 f89a8e4e Juan Quintela
633 f89a8e4e Juan Quintela
#endif
634 f89a8e4e Juan Quintela
635 9ed7d6ae Juan Quintela
#define VMSTATE_END_OF_LIST()                                         \
636 9ed7d6ae Juan Quintela
    {}
637 9ed7d6ae Juan Quintela
638 9ed7d6ae Juan Quintela
extern int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
639 9ed7d6ae Juan Quintela
                              void *opaque, int version_id);
640 9ed7d6ae Juan Quintela
extern void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
641 84e2e3eb Juan Quintela
                               void *opaque);
642 9ed7d6ae Juan Quintela
extern int vmstate_register(int instance_id, const VMStateDescription *vmsd,
643 9ed7d6ae Juan Quintela
                            void *base);
644 1eb7538b Juan Quintela
void vmstate_unregister(const VMStateDescription *vmsd, void *opaque);
645 87ecb68b pbrook
#endif