vmstate.h 29 KB

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