vmstate.h 29 KB

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