Statistics
| Branch: | Revision:

root / hw / hw.h @ a9f49946

History | View | Annotate | Download (28.6 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 5139931f Juan Quintela
    VMS_SINGLE           = 0x001,
285 5139931f Juan Quintela
    VMS_POINTER          = 0x002,
286 5139931f Juan Quintela
    VMS_ARRAY            = 0x004,
287 5139931f Juan Quintela
    VMS_STRUCT           = 0x008,
288 bdb4941d Juan Quintela
    VMS_VARRAY_INT32     = 0x010,  /* Array with size in int32_t field*/
289 5139931f Juan Quintela
    VMS_BUFFER           = 0x020,  /* static sized buffer */
290 19df438b Juan Quintela
    VMS_ARRAY_OF_POINTER = 0x040,
291 bdb4941d Juan Quintela
    VMS_VARRAY_UINT16    = 0x080,  /* Array with size in uint16_t field */
292 9ed7d6ae Juan Quintela
};
293 9ed7d6ae Juan Quintela
294 9ed7d6ae Juan Quintela
typedef struct {
295 9ed7d6ae Juan Quintela
    const char *name;
296 9ed7d6ae Juan Quintela
    size_t offset;
297 9ed7d6ae Juan Quintela
    size_t size;
298 f752a6aa Juan Quintela
    int num;
299 b00319a9 Juan Quintela
    size_t num_offset;
300 9ed7d6ae Juan Quintela
    const VMStateInfo *info;
301 9ed7d6ae Juan Quintela
    enum VMStateFlags flags;
302 ec245e21 Juan Quintela
    const VMStateDescription *vmsd;
303 9ed7d6ae Juan Quintela
    int version_id;
304 f11f6a5f Juan Quintela
    bool (*field_exists)(void *opaque, int version_id);
305 9ed7d6ae Juan Quintela
} VMStateField;
306 9ed7d6ae Juan Quintela
307 9ed7d6ae Juan Quintela
struct VMStateDescription {
308 9ed7d6ae Juan Quintela
    const char *name;
309 9ed7d6ae Juan Quintela
    int version_id;
310 9ed7d6ae Juan Quintela
    int minimum_version_id;
311 9ed7d6ae Juan Quintela
    int minimum_version_id_old;
312 9ed7d6ae Juan Quintela
    LoadStateHandler *load_state_old;
313 fd4d52de Juan Quintela
    int (*pre_load)(void *opaque);
314 e59fb374 Juan Quintela
    int (*post_load)(void *opaque, int version_id);
315 d4bfa4d7 Juan Quintela
    void (*pre_save)(void *opaque);
316 d4bfa4d7 Juan Quintela
    void (*post_save)(void *opaque);
317 9ed7d6ae Juan Quintela
    VMStateField *fields;
318 9ed7d6ae Juan Quintela
};
319 9ed7d6ae Juan Quintela
320 9ed7d6ae Juan Quintela
extern const VMStateInfo vmstate_info_int8;
321 9ed7d6ae Juan Quintela
extern const VMStateInfo vmstate_info_int16;
322 9ed7d6ae Juan Quintela
extern const VMStateInfo vmstate_info_int32;
323 9ed7d6ae Juan Quintela
extern const VMStateInfo vmstate_info_int64;
324 9ed7d6ae Juan Quintela
325 80cd83e7 Juan Quintela
extern const VMStateInfo vmstate_info_uint8_equal;
326 dc3b83a0 Juan Quintela
extern const VMStateInfo vmstate_info_uint16_equal;
327 82501660 Juan Quintela
extern const VMStateInfo vmstate_info_int32_equal;
328 0a031e0a Juan Quintela
extern const VMStateInfo vmstate_info_int32_le;
329 82501660 Juan Quintela
330 9ed7d6ae Juan Quintela
extern const VMStateInfo vmstate_info_uint8;
331 9ed7d6ae Juan Quintela
extern const VMStateInfo vmstate_info_uint16;
332 9ed7d6ae Juan Quintela
extern const VMStateInfo vmstate_info_uint32;
333 9ed7d6ae Juan Quintela
extern const VMStateInfo vmstate_info_uint64;
334 9ed7d6ae Juan Quintela
335 dde0463b Juan Quintela
extern const VMStateInfo vmstate_info_timer;
336 55a6e51f Blue Swirl
extern const VMStateInfo vmstate_info_ptimer;
337 6f67c50f Juan Quintela
extern const VMStateInfo vmstate_info_buffer;
338 76507c75 Juan Quintela
extern const VMStateInfo vmstate_info_unused_buffer;
339 dde0463b Juan Quintela
340 f752a6aa Juan Quintela
#define type_check_array(t1,t2,n) ((t1(*)[n])0 - (t2*)0)
341 b00319a9 Juan Quintela
#define type_check_pointer(t1,t2) ((t1**)0 - (t2*)0)
342 f752a6aa Juan Quintela
343 904ca304 Juan Quintela
#define vmstate_offset_value(_state, _field, _type)                  \
344 904ca304 Juan Quintela
    (offsetof(_state, _field) +                                      \
345 904ca304 Juan Quintela
     type_check(_type, typeof_field(_state, _field)))
346 904ca304 Juan Quintela
347 c29d8b1e Juan Quintela
#define vmstate_offset_pointer(_state, _field, _type)                \
348 c29d8b1e Juan Quintela
    (offsetof(_state, _field) +                                      \
349 c29d8b1e Juan Quintela
     type_check_pointer(_type, typeof_field(_state, _field)))
350 c29d8b1e Juan Quintela
351 646bef19 Juan Quintela
#define vmstate_offset_array(_state, _field, _type, _num)            \
352 646bef19 Juan Quintela
    (offsetof(_state, _field) +                                      \
353 646bef19 Juan Quintela
     type_check_array(_type, typeof_field(_state, _field), _num))
354 646bef19 Juan Quintela
355 9ba2f660 Juan Quintela
#define vmstate_offset_sub_array(_state, _field, _type, _start)      \
356 9ba2f660 Juan Quintela
    (offsetof(_state, _field[_start]))
357 9ba2f660 Juan Quintela
358 844b236a Juan Quintela
#define vmstate_offset_buffer(_state, _field)                        \
359 844b236a Juan Quintela
    vmstate_offset_array(_state, _field, uint8_t,                    \
360 844b236a Juan Quintela
                         sizeof(typeof_field(_state, _field)))
361 844b236a Juan Quintela
362 d4829d49 Juan Quintela
#define VMSTATE_SINGLE_TEST(_field, _state, _test, _version, _info, _type) { \
363 f11f6a5f Juan Quintela
    .name         = (stringify(_field)),                             \
364 d4829d49 Juan Quintela
    .version_id   = (_version),                                      \
365 f11f6a5f Juan Quintela
    .field_exists = (_test),                                         \
366 f11f6a5f Juan Quintela
    .size         = sizeof(_type),                                   \
367 f11f6a5f Juan Quintela
    .info         = &(_info),                                        \
368 f11f6a5f Juan Quintela
    .flags        = VMS_SINGLE,                                      \
369 904ca304 Juan Quintela
    .offset       = vmstate_offset_value(_state, _field, _type),     \
370 f11f6a5f Juan Quintela
}
371 f11f6a5f Juan Quintela
372 dde0463b Juan Quintela
#define VMSTATE_POINTER(_field, _state, _version, _info, _type) {    \
373 dde0463b Juan Quintela
    .name       = (stringify(_field)),                               \
374 dde0463b Juan Quintela
    .version_id = (_version),                                        \
375 dde0463b Juan Quintela
    .info       = &(_info),                                          \
376 dde0463b Juan Quintela
    .size       = sizeof(_type),                                     \
377 dde0463b Juan Quintela
    .flags      = VMS_SINGLE|VMS_POINTER,                            \
378 904ca304 Juan Quintela
    .offset     = vmstate_offset_value(_state, _field, _type),       \
379 dde0463b Juan Quintela
}
380 dde0463b Juan Quintela
381 f752a6aa Juan Quintela
#define VMSTATE_ARRAY(_field, _state, _num, _version, _info, _type) {\
382 f752a6aa Juan Quintela
    .name       = (stringify(_field)),                               \
383 f752a6aa Juan Quintela
    .version_id = (_version),                                        \
384 f752a6aa Juan Quintela
    .num        = (_num),                                            \
385 f752a6aa Juan Quintela
    .info       = &(_info),                                          \
386 f752a6aa Juan Quintela
    .size       = sizeof(_type),                                     \
387 f752a6aa Juan Quintela
    .flags      = VMS_ARRAY,                                         \
388 646bef19 Juan Quintela
    .offset     = vmstate_offset_array(_state, _field, _type, _num), \
389 f752a6aa Juan Quintela
}
390 f752a6aa Juan Quintela
391 f11f6a5f Juan Quintela
#define VMSTATE_ARRAY_TEST(_field, _state, _num, _test, _info, _type) {\
392 f11f6a5f Juan Quintela
    .name         = (stringify(_field)),                              \
393 f11f6a5f Juan Quintela
    .field_exists = (_test),                                          \
394 f11f6a5f Juan Quintela
    .num          = (_num),                                           \
395 f11f6a5f Juan Quintela
    .info         = &(_info),                                         \
396 f11f6a5f Juan Quintela
    .size         = sizeof(_type),                                    \
397 f11f6a5f Juan Quintela
    .flags        = VMS_ARRAY,                                        \
398 646bef19 Juan Quintela
    .offset       = vmstate_offset_array(_state, _field, _type, _num),\
399 f11f6a5f Juan Quintela
}
400 f11f6a5f Juan Quintela
401 9ba2f660 Juan Quintela
#define VMSTATE_SUB_ARRAY(_field, _state, _start, _num, _version, _info, _type) { \
402 9ba2f660 Juan Quintela
    .name       = (stringify(_field)),                               \
403 9ba2f660 Juan Quintela
    .version_id = (_version),                                        \
404 9ba2f660 Juan Quintela
    .num        = (_num),                                            \
405 9ba2f660 Juan Quintela
    .info       = &(_info),                                          \
406 9ba2f660 Juan Quintela
    .size       = sizeof(_type),                                     \
407 9ba2f660 Juan Quintela
    .flags      = VMS_ARRAY,                                         \
408 9ba2f660 Juan Quintela
    .offset     = vmstate_offset_sub_array(_state, _field, _type, _start), \
409 9ba2f660 Juan Quintela
}
410 9ba2f660 Juan Quintela
411 d6698281 Juan Quintela
#define VMSTATE_VARRAY_INT32(_field, _state, _field_num, _version, _info, _type) {\
412 b00319a9 Juan Quintela
    .name       = (stringify(_field)),                               \
413 b00319a9 Juan Quintela
    .version_id = (_version),                                        \
414 904ca304 Juan Quintela
    .num_offset = vmstate_offset_value(_state, _field_num, int32_t), \
415 b00319a9 Juan Quintela
    .info       = &(_info),                                          \
416 b00319a9 Juan Quintela
    .size       = sizeof(_type),                                     \
417 d6698281 Juan Quintela
    .flags      = VMS_VARRAY_INT32|VMS_POINTER,                      \
418 c29d8b1e Juan Quintela
    .offset     = vmstate_offset_pointer(_state, _field, _type),     \
419 b00319a9 Juan Quintela
}
420 b00319a9 Juan Quintela
421 bdb4941d Juan Quintela
#define VMSTATE_VARRAY_UINT16_UNSAFE(_field, _state, _field_num, _version, _info, _type) {\
422 bdb4941d Juan Quintela
    .name       = (stringify(_field)),                               \
423 bdb4941d Juan Quintela
    .version_id = (_version),                                        \
424 bdb4941d Juan Quintela
    .num_offset = vmstate_offset_value(_state, _field_num, uint16_t),\
425 bdb4941d Juan Quintela
    .info       = &(_info),                                          \
426 bdb4941d Juan Quintela
    .size       = sizeof(_type),                                     \
427 bdb4941d Juan Quintela
    .flags      = VMS_VARRAY_UINT16,                                 \
428 bdb4941d Juan Quintela
    .offset     = offsetof(_state, _field),                          \
429 bdb4941d Juan Quintela
}
430 bdb4941d Juan Quintela
431 ec245e21 Juan Quintela
#define VMSTATE_STRUCT(_field, _state, _version, _vmsd, _type) {     \
432 ec245e21 Juan Quintela
    .name       = (stringify(_field)),                               \
433 ec245e21 Juan Quintela
    .version_id = (_version),                                        \
434 ec245e21 Juan Quintela
    .vmsd       = &(_vmsd),                                          \
435 ec245e21 Juan Quintela
    .size       = sizeof(_type),                                     \
436 ec245e21 Juan Quintela
    .flags      = VMS_STRUCT,                                        \
437 904ca304 Juan Quintela
    .offset     = vmstate_offset_value(_state, _field, _type),       \
438 ec245e21 Juan Quintela
}
439 ec245e21 Juan Quintela
440 840e9cef Juan Quintela
#define VMSTATE_STRUCT_POINTER(_field, _state, _vmsd, _type) {       \
441 840e9cef Juan Quintela
    .name       = (stringify(_field)),                               \
442 840e9cef Juan Quintela
    .vmsd       = &(_vmsd),                                          \
443 840e9cef Juan Quintela
    .size       = sizeof(_type),                                     \
444 840e9cef Juan Quintela
    .flags      = VMS_STRUCT|VMS_POINTER,                            \
445 904ca304 Juan Quintela
    .offset     = vmstate_offset_value(_state, _field, _type),       \
446 840e9cef Juan Quintela
}
447 840e9cef Juan Quintela
448 19df438b Juan Quintela
#define VMSTATE_ARRAY_OF_POINTER(_field, _state, _num, _version, _info, _type) {\
449 19df438b Juan Quintela
    .name       = (stringify(_field)),                               \
450 19df438b Juan Quintela
    .version_id = (_version),                                        \
451 19df438b Juan Quintela
    .num        = (_num),                                            \
452 19df438b Juan Quintela
    .info       = &(_info),                                          \
453 19df438b Juan Quintela
    .size       = sizeof(_type),                                     \
454 19df438b Juan Quintela
    .flags      = VMS_ARRAY|VMS_ARRAY_OF_POINTER,                    \
455 646bef19 Juan Quintela
    .offset     = vmstate_offset_array(_state, _field, _type, _num), \
456 19df438b Juan Quintela
}
457 19df438b Juan Quintela
458 79c451b9 Juan Quintela
#define VMSTATE_STRUCT_ARRAY(_field, _state, _num, _version, _vmsd, _type) { \
459 79c451b9 Juan Quintela
    .name       = (stringify(_field)),                               \
460 79c451b9 Juan Quintela
    .num        = (_num),                                            \
461 79c451b9 Juan Quintela
    .version_id = (_version),                                        \
462 79c451b9 Juan Quintela
    .vmsd       = &(_vmsd),                                          \
463 79c451b9 Juan Quintela
    .size       = sizeof(_type),                                     \
464 79c451b9 Juan Quintela
    .flags      = VMS_STRUCT|VMS_ARRAY,                              \
465 646bef19 Juan Quintela
    .offset     = vmstate_offset_array(_state, _field, _type, _num), \
466 79c451b9 Juan Quintela
}
467 79c451b9 Juan Quintela
468 6680f01c Juan Quintela
#define VMSTATE_STRUCT_ARRAY_SIZE_UINT8(_field, _state, _field__num, _version, _vmsd, _type) { \
469 6680f01c Juan Quintela
    .name       = (stringify(_field)),                               \
470 904ca304 Juan Quintela
    .num_offset = vmstate_offset_value(_state, _field_num, uint8_t), \
471 6680f01c Juan Quintela
    .version_id = (_version),                                        \
472 6680f01c Juan Quintela
    .vmsd       = &(_vmsd),                                          \
473 6680f01c Juan Quintela
    .size       = sizeof(_type),                                     \
474 6680f01c Juan Quintela
    .flags      = VMS_STRUCT|VMS_ARRAY,                              \
475 646bef19 Juan Quintela
    .offset     = vmstate_offset_array(_state, _field, _type, _num), \
476 6680f01c Juan Quintela
}
477 6680f01c Juan Quintela
478 b2e15099 Juan Quintela
#define VMSTATE_STATIC_BUFFER(_field, _state, _version, _test, _start, _size) { \
479 25dc563b Juan Quintela
    .name         = (stringify(_field)),                             \
480 b2e15099 Juan Quintela
    .version_id   = (_version),                                      \
481 25dc563b Juan Quintela
    .field_exists = (_test),                                         \
482 b2e15099 Juan Quintela
    .size         = (_size - _start),                                \
483 25dc563b Juan Quintela
    .info         = &vmstate_info_buffer,                            \
484 25dc563b Juan Quintela
    .flags        = VMS_BUFFER,                                      \
485 b2e15099 Juan Quintela
    .offset       = vmstate_offset_buffer(_state, _field) + _start,  \
486 7e72abc3 Juan Quintela
}
487 7e72abc3 Juan Quintela
488 9cae69bd Isaku Yamahata
#define VMSTATE_BUFFER_UNSAFE_INFO(_field, _state, _version, _info, _size) { \
489 1ae71a77 Juan Quintela
    .name       = (stringify(_field)),                               \
490 1ae71a77 Juan Quintela
    .version_id = (_version),                                        \
491 1ae71a77 Juan Quintela
    .size       = (_size),                                           \
492 9cae69bd Isaku Yamahata
    .info       = &(_info),                                          \
493 1ae71a77 Juan Quintela
    .flags      = VMS_BUFFER,                                        \
494 1ae71a77 Juan Quintela
    .offset     = offsetof(_state, _field),                          \
495 1ae71a77 Juan Quintela
}
496 1ae71a77 Juan Quintela
497 76507c75 Juan Quintela
#define VMSTATE_UNUSED_BUFFER(_test, _version, _size) {              \
498 76507c75 Juan Quintela
    .name         = "unused",                                        \
499 76507c75 Juan Quintela
    .field_exists = (_test),                                         \
500 76507c75 Juan Quintela
    .version_id   = (_version),                                      \
501 76507c75 Juan Quintela
    .size         = (_size),                                         \
502 76507c75 Juan Quintela
    .info         = &vmstate_info_unused_buffer,                     \
503 76507c75 Juan Quintela
    .flags        = VMS_BUFFER,                                      \
504 76507c75 Juan Quintela
}
505 73534f2f Juan Quintela
extern const VMStateDescription vmstate_pci_device;
506 73534f2f Juan Quintela
507 73534f2f Juan Quintela
#define VMSTATE_PCI_DEVICE(_field, _state) {                         \
508 73534f2f Juan Quintela
    .name       = (stringify(_field)),                               \
509 73534f2f Juan Quintela
    .size       = sizeof(PCIDevice),                                 \
510 73534f2f Juan Quintela
    .vmsd       = &vmstate_pci_device,                               \
511 73534f2f Juan Quintela
    .flags      = VMS_STRUCT,                                        \
512 904ca304 Juan Quintela
    .offset     = vmstate_offset_value(_state, _field, PCIDevice),   \
513 73534f2f Juan Quintela
}
514 73534f2f Juan Quintela
515 a9f49946 Isaku Yamahata
extern const VMStateDescription vmstate_pcie_device;
516 a9f49946 Isaku Yamahata
517 a9f49946 Isaku Yamahata
#define VMSTATE_PCIE_DEVICE(_field, _state) {                        \
518 a9f49946 Isaku Yamahata
    .name       = (stringify(_field)),                               \
519 a9f49946 Isaku Yamahata
    .version_id = 2,                                                 \
520 a9f49946 Isaku Yamahata
    .size       = sizeof(PCIDevice),                                 \
521 a9f49946 Isaku Yamahata
    .vmsd       = &vmstate_pcie_device,                              \
522 a9f49946 Isaku Yamahata
    .flags      = VMS_STRUCT,                                        \
523 a9f49946 Isaku Yamahata
    .offset     = vmstate_offset_value(_state, _field, PCIDevice),   \
524 a9f49946 Isaku Yamahata
}
525 a9f49946 Isaku Yamahata
526 1894839f Juan Quintela
extern const VMStateDescription vmstate_i2c_slave;
527 1894839f Juan Quintela
528 1894839f Juan Quintela
#define VMSTATE_I2C_SLAVE(_field, _state) {                          \
529 1894839f Juan Quintela
    .name       = (stringify(_field)),                               \
530 1894839f Juan Quintela
    .size       = sizeof(i2c_slave),                                 \
531 1894839f Juan Quintela
    .vmsd       = &vmstate_i2c_slave,                                \
532 1894839f Juan Quintela
    .flags      = VMS_STRUCT,                                        \
533 904ca304 Juan Quintela
    .offset     = vmstate_offset_value(_state, _field, i2c_slave),   \
534 1894839f Juan Quintela
}
535 1894839f Juan Quintela
536 9e77fcd0 Juan Quintela
#define vmstate_offset_macaddr(_state, _field)                       \
537 9e77fcd0 Juan Quintela
    vmstate_offset_array(_state, _field.a, uint8_t,                \
538 9e77fcd0 Juan Quintela
                         sizeof(typeof_field(_state, _field)))
539 9e77fcd0 Juan Quintela
540 9e77fcd0 Juan Quintela
#define VMSTATE_MACADDR(_field, _state) {                            \
541 9e77fcd0 Juan Quintela
    .name       = (stringify(_field)),                               \
542 9e77fcd0 Juan Quintela
    .size       = sizeof(MACAddr),                                   \
543 9e77fcd0 Juan Quintela
    .info       = &vmstate_info_uint8,                               \
544 9e77fcd0 Juan Quintela
    .flags      = VMS_BUFFER,                                        \
545 9e77fcd0 Juan Quintela
    .offset     = vmstate_offset_macaddr(_state, _field),            \
546 9e77fcd0 Juan Quintela
}
547 9e77fcd0 Juan Quintela
548 9ed7d6ae Juan Quintela
/* _f : field name
549 b00319a9 Juan Quintela
   _f_n : num of elements field_name
550 f752a6aa Juan Quintela
   _n : num of elements
551 9ed7d6ae Juan Quintela
   _s : struct state name
552 9ed7d6ae Juan Quintela
   _v : version
553 9ed7d6ae Juan Quintela
*/
554 9ed7d6ae Juan Quintela
555 d4829d49 Juan Quintela
#define VMSTATE_SINGLE(_field, _state, _version, _info, _type)        \
556 d4829d49 Juan Quintela
    VMSTATE_SINGLE_TEST(_field, _state, NULL, _version, _info, _type)
557 d4829d49 Juan Quintela
558 9ed7d6ae Juan Quintela
#define VMSTATE_INT8_V(_f, _s, _v)                                    \
559 9ed7d6ae Juan Quintela
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_int8, int8_t)
560 9ed7d6ae Juan Quintela
#define VMSTATE_INT16_V(_f, _s, _v)                                   \
561 9ed7d6ae Juan Quintela
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_int16, int16_t)
562 9ed7d6ae Juan Quintela
#define VMSTATE_INT32_V(_f, _s, _v)                                   \
563 9ed7d6ae Juan Quintela
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_int32, int32_t)
564 9ed7d6ae Juan Quintela
#define VMSTATE_INT64_V(_f, _s, _v)                                   \
565 9ed7d6ae Juan Quintela
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_int64, int64_t)
566 9ed7d6ae Juan Quintela
567 9ed7d6ae Juan Quintela
#define VMSTATE_UINT8_V(_f, _s, _v)                                   \
568 9ed7d6ae Juan Quintela
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_uint8, uint8_t)
569 9ed7d6ae Juan Quintela
#define VMSTATE_UINT16_V(_f, _s, _v)                                  \
570 9ed7d6ae Juan Quintela
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_uint16, uint16_t)
571 9ed7d6ae Juan Quintela
#define VMSTATE_UINT32_V(_f, _s, _v)                                  \
572 9ed7d6ae Juan Quintela
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_uint32, uint32_t)
573 9ed7d6ae Juan Quintela
#define VMSTATE_UINT64_V(_f, _s, _v)                                  \
574 9ed7d6ae Juan Quintela
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_uint64, uint64_t)
575 9ed7d6ae Juan Quintela
576 9ed7d6ae Juan Quintela
#define VMSTATE_INT8(_f, _s)                                          \
577 9ed7d6ae Juan Quintela
    VMSTATE_INT8_V(_f, _s, 0)
578 9ed7d6ae Juan Quintela
#define VMSTATE_INT16(_f, _s)                                         \
579 9ed7d6ae Juan Quintela
    VMSTATE_INT16_V(_f, _s, 0)
580 9ed7d6ae Juan Quintela
#define VMSTATE_INT32(_f, _s)                                         \
581 9ed7d6ae Juan Quintela
    VMSTATE_INT32_V(_f, _s, 0)
582 9ed7d6ae Juan Quintela
#define VMSTATE_INT64(_f, _s)                                         \
583 9ed7d6ae Juan Quintela
    VMSTATE_INT64_V(_f, _s, 0)
584 9ed7d6ae Juan Quintela
585 9ed7d6ae Juan Quintela
#define VMSTATE_UINT8(_f, _s)                                         \
586 9ed7d6ae Juan Quintela
    VMSTATE_UINT8_V(_f, _s, 0)
587 9ed7d6ae Juan Quintela
#define VMSTATE_UINT16(_f, _s)                                        \
588 9ed7d6ae Juan Quintela
    VMSTATE_UINT16_V(_f, _s, 0)
589 9ed7d6ae Juan Quintela
#define VMSTATE_UINT32(_f, _s)                                        \
590 9ed7d6ae Juan Quintela
    VMSTATE_UINT32_V(_f, _s, 0)
591 9ed7d6ae Juan Quintela
#define VMSTATE_UINT64(_f, _s)                                        \
592 9ed7d6ae Juan Quintela
    VMSTATE_UINT64_V(_f, _s, 0)
593 9ed7d6ae Juan Quintela
594 80cd83e7 Juan Quintela
#define VMSTATE_UINT8_EQUAL(_f, _s)                                   \
595 80cd83e7 Juan Quintela
    VMSTATE_SINGLE(_f, _s, 0, vmstate_info_uint8_equal, uint8_t)
596 80cd83e7 Juan Quintela
597 dc3b83a0 Juan Quintela
#define VMSTATE_UINT16_EQUAL(_f, _s)                                  \
598 dc3b83a0 Juan Quintela
    VMSTATE_SINGLE(_f, _s, 0, vmstate_info_uint16_equal, uint16_t)
599 dc3b83a0 Juan Quintela
600 dc3b83a0 Juan Quintela
#define VMSTATE_UINT16_EQUAL_V(_f, _s, _v)                            \
601 dc3b83a0 Juan Quintela
    VMSTATE_SINGLE(_f, _s, _v, vmstate_info_uint16_equal, uint16_t)
602 dc3b83a0 Juan Quintela
603 82501660 Juan Quintela
#define VMSTATE_INT32_EQUAL(_f, _s)                                   \
604 82501660 Juan Quintela
    VMSTATE_SINGLE(_f, _s, 0, vmstate_info_int32_equal, int32_t)
605 82501660 Juan Quintela
606 0a031e0a Juan Quintela
#define VMSTATE_INT32_LE(_f, _s)                                   \
607 0a031e0a Juan Quintela
    VMSTATE_SINGLE(_f, _s, 0, vmstate_info_int32_le, int32_t)
608 0a031e0a Juan Quintela
609 f11f6a5f Juan Quintela
#define VMSTATE_UINT32_TEST(_f, _s, _t)                                  \
610 d4829d49 Juan Quintela
    VMSTATE_SINGLE_TEST(_f, _s, _t, 0, vmstate_info_uint32, uint32_t)
611 f11f6a5f Juan Quintela
612 dde0463b Juan Quintela
#define VMSTATE_TIMER_V(_f, _s, _v)                                   \
613 dde0463b Juan Quintela
    VMSTATE_POINTER(_f, _s, _v, vmstate_info_timer, QEMUTimer *)
614 dde0463b Juan Quintela
615 dde0463b Juan Quintela
#define VMSTATE_TIMER(_f, _s)                                         \
616 dde0463b Juan Quintela
    VMSTATE_TIMER_V(_f, _s, 0)
617 dde0463b Juan Quintela
618 19df438b Juan Quintela
#define VMSTATE_TIMER_ARRAY(_f, _s, _n)                              \
619 19df438b Juan Quintela
    VMSTATE_ARRAY_OF_POINTER(_f, _s, _n, 0, vmstate_info_timer, QEMUTimer *)
620 19df438b Juan Quintela
621 55a6e51f Blue Swirl
#define VMSTATE_PTIMER_V(_f, _s, _v)                                  \
622 55a6e51f Blue Swirl
    VMSTATE_POINTER(_f, _s, _v, vmstate_info_ptimer, ptimer_state *)
623 55a6e51f Blue Swirl
624 55a6e51f Blue Swirl
#define VMSTATE_PTIMER(_f, _s)                                        \
625 55a6e51f Blue Swirl
    VMSTATE_PTIMER_V(_f, _s, 0)
626 55a6e51f Blue Swirl
627 632cf073 Juan Quintela
#define VMSTATE_UINT16_ARRAY_V(_f, _s, _n, _v)                         \
628 632cf073 Juan Quintela
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint16, uint16_t)
629 632cf073 Juan Quintela
630 632cf073 Juan Quintela
#define VMSTATE_UINT16_ARRAY(_f, _s, _n)                               \
631 632cf073 Juan Quintela
    VMSTATE_UINT16_ARRAY_V(_f, _s, _n, 0)
632 632cf073 Juan Quintela
633 b6bd0bdc Juan Quintela
#define VMSTATE_UINT8_ARRAY_V(_f, _s, _n, _v)                         \
634 b6bd0bdc Juan Quintela
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint8, uint8_t)
635 b6bd0bdc Juan Quintela
636 b6bd0bdc Juan Quintela
#define VMSTATE_UINT8_ARRAY(_f, _s, _n)                               \
637 b6bd0bdc Juan Quintela
    VMSTATE_UINT8_ARRAY_V(_f, _s, _n, 0)
638 b6bd0bdc Juan Quintela
639 f752a6aa Juan Quintela
#define VMSTATE_UINT32_ARRAY_V(_f, _s, _n, _v)                        \
640 f752a6aa Juan Quintela
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint32, uint32_t)
641 f752a6aa Juan Quintela
642 f752a6aa Juan Quintela
#define VMSTATE_UINT32_ARRAY(_f, _s, _n)                              \
643 f752a6aa Juan Quintela
    VMSTATE_UINT32_ARRAY_V(_f, _s, _n, 0)
644 f752a6aa Juan Quintela
645 80a04bbe Juan Quintela
#define VMSTATE_UINT64_ARRAY_V(_f, _s, _n, _v)                        \
646 80a04bbe Juan Quintela
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint64, uint64_t)
647 80a04bbe Juan Quintela
648 80a04bbe Juan Quintela
#define VMSTATE_UINT64_ARRAY(_f, _s, _n)                              \
649 80a04bbe Juan Quintela
    VMSTATE_UINT64_ARRAY_V(_f, _s, _n, 0)
650 80a04bbe Juan Quintela
651 289070c7 Juan Quintela
#define VMSTATE_INT16_ARRAY_V(_f, _s, _n, _v)                         \
652 289070c7 Juan Quintela
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_int16, int16_t)
653 289070c7 Juan Quintela
654 289070c7 Juan Quintela
#define VMSTATE_INT16_ARRAY(_f, _s, _n)                               \
655 289070c7 Juan Quintela
    VMSTATE_INT16_ARRAY_V(_f, _s, _n, 0)
656 289070c7 Juan Quintela
657 f752a6aa Juan Quintela
#define VMSTATE_INT32_ARRAY_V(_f, _s, _n, _v)                         \
658 f752a6aa Juan Quintela
    VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_int32, int32_t)
659 f752a6aa Juan Quintela
660 f752a6aa Juan Quintela
#define VMSTATE_INT32_ARRAY(_f, _s, _n)                               \
661 f752a6aa Juan Quintela
    VMSTATE_INT32_ARRAY_V(_f, _s, _n, 0)
662 f752a6aa Juan Quintela
663 9ba2f660 Juan Quintela
#define VMSTATE_UINT32_SUB_ARRAY(_f, _s, _start, _num)                \
664 9ba2f660 Juan Quintela
    VMSTATE_SUB_ARRAY(_f, _s, _start, _num, 0, vmstate_info_uint32, uint32_t)
665 9ba2f660 Juan Quintela
666 9ba2f660 Juan Quintela
#define VMSTATE_UINT32_ARRAY(_f, _s, _n)                              \
667 9ba2f660 Juan Quintela
    VMSTATE_UINT32_ARRAY_V(_f, _s, _n, 0)
668 9ba2f660 Juan Quintela
669 6f67c50f Juan Quintela
#define VMSTATE_BUFFER_V(_f, _s, _v)                                  \
670 b2e15099 Juan Quintela
    VMSTATE_STATIC_BUFFER(_f, _s, _v, NULL, 0, sizeof(typeof_field(_s, _f)))
671 6f67c50f Juan Quintela
672 6f67c50f Juan Quintela
#define VMSTATE_BUFFER(_f, _s)                                        \
673 b2e15099 Juan Quintela
    VMSTATE_BUFFER_V(_f, _s, 0)
674 b2e15099 Juan Quintela
675 b2e15099 Juan Quintela
#define VMSTATE_PARTIAL_BUFFER(_f, _s, _size)                         \
676 b2e15099 Juan Quintela
    VMSTATE_STATIC_BUFFER(_f, _s, 0, NULL, 0, _size)
677 b2e15099 Juan Quintela
678 b2e15099 Juan Quintela
#define VMSTATE_BUFFER_START_MIDDLE(_f, _s, _start) \
679 b2e15099 Juan Quintela
    VMSTATE_STATIC_BUFFER(_f, _s, 0, NULL, _start, sizeof(typeof_field(_s, _f)))
680 6f67c50f Juan Quintela
681 b2e15099 Juan Quintela
#define VMSTATE_BUFFER_TEST(_f, _s, _test)                            \
682 b2e15099 Juan Quintela
    VMSTATE_STATIC_BUFFER(_f, _s, 0, _test, 0, sizeof(typeof_field(_s, _f)))
683 25dc563b Juan Quintela
684 9cae69bd Isaku Yamahata
#define VMSTATE_BUFFER_UNSAFE(_field, _state, _version, _size)        \
685 9cae69bd Isaku Yamahata
    VMSTATE_BUFFER_UNSAFE_INFO(_field, _state, _version, vmstate_info_buffer, _size)
686 9cae69bd Isaku Yamahata
687 76507c75 Juan Quintela
#define VMSTATE_UNUSED_V(_v, _size)                                   \
688 76507c75 Juan Quintela
    VMSTATE_UNUSED_BUFFER(NULL, _v, _size)
689 76507c75 Juan Quintela
690 76507c75 Juan Quintela
#define VMSTATE_UNUSED(_size)                                         \
691 76507c75 Juan Quintela
    VMSTATE_UNUSED_V(0, _size)
692 76507c75 Juan Quintela
693 76507c75 Juan Quintela
#define VMSTATE_UNUSED_TEST(_test, _size)                             \
694 76507c75 Juan Quintela
    VMSTATE_UNUSED_BUFFER(_test, 0, _size)
695 76507c75 Juan Quintela
696 f89a8e4e Juan Quintela
#ifdef NEED_CPU_H
697 f89a8e4e Juan Quintela
#if TARGET_LONG_BITS == 64
698 f89a8e4e Juan Quintela
#define VMSTATE_UINTTL_V(_f, _s, _v)                                  \
699 f89a8e4e Juan Quintela
    VMSTATE_UINT64_V(_f, _s, _v)
700 f89a8e4e Juan Quintela
#define VMSTATE_UINTTL_ARRAY_V(_f, _s, _n, _v)                        \
701 f89a8e4e Juan Quintela
    VMSTATE_UINT64_ARRAY_V(_f, _s, _n, _v)
702 f89a8e4e Juan Quintela
#else
703 f89a8e4e Juan Quintela
#define VMSTATE_UINTTL_V(_f, _s, _v)                                  \
704 f89a8e4e Juan Quintela
    VMSTATE_UINT32_V(_f, _s, _v)
705 f89a8e4e Juan Quintela
#define VMSTATE_UINTTL_ARRAY_V(_f, _s, _n, _v)                        \
706 f89a8e4e Juan Quintela
    VMSTATE_UINT32_ARRAY_V(_f, _s, _n, _v)
707 f89a8e4e Juan Quintela
#endif
708 f89a8e4e Juan Quintela
#define VMSTATE_UINTTL(_f, _s)                                        \
709 f89a8e4e Juan Quintela
    VMSTATE_UINTTL_V(_f, _s, 0)
710 f89a8e4e Juan Quintela
#define VMSTATE_UINTTL_ARRAY(_f, _s, _n)                              \
711 f89a8e4e Juan Quintela
    VMSTATE_UINTTL_ARRAY_V(_f, _s, _n, 0)
712 f89a8e4e Juan Quintela
713 f89a8e4e Juan Quintela
#endif
714 f89a8e4e Juan Quintela
715 9ed7d6ae Juan Quintela
#define VMSTATE_END_OF_LIST()                                         \
716 9ed7d6ae Juan Quintela
    {}
717 9ed7d6ae Juan Quintela
718 9ed7d6ae Juan Quintela
extern int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
719 9ed7d6ae Juan Quintela
                              void *opaque, int version_id);
720 9ed7d6ae Juan Quintela
extern void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
721 84e2e3eb Juan Quintela
                               void *opaque);
722 9ed7d6ae Juan Quintela
extern int vmstate_register(int instance_id, const VMStateDescription *vmsd,
723 9ed7d6ae Juan Quintela
                            void *base);
724 1eb7538b Juan Quintela
void vmstate_unregister(const VMStateDescription *vmsd, void *opaque);
725 87ecb68b pbrook
#endif