]> git.proxmox.com Git - qemu.git/blame - savevm.c
Store the data to send also in iovec
[qemu.git] / savevm.c
CommitLineData
a672b469
AL
1/*
2 * QEMU System Emulator
3 *
4 * Copyright (c) 2003-2008 Fabrice Bellard
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
a672b469 24
d40cdb10 25#include "config-host.h"
511d2b14
BS
26#include "qemu-common.h"
27#include "hw/hw.h"
7685ee6a 28#include "hw/qdev.h"
1422e32d 29#include "net/net.h"
83c9089e 30#include "monitor/monitor.h"
9c17d615 31#include "sysemu/sysemu.h"
1de7afc9 32#include "qemu/timer.h"
511d2b14 33#include "audio/audio.h"
caf71f86 34#include "migration/migration.h"
1de7afc9
PB
35#include "qemu/sockets.h"
36#include "qemu/queue.h"
9c17d615 37#include "sysemu/cpus.h"
022c62cb 38#include "exec/memory.h"
a7ae8355 39#include "qmp-commands.h"
517a13c9 40#include "trace.h"
1de7afc9 41#include "qemu/bitops.h"
28085f7b 42#include "qemu/iov.h"
511d2b14 43
a672b469 44#define SELF_ANNOUNCE_ROUNDS 5
a672b469 45
18995b98 46#ifndef ETH_P_RARP
f8778a77 47#define ETH_P_RARP 0x8035
18995b98
N
48#endif
49#define ARP_HTYPE_ETH 0x0001
50#define ARP_PTYPE_IP 0x0800
51#define ARP_OP_REQUEST_REV 0x3
52
53static int announce_self_create(uint8_t *buf,
a672b469
AL
54 uint8_t *mac_addr)
55{
18995b98
N
56 /* Ethernet header. */
57 memset(buf, 0xff, 6); /* destination MAC addr */
58 memcpy(buf + 6, mac_addr, 6); /* source MAC addr */
59 *(uint16_t *)(buf + 12) = htons(ETH_P_RARP); /* ethertype */
60
61 /* RARP header. */
62 *(uint16_t *)(buf + 14) = htons(ARP_HTYPE_ETH); /* hardware addr space */
63 *(uint16_t *)(buf + 16) = htons(ARP_PTYPE_IP); /* protocol addr space */
64 *(buf + 18) = 6; /* hardware addr length (ethernet) */
65 *(buf + 19) = 4; /* protocol addr length (IPv4) */
66 *(uint16_t *)(buf + 20) = htons(ARP_OP_REQUEST_REV); /* opcode */
67 memcpy(buf + 22, mac_addr, 6); /* source hw addr */
68 memset(buf + 28, 0x00, 4); /* source protocol addr */
69 memcpy(buf + 32, mac_addr, 6); /* target hw addr */
70 memset(buf + 38, 0x00, 4); /* target protocol addr */
71
72 /* Padding to get up to 60 bytes (ethernet min packet size, minus FCS). */
73 memset(buf + 42, 0x00, 18);
74
75 return 60; /* len (FCS will be added by hardware) */
a672b469
AL
76}
77
f401ca22 78static void qemu_announce_self_iter(NICState *nic, void *opaque)
a672b469 79{
18995b98 80 uint8_t buf[60];
f401ca22
MM
81 int len;
82
83 len = announce_self_create(buf, nic->conf->macaddr.a);
84
b356f76d 85 qemu_send_packet_raw(qemu_get_queue(nic), buf, len);
f401ca22
MM
86}
87
88
89static void qemu_announce_self_once(void *opaque)
90{
ed8b330b
GN
91 static int count = SELF_ANNOUNCE_ROUNDS;
92 QEMUTimer *timer = *(QEMUTimer **)opaque;
a672b469 93
f401ca22
MM
94 qemu_foreach_nic(qemu_announce_self_iter, NULL);
95
18995b98
N
96 if (--count) {
97 /* delay 50ms, 150ms, 250ms, ... */
7bd427d8 98 qemu_mod_timer(timer, qemu_get_clock_ms(rt_clock) +
18995b98 99 50 + (SELF_ANNOUNCE_ROUNDS - count - 1) * 100);
ed8b330b
GN
100 } else {
101 qemu_del_timer(timer);
102 qemu_free_timer(timer);
103 }
104}
105
106void qemu_announce_self(void)
107{
108 static QEMUTimer *timer;
7bd427d8 109 timer = qemu_new_timer_ms(rt_clock, qemu_announce_self_once, &timer);
ed8b330b 110 qemu_announce_self_once(&timer);
a672b469
AL
111}
112
113/***********************************************************/
114/* savevm/loadvm support */
115
116#define IO_BUF_SIZE 32768
b3ea2bdb 117#define MAX_IOV_SIZE MIN(IOV_MAX, 64)
a672b469
AL
118
119struct QEMUFile {
9229bf3c 120 const QEMUFileOps *ops;
a672b469
AL
121 void *opaque;
122 int is_write;
123
1964a397
PB
124 int64_t bytes_xfer;
125 int64_t xfer_limit;
126
3f2d38fa
PB
127 int64_t pos; /* start of buffer when writing, end of buffer
128 when reading */
a672b469
AL
129 int buf_index;
130 int buf_size; /* 0 when writing */
131 uint8_t buf[IO_BUF_SIZE];
132
b3ea2bdb
OW
133 struct iovec iov[MAX_IOV_SIZE];
134 unsigned int iovcnt;
135
3961b4dd 136 int last_error;
a672b469
AL
137};
138
7f79dd28 139typedef struct QEMUFileStdio
a672b469 140{
7f79dd28 141 FILE *stdio_file;
a672b469 142 QEMUFile *file;
7f79dd28 143} QEMUFileStdio;
a672b469
AL
144
145typedef struct QEMUFileSocket
146{
147 int fd;
148 QEMUFile *file;
149} QEMUFileSocket;
150
d7cd3694
SH
151typedef struct {
152 Coroutine *co;
153 int fd;
154} FDYieldUntilData;
155
156static void fd_coroutine_enter(void *opaque)
157{
158 FDYieldUntilData *data = opaque;
159 qemu_set_fd_handler(data->fd, NULL, NULL, NULL);
160 qemu_coroutine_enter(data->co, NULL);
161}
162
163/**
164 * Yield until a file descriptor becomes readable
165 *
166 * Note that this function clobbers the handlers for the file descriptor.
167 */
168static void coroutine_fn yield_until_fd_readable(int fd)
169{
170 FDYieldUntilData data;
171
172 assert(qemu_in_coroutine());
173 data.co = qemu_coroutine_self();
174 data.fd = fd;
175 qemu_set_fd_handler(fd, fd_coroutine_enter, NULL, &data);
176 qemu_coroutine_yield();
177}
178
28085f7b
OW
179static ssize_t socket_writev_buffer(void *opaque, struct iovec *iov, int iovcnt)
180{
181 QEMUFileSocket *s = opaque;
182 ssize_t len;
183 ssize_t size = iov_size(iov, iovcnt);
184
185 len = iov_send(s->fd, iov, iovcnt, 0, size);
186 if (len < size) {
187 len = -socket_error();
188 }
189 return len;
190}
191
70eb6330
PB
192static int socket_get_fd(void *opaque)
193{
194 QEMUFileSocket *s = opaque;
195
196 return s->fd;
197}
198
a672b469
AL
199static int socket_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
200{
201 QEMUFileSocket *s = opaque;
202 ssize_t len;
203
595ab641 204 for (;;) {
00aa0040 205 len = qemu_recv(s->fd, buf, size, 0);
595ab641
PB
206 if (len != -1) {
207 break;
208 }
209 if (socket_error() == EAGAIN) {
d7cd3694 210 yield_until_fd_readable(s->fd);
595ab641
PB
211 } else if (socket_error() != EINTR) {
212 break;
213 }
214 }
a672b469 215
595ab641 216 if (len == -1) {
a672b469 217 len = -socket_error();
595ab641 218 }
a672b469
AL
219 return len;
220}
221
0cc3f3cc
PB
222static int socket_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size)
223{
224 QEMUFileSocket *s = opaque;
225 ssize_t len;
226
227 len = qemu_send_full(s->fd, buf, size, 0);
228 if (len < size) {
229 len = -socket_error();
230 }
231 return len;
232}
233
a672b469
AL
234static int socket_close(void *opaque)
235{
236 QEMUFileSocket *s = opaque;
ab52a824 237 closesocket(s->fd);
7267c094 238 g_free(s);
a672b469
AL
239 return 0;
240}
241
70eb6330
PB
242static int stdio_get_fd(void *opaque)
243{
244 QEMUFileStdio *s = opaque;
245
246 return fileno(s->stdio_file);
247}
248
7f79dd28 249static int stdio_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size)
a672b469 250{
7f79dd28
PB
251 QEMUFileStdio *s = opaque;
252 return fwrite(buf, 1, size, s->stdio_file);
a672b469
AL
253}
254
7f79dd28 255static int stdio_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
a672b469 256{
7f79dd28
PB
257 QEMUFileStdio *s = opaque;
258 FILE *fp = s->stdio_file;
8a67ec4d
UL
259 int bytes;
260
595ab641 261 for (;;) {
8a67ec4d
UL
262 clearerr(fp);
263 bytes = fread(buf, 1, size, fp);
595ab641
PB
264 if (bytes != 0 || !ferror(fp)) {
265 break;
266 }
267 if (errno == EAGAIN) {
d7cd3694 268 yield_until_fd_readable(fileno(fp));
595ab641
PB
269 } else if (errno != EINTR) {
270 break;
271 }
272 }
8a67ec4d 273 return bytes;
a672b469
AL
274}
275
7f79dd28
PB
276static int stdio_pclose(void *opaque)
277{
278 QEMUFileStdio *s = opaque;
41ef56e6
AL
279 int ret;
280 ret = pclose(s->stdio_file);
26f1af0a
EH
281 if (ret == -1) {
282 ret = -errno;
13c7b2da
PB
283 } else if (!WIFEXITED(ret) || WEXITSTATUS(ret) != 0) {
284 /* close succeeded, but non-zero exit code: */
285 ret = -EIO; /* fake errno value */
26f1af0a 286 }
7267c094 287 g_free(s);
41ef56e6 288 return ret;
7f79dd28
PB
289}
290
291static int stdio_fclose(void *opaque)
a672b469 292{
7f79dd28 293 QEMUFileStdio *s = opaque;
0e286705 294 int ret = 0;
ce39ee31
PB
295
296 if (s->file->ops->put_buffer) {
297 int fd = fileno(s->stdio_file);
298 struct stat st;
299
300 ret = fstat(fd, &st);
301 if (ret == 0 && S_ISREG(st.st_mode)) {
302 /*
303 * If the file handle is a regular file make sure the
304 * data is flushed to disk before signaling success.
305 */
306 ret = fsync(fd);
307 if (ret != 0) {
308 ret = -errno;
309 return ret;
310 }
311 }
312 }
0e286705
EH
313 if (fclose(s->stdio_file) == EOF) {
314 ret = -errno;
315 }
7267c094 316 g_free(s);
0e286705 317 return ret;
a672b469
AL
318}
319
9229bf3c 320static const QEMUFileOps stdio_pipe_read_ops = {
70eb6330 321 .get_fd = stdio_get_fd,
9229bf3c
PB
322 .get_buffer = stdio_get_buffer,
323 .close = stdio_pclose
324};
325
326static const QEMUFileOps stdio_pipe_write_ops = {
70eb6330 327 .get_fd = stdio_get_fd,
9229bf3c
PB
328 .put_buffer = stdio_put_buffer,
329 .close = stdio_pclose
330};
331
817b9ed5 332QEMUFile *qemu_popen_cmd(const char *command, const char *mode)
a672b469 333{
817b9ed5 334 FILE *stdio_file;
7f79dd28 335 QEMUFileStdio *s;
a672b469 336
817b9ed5
PB
337 stdio_file = popen(command, mode);
338 if (stdio_file == NULL) {
339 return NULL;
340 }
341
342 if (mode == NULL || (mode[0] != 'r' && mode[0] != 'w') || mode[1] != 0) {
a672b469
AL
343 fprintf(stderr, "qemu_popen: Argument validity check failed\n");
344 return NULL;
345 }
346
7267c094 347 s = g_malloc0(sizeof(QEMUFileStdio));
a672b469 348
7f79dd28 349 s->stdio_file = stdio_file;
a672b469
AL
350
351 if(mode[0] == 'r') {
9229bf3c 352 s->file = qemu_fopen_ops(s, &stdio_pipe_read_ops);
a672b469 353 } else {
9229bf3c 354 s->file = qemu_fopen_ops(s, &stdio_pipe_write_ops);
a672b469 355 }
a672b469
AL
356 return s->file;
357}
358
9229bf3c 359static const QEMUFileOps stdio_file_read_ops = {
70eb6330 360 .get_fd = stdio_get_fd,
9229bf3c
PB
361 .get_buffer = stdio_get_buffer,
362 .close = stdio_fclose
363};
364
365static const QEMUFileOps stdio_file_write_ops = {
70eb6330 366 .get_fd = stdio_get_fd,
9229bf3c
PB
367 .put_buffer = stdio_put_buffer,
368 .close = stdio_fclose
369};
370
5ac1fad3
PB
371QEMUFile *qemu_fdopen(int fd, const char *mode)
372{
373 QEMUFileStdio *s;
374
375 if (mode == NULL ||
376 (mode[0] != 'r' && mode[0] != 'w') ||
377 mode[1] != 'b' || mode[2] != 0) {
378 fprintf(stderr, "qemu_fdopen: Argument validity check failed\n");
379 return NULL;
380 }
381
7267c094 382 s = g_malloc0(sizeof(QEMUFileStdio));
5ac1fad3
PB
383 s->stdio_file = fdopen(fd, mode);
384 if (!s->stdio_file)
385 goto fail;
386
387 if(mode[0] == 'r') {
9229bf3c 388 s->file = qemu_fopen_ops(s, &stdio_file_read_ops);
5ac1fad3 389 } else {
9229bf3c 390 s->file = qemu_fopen_ops(s, &stdio_file_write_ops);
5ac1fad3
PB
391 }
392 return s->file;
393
394fail:
7267c094 395 g_free(s);
5ac1fad3
PB
396 return NULL;
397}
398
9229bf3c 399static const QEMUFileOps socket_read_ops = {
70eb6330 400 .get_fd = socket_get_fd,
9229bf3c
PB
401 .get_buffer = socket_get_buffer,
402 .close = socket_close
403};
404
0cc3f3cc
PB
405static const QEMUFileOps socket_write_ops = {
406 .get_fd = socket_get_fd,
407 .put_buffer = socket_put_buffer,
28085f7b 408 .writev_buffer = socket_writev_buffer,
0cc3f3cc
PB
409 .close = socket_close
410};
411
412QEMUFile *qemu_fopen_socket(int fd, const char *mode)
a672b469 413{
7267c094 414 QEMUFileSocket *s = g_malloc0(sizeof(QEMUFileSocket));
a672b469 415
0cc3f3cc
PB
416 if (mode == NULL ||
417 (mode[0] != 'r' && mode[0] != 'w') ||
418 mode[1] != 'b' || mode[2] != 0) {
419 fprintf(stderr, "qemu_fopen: Argument validity check failed\n");
420 return NULL;
421 }
422
a672b469 423 s->fd = fd;
0cc3f3cc 424 if (mode[0] == 'w') {
f8bbc128 425 socket_set_block(s->fd);
0cc3f3cc
PB
426 s->file = qemu_fopen_ops(s, &socket_write_ops);
427 } else {
428 s->file = qemu_fopen_ops(s, &socket_read_ops);
429 }
a672b469
AL
430 return s->file;
431}
432
a672b469
AL
433QEMUFile *qemu_fopen(const char *filename, const char *mode)
434{
435 QEMUFileStdio *s;
436
7f79dd28
PB
437 if (mode == NULL ||
438 (mode[0] != 'r' && mode[0] != 'w') ||
439 mode[1] != 'b' || mode[2] != 0) {
090414a3 440 fprintf(stderr, "qemu_fopen: Argument validity check failed\n");
7f79dd28
PB
441 return NULL;
442 }
443
7267c094 444 s = g_malloc0(sizeof(QEMUFileStdio));
a672b469 445
7f79dd28
PB
446 s->stdio_file = fopen(filename, mode);
447 if (!s->stdio_file)
a672b469 448 goto fail;
c163b5ca 449
7f79dd28 450 if(mode[0] == 'w') {
9229bf3c 451 s->file = qemu_fopen_ops(s, &stdio_file_write_ops);
7f79dd28 452 } else {
9229bf3c 453 s->file = qemu_fopen_ops(s, &stdio_file_read_ops);
7f79dd28
PB
454 }
455 return s->file;
a672b469 456fail:
7267c094 457 g_free(s);
a672b469
AL
458 return NULL;
459}
460
178e08a5 461static int block_put_buffer(void *opaque, const uint8_t *buf,
a672b469
AL
462 int64_t pos, int size)
463{
45566e9c 464 bdrv_save_vmstate(opaque, buf, pos, size);
a672b469
AL
465 return size;
466}
467
178e08a5 468static int block_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
a672b469 469{
45566e9c 470 return bdrv_load_vmstate(opaque, buf, pos, size);
a672b469
AL
471}
472
473static int bdrv_fclose(void *opaque)
474{
ad492c92 475 return bdrv_flush(opaque);
a672b469
AL
476}
477
9229bf3c
PB
478static const QEMUFileOps bdrv_read_ops = {
479 .get_buffer = block_get_buffer,
480 .close = bdrv_fclose
481};
482
483static const QEMUFileOps bdrv_write_ops = {
484 .put_buffer = block_put_buffer,
485 .close = bdrv_fclose
486};
487
45566e9c 488static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int is_writable)
a672b469 489{
a672b469 490 if (is_writable)
9229bf3c
PB
491 return qemu_fopen_ops(bs, &bdrv_write_ops);
492 return qemu_fopen_ops(bs, &bdrv_read_ops);
a672b469
AL
493}
494
9229bf3c 495QEMUFile *qemu_fopen_ops(void *opaque, const QEMUFileOps *ops)
a672b469
AL
496{
497 QEMUFile *f;
498
7267c094 499 f = g_malloc0(sizeof(QEMUFile));
a672b469
AL
500
501 f->opaque = opaque;
9229bf3c 502 f->ops = ops;
a672b469 503 f->is_write = 0;
a672b469
AL
504 return f;
505}
506
624b9cc2 507int qemu_file_get_error(QEMUFile *f)
a672b469 508{
3961b4dd 509 return f->last_error;
a672b469
AL
510}
511
05f28b83 512static void qemu_file_set_error(QEMUFile *f, int ret)
4dabe248 513{
afe41931
JQ
514 if (f->last_error == 0) {
515 f->last_error = ret;
516 }
4dabe248
AL
517}
518
d82ca915
EH
519/** Flushes QEMUFile buffer
520 *
d82ca915 521 */
05f28b83 522static void qemu_fflush(QEMUFile *f)
a672b469 523{
7311bea3
JQ
524 int ret = 0;
525
93bf2104
PB
526 if (!f->ops->put_buffer) {
527 return;
528 }
a672b469 529 if (f->is_write && f->buf_index > 0) {
3f2d38fa 530 ret = f->ops->put_buffer(f->opaque, f->buf, f->pos, f->buf_index);
7311bea3 531 if (ret >= 0) {
3f2d38fa 532 f->pos += f->buf_index;
7311bea3 533 }
a672b469 534 f->buf_index = 0;
b3ea2bdb 535 f->iovcnt = 0;
a672b469 536 }
93bf2104
PB
537 if (ret < 0) {
538 qemu_file_set_error(f, ret);
539 }
a672b469
AL
540}
541
542static void qemu_fill_buffer(QEMUFile *f)
543{
544 int len;
0046c45b 545 int pending;
a672b469 546
9229bf3c 547 if (!f->ops->get_buffer)
a672b469
AL
548 return;
549
550 if (f->is_write)
551 abort();
552
0046c45b
JQ
553 pending = f->buf_size - f->buf_index;
554 if (pending > 0) {
555 memmove(f->buf, f->buf + f->buf_index, pending);
556 }
557 f->buf_index = 0;
558 f->buf_size = pending;
559
3f2d38fa 560 len = f->ops->get_buffer(f->opaque, f->buf + pending, f->pos,
0046c45b 561 IO_BUF_SIZE - pending);
a672b469 562 if (len > 0) {
0046c45b 563 f->buf_size += len;
3f2d38fa 564 f->pos += len;
fa39a30f 565 } else if (len == 0) {
02c4a051 566 qemu_file_set_error(f, -EIO);
a672b469 567 } else if (len != -EAGAIN)
c29110d5 568 qemu_file_set_error(f, len);
a672b469
AL
569}
570
70eb6330
PB
571int qemu_get_fd(QEMUFile *f)
572{
573 if (f->ops->get_fd) {
574 return f->ops->get_fd(f->opaque);
575 }
576 return -1;
577}
578
d82ca915
EH
579/** Closes the file
580 *
581 * Returns negative error value if any error happened on previous operations or
582 * while closing the file. Returns 0 or positive number on success.
583 *
584 * The meaning of return value on success depends on the specific backend
585 * being used.
586 */
587int qemu_fclose(QEMUFile *f)
588{
29eee86f 589 int ret;
93bf2104
PB
590 qemu_fflush(f);
591 ret = qemu_file_get_error(f);
7311bea3 592
9229bf3c
PB
593 if (f->ops->close) {
594 int ret2 = f->ops->close(f->opaque);
29eee86f
JQ
595 if (ret >= 0) {
596 ret = ret2;
597 }
7311bea3 598 }
d82ca915
EH
599 /* If any error was spotted before closing, we should report it
600 * instead of the close() return value.
601 */
602 if (f->last_error) {
603 ret = f->last_error;
604 }
7267c094 605 g_free(f);
a672b469
AL
606 return ret;
607}
608
b3ea2bdb
OW
609static void add_to_iovec(QEMUFile *f, const uint8_t *buf, int size)
610{
611 /* check for adjacent buffer and coalesce them */
612 if (f->iovcnt > 0 && buf == f->iov[f->iovcnt - 1].iov_base +
613 f->iov[f->iovcnt - 1].iov_len) {
614 f->iov[f->iovcnt - 1].iov_len += size;
615 } else {
616 f->iov[f->iovcnt].iov_base = (uint8_t *)buf;
617 f->iov[f->iovcnt++].iov_len = size;
618 }
619}
620
a672b469
AL
621void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
622{
623 int l;
624
c10682cb
JQ
625 if (f->last_error) {
626 return;
627 }
628
629 if (f->is_write == 0 && f->buf_index > 0) {
a672b469
AL
630 fprintf(stderr,
631 "Attempted to write to buffer while read buffer is not empty\n");
632 abort();
633 }
634
c10682cb 635 while (size > 0) {
a672b469
AL
636 l = IO_BUF_SIZE - f->buf_index;
637 if (l > size)
638 l = size;
639 memcpy(f->buf + f->buf_index, buf, l);
b3ea2bdb 640 add_to_iovec(f, f->buf + f->buf_index, l);
a672b469
AL
641 f->is_write = 1;
642 f->buf_index += l;
1964a397 643 f->bytes_xfer += l;
a672b469
AL
644 buf += l;
645 size -= l;
b3ea2bdb 646 if (f->buf_index >= IO_BUF_SIZE || f->iovcnt >= MAX_IOV_SIZE) {
93bf2104
PB
647 qemu_fflush(f);
648 if (qemu_file_get_error(f)) {
c10682cb
JQ
649 break;
650 }
7311bea3 651 }
a672b469
AL
652 }
653}
654
655void qemu_put_byte(QEMUFile *f, int v)
656{
c10682cb
JQ
657 if (f->last_error) {
658 return;
659 }
660
661 if (f->is_write == 0 && f->buf_index > 0) {
a672b469
AL
662 fprintf(stderr,
663 "Attempted to write to buffer while read buffer is not empty\n");
664 abort();
665 }
666
667 f->buf[f->buf_index++] = v;
668 f->is_write = 1;
7d8a30bb
OW
669 f->bytes_xfer++;
670
b3ea2bdb
OW
671 add_to_iovec(f, f->buf + (f->buf_index - 1), 1);
672
673 if (f->buf_index >= IO_BUF_SIZE || f->iovcnt >= MAX_IOV_SIZE) {
93bf2104 674 qemu_fflush(f);
7311bea3 675 }
a672b469
AL
676}
677
c6380724 678static void qemu_file_skip(QEMUFile *f, int size)
a672b469 679{
c6380724
JQ
680 if (f->buf_index + size <= f->buf_size) {
681 f->buf_index += size;
682 }
683}
684
685static int qemu_peek_buffer(QEMUFile *f, uint8_t *buf, int size, size_t offset)
a672b469 686{
c6380724
JQ
687 int pending;
688 int index;
a672b469 689
b9ce1454 690 if (f->is_write) {
a672b469 691 abort();
b9ce1454 692 }
a672b469 693
c6380724
JQ
694 index = f->buf_index + offset;
695 pending = f->buf_size - index;
696 if (pending < size) {
697 qemu_fill_buffer(f);
698 index = f->buf_index + offset;
699 pending = f->buf_size - index;
700 }
701
702 if (pending <= 0) {
703 return 0;
704 }
705 if (size > pending) {
706 size = pending;
707 }
708
709 memcpy(buf, f->buf + index, size);
710 return size;
711}
712
713int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size)
714{
715 int pending = size;
716 int done = 0;
717
718 while (pending > 0) {
719 int res;
720
721 res = qemu_peek_buffer(f, buf, pending, 0);
722 if (res == 0) {
723 return done;
a672b469 724 }
c6380724
JQ
725 qemu_file_skip(f, res);
726 buf += res;
727 pending -= res;
728 done += res;
a672b469 729 }
c6380724 730 return done;
a672b469
AL
731}
732
c6380724 733static int qemu_peek_byte(QEMUFile *f, int offset)
811814bd 734{
c6380724
JQ
735 int index = f->buf_index + offset;
736
b9ce1454 737 if (f->is_write) {
811814bd 738 abort();
b9ce1454 739 }
811814bd 740
c6380724 741 if (index >= f->buf_size) {
811814bd 742 qemu_fill_buffer(f);
c6380724
JQ
743 index = f->buf_index + offset;
744 if (index >= f->buf_size) {
811814bd 745 return 0;
b9ce1454 746 }
811814bd 747 }
c6380724 748 return f->buf[index];
811814bd
JQ
749}
750
a672b469
AL
751int qemu_get_byte(QEMUFile *f)
752{
65f3bb3d 753 int result;
a672b469 754
c6380724
JQ
755 result = qemu_peek_byte(f, 0);
756 qemu_file_skip(f, 1);
65f3bb3d 757 return result;
a672b469
AL
758}
759
ad55ab42 760int64_t qemu_ftell(QEMUFile *f)
a672b469 761{
3f2d38fa
PB
762 qemu_fflush(f);
763 return f->pos;
a672b469
AL
764}
765
a672b469
AL
766int qemu_file_rate_limit(QEMUFile *f)
767{
1964a397
PB
768 if (qemu_file_get_error(f)) {
769 return 1;
770 }
771 if (f->xfer_limit > 0 && f->bytes_xfer > f->xfer_limit) {
772 return 1;
773 }
a672b469
AL
774 return 0;
775}
776
3d002df3 777int64_t qemu_file_get_rate_limit(QEMUFile *f)
c163b5ca 778{
1964a397 779 return f->xfer_limit;
c163b5ca 780}
781
1964a397 782void qemu_file_set_rate_limit(QEMUFile *f, int64_t limit)
19629537 783{
1964a397
PB
784 f->xfer_limit = limit;
785}
19629537 786
1964a397
PB
787void qemu_file_reset_rate_limit(QEMUFile *f)
788{
789 f->bytes_xfer = 0;
19629537
GC
790}
791
a672b469
AL
792void qemu_put_be16(QEMUFile *f, unsigned int v)
793{
794 qemu_put_byte(f, v >> 8);
795 qemu_put_byte(f, v);
796}
797
798void qemu_put_be32(QEMUFile *f, unsigned int v)
799{
800 qemu_put_byte(f, v >> 24);
801 qemu_put_byte(f, v >> 16);
802 qemu_put_byte(f, v >> 8);
803 qemu_put_byte(f, v);
804}
805
806void qemu_put_be64(QEMUFile *f, uint64_t v)
807{
808 qemu_put_be32(f, v >> 32);
809 qemu_put_be32(f, v);
810}
811
812unsigned int qemu_get_be16(QEMUFile *f)
813{
814 unsigned int v;
815 v = qemu_get_byte(f) << 8;
816 v |= qemu_get_byte(f);
817 return v;
818}
819
820unsigned int qemu_get_be32(QEMUFile *f)
821{
822 unsigned int v;
823 v = qemu_get_byte(f) << 24;
824 v |= qemu_get_byte(f) << 16;
825 v |= qemu_get_byte(f) << 8;
826 v |= qemu_get_byte(f);
827 return v;
828}
829
830uint64_t qemu_get_be64(QEMUFile *f)
831{
832 uint64_t v;
833 v = (uint64_t)qemu_get_be32(f) << 32;
834 v |= qemu_get_be32(f);
835 return v;
836}
837
2ff68d07
PB
838
839/* timer */
840
841void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
842{
843 uint64_t expire_time;
844
845 expire_time = qemu_timer_expire_time_ns(ts);
846 qemu_put_be64(f, expire_time);
847}
848
849void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
850{
851 uint64_t expire_time;
852
853 expire_time = qemu_get_be64(f);
854 if (expire_time != -1) {
855 qemu_mod_timer_ns(ts, expire_time);
856 } else {
857 qemu_del_timer(ts);
858 }
859}
860
861
cdae5cfb
GH
862/* bool */
863
864static int get_bool(QEMUFile *f, void *pv, size_t size)
865{
866 bool *v = pv;
867 *v = qemu_get_byte(f);
868 return 0;
869}
870
871static void put_bool(QEMUFile *f, void *pv, size_t size)
872{
873 bool *v = pv;
874 qemu_put_byte(f, *v);
875}
876
877const VMStateInfo vmstate_info_bool = {
878 .name = "bool",
879 .get = get_bool,
880 .put = put_bool,
881};
882
9ed7d6ae
JQ
883/* 8 bit int */
884
885static int get_int8(QEMUFile *f, void *pv, size_t size)
886{
887 int8_t *v = pv;
888 qemu_get_s8s(f, v);
889 return 0;
890}
891
84e2e3eb 892static void put_int8(QEMUFile *f, void *pv, size_t size)
9ed7d6ae 893{
84e2e3eb 894 int8_t *v = pv;
9ed7d6ae
JQ
895 qemu_put_s8s(f, v);
896}
897
898const VMStateInfo vmstate_info_int8 = {
899 .name = "int8",
900 .get = get_int8,
901 .put = put_int8,
902};
903
904/* 16 bit int */
905
906static int get_int16(QEMUFile *f, void *pv, size_t size)
907{
908 int16_t *v = pv;
909 qemu_get_sbe16s(f, v);
910 return 0;
911}
912
84e2e3eb 913static void put_int16(QEMUFile *f, void *pv, size_t size)
9ed7d6ae 914{
84e2e3eb 915 int16_t *v = pv;
9ed7d6ae
JQ
916 qemu_put_sbe16s(f, v);
917}
918
919const VMStateInfo vmstate_info_int16 = {
920 .name = "int16",
921 .get = get_int16,
922 .put = put_int16,
923};
924
925/* 32 bit int */
926
927static int get_int32(QEMUFile *f, void *pv, size_t size)
928{
929 int32_t *v = pv;
930 qemu_get_sbe32s(f, v);
931 return 0;
932}
933
84e2e3eb 934static void put_int32(QEMUFile *f, void *pv, size_t size)
9ed7d6ae 935{
84e2e3eb 936 int32_t *v = pv;
9ed7d6ae
JQ
937 qemu_put_sbe32s(f, v);
938}
939
940const VMStateInfo vmstate_info_int32 = {
941 .name = "int32",
942 .get = get_int32,
943 .put = put_int32,
944};
945
82501660
JQ
946/* 32 bit int. See that the received value is the same than the one
947 in the field */
948
949static int get_int32_equal(QEMUFile *f, void *pv, size_t size)
950{
951 int32_t *v = pv;
952 int32_t v2;
953 qemu_get_sbe32s(f, &v2);
954
955 if (*v == v2)
956 return 0;
957 return -EINVAL;
958}
959
960const VMStateInfo vmstate_info_int32_equal = {
961 .name = "int32 equal",
962 .get = get_int32_equal,
963 .put = put_int32,
964};
965
0a031e0a
JQ
966/* 32 bit int. See that the received value is the less or the same
967 than the one in the field */
968
969static int get_int32_le(QEMUFile *f, void *pv, size_t size)
970{
971 int32_t *old = pv;
972 int32_t new;
973 qemu_get_sbe32s(f, &new);
974
975 if (*old <= new)
976 return 0;
977 return -EINVAL;
978}
979
980const VMStateInfo vmstate_info_int32_le = {
981 .name = "int32 equal",
982 .get = get_int32_le,
983 .put = put_int32,
984};
985
9ed7d6ae
JQ
986/* 64 bit int */
987
988static int get_int64(QEMUFile *f, void *pv, size_t size)
989{
990 int64_t *v = pv;
991 qemu_get_sbe64s(f, v);
992 return 0;
993}
994
84e2e3eb 995static void put_int64(QEMUFile *f, void *pv, size_t size)
9ed7d6ae 996{
84e2e3eb 997 int64_t *v = pv;
9ed7d6ae
JQ
998 qemu_put_sbe64s(f, v);
999}
1000
1001const VMStateInfo vmstate_info_int64 = {
1002 .name = "int64",
1003 .get = get_int64,
1004 .put = put_int64,
1005};
1006
1007/* 8 bit unsigned int */
1008
1009static int get_uint8(QEMUFile *f, void *pv, size_t size)
1010{
1011 uint8_t *v = pv;
1012 qemu_get_8s(f, v);
1013 return 0;
1014}
1015
84e2e3eb 1016static void put_uint8(QEMUFile *f, void *pv, size_t size)
9ed7d6ae 1017{
84e2e3eb 1018 uint8_t *v = pv;
9ed7d6ae
JQ
1019 qemu_put_8s(f, v);
1020}
1021
1022const VMStateInfo vmstate_info_uint8 = {
1023 .name = "uint8",
1024 .get = get_uint8,
1025 .put = put_uint8,
1026};
1027
1028/* 16 bit unsigned int */
1029
1030static int get_uint16(QEMUFile *f, void *pv, size_t size)
1031{
1032 uint16_t *v = pv;
1033 qemu_get_be16s(f, v);
1034 return 0;
1035}
1036
84e2e3eb 1037static void put_uint16(QEMUFile *f, void *pv, size_t size)
9ed7d6ae 1038{
84e2e3eb 1039 uint16_t *v = pv;
9ed7d6ae
JQ
1040 qemu_put_be16s(f, v);
1041}
1042
1043const VMStateInfo vmstate_info_uint16 = {
1044 .name = "uint16",
1045 .get = get_uint16,
1046 .put = put_uint16,
1047};
1048
1049/* 32 bit unsigned int */
1050
1051static int get_uint32(QEMUFile *f, void *pv, size_t size)
1052{
1053 uint32_t *v = pv;
1054 qemu_get_be32s(f, v);
1055 return 0;
1056}
1057
84e2e3eb 1058static void put_uint32(QEMUFile *f, void *pv, size_t size)
9ed7d6ae 1059{
84e2e3eb 1060 uint32_t *v = pv;
9ed7d6ae
JQ
1061 qemu_put_be32s(f, v);
1062}
1063
1064const VMStateInfo vmstate_info_uint32 = {
1065 .name = "uint32",
1066 .get = get_uint32,
1067 .put = put_uint32,
1068};
1069
9122a8fe
JQ
1070/* 32 bit uint. See that the received value is the same than the one
1071 in the field */
1072
1073static int get_uint32_equal(QEMUFile *f, void *pv, size_t size)
1074{
1075 uint32_t *v = pv;
1076 uint32_t v2;
1077 qemu_get_be32s(f, &v2);
1078
1079 if (*v == v2) {
1080 return 0;
1081 }
1082 return -EINVAL;
1083}
1084
1085const VMStateInfo vmstate_info_uint32_equal = {
1086 .name = "uint32 equal",
1087 .get = get_uint32_equal,
1088 .put = put_uint32,
1089};
1090
9ed7d6ae
JQ
1091/* 64 bit unsigned int */
1092
1093static int get_uint64(QEMUFile *f, void *pv, size_t size)
1094{
1095 uint64_t *v = pv;
1096 qemu_get_be64s(f, v);
1097 return 0;
1098}
1099
84e2e3eb 1100static void put_uint64(QEMUFile *f, void *pv, size_t size)
9ed7d6ae 1101{
84e2e3eb 1102 uint64_t *v = pv;
9ed7d6ae
JQ
1103 qemu_put_be64s(f, v);
1104}
1105
1106const VMStateInfo vmstate_info_uint64 = {
1107 .name = "uint64",
1108 .get = get_uint64,
1109 .put = put_uint64,
1110};
1111
e344b8a1
DG
1112/* 64 bit unsigned int. See that the received value is the same than the one
1113 in the field */
1114
1115static int get_uint64_equal(QEMUFile *f, void *pv, size_t size)
1116{
1117 uint64_t *v = pv;
1118 uint64_t v2;
1119 qemu_get_be64s(f, &v2);
1120
1121 if (*v == v2) {
1122 return 0;
1123 }
1124 return -EINVAL;
1125}
1126
1127const VMStateInfo vmstate_info_uint64_equal = {
1128 .name = "int64 equal",
1129 .get = get_uint64_equal,
1130 .put = put_uint64,
1131};
1132
80cd83e7
JQ
1133/* 8 bit int. See that the received value is the same than the one
1134 in the field */
1135
1136static int get_uint8_equal(QEMUFile *f, void *pv, size_t size)
1137{
1138 uint8_t *v = pv;
1139 uint8_t v2;
1140 qemu_get_8s(f, &v2);
1141
1142 if (*v == v2)
1143 return 0;
1144 return -EINVAL;
1145}
1146
1147const VMStateInfo vmstate_info_uint8_equal = {
aa1cce69 1148 .name = "uint8 equal",
80cd83e7
JQ
1149 .get = get_uint8_equal,
1150 .put = put_uint8,
1151};
1152
dc3b83a0
JQ
1153/* 16 bit unsigned int int. See that the received value is the same than the one
1154 in the field */
1155
1156static int get_uint16_equal(QEMUFile *f, void *pv, size_t size)
1157{
1158 uint16_t *v = pv;
1159 uint16_t v2;
1160 qemu_get_be16s(f, &v2);
1161
1162 if (*v == v2)
1163 return 0;
1164 return -EINVAL;
1165}
1166
1167const VMStateInfo vmstate_info_uint16_equal = {
1168 .name = "uint16 equal",
1169 .get = get_uint16_equal,
1170 .put = put_uint16,
1171};
1172
213945e4
DG
1173/* floating point */
1174
1175static int get_float64(QEMUFile *f, void *pv, size_t size)
1176{
1177 float64 *v = pv;
1178
1179 *v = make_float64(qemu_get_be64(f));
1180 return 0;
1181}
1182
1183static void put_float64(QEMUFile *f, void *pv, size_t size)
1184{
1185 uint64_t *v = pv;
1186
1187 qemu_put_be64(f, float64_val(*v));
1188}
1189
1190const VMStateInfo vmstate_info_float64 = {
1191 .name = "float64",
1192 .get = get_float64,
1193 .put = put_float64,
1194};
1195
dde0463b
JQ
1196/* timers */
1197
1198static int get_timer(QEMUFile *f, void *pv, size_t size)
1199{
1200 QEMUTimer *v = pv;
1201 qemu_get_timer(f, v);
1202 return 0;
1203}
1204
84e2e3eb 1205static void put_timer(QEMUFile *f, void *pv, size_t size)
dde0463b 1206{
84e2e3eb 1207 QEMUTimer *v = pv;
dde0463b
JQ
1208 qemu_put_timer(f, v);
1209}
1210
1211const VMStateInfo vmstate_info_timer = {
1212 .name = "timer",
1213 .get = get_timer,
1214 .put = put_timer,
1215};
1216
6f67c50f
JQ
1217/* uint8_t buffers */
1218
1219static int get_buffer(QEMUFile *f, void *pv, size_t size)
1220{
1221 uint8_t *v = pv;
1222 qemu_get_buffer(f, v, size);
1223 return 0;
1224}
1225
84e2e3eb 1226static void put_buffer(QEMUFile *f, void *pv, size_t size)
6f67c50f 1227{
84e2e3eb 1228 uint8_t *v = pv;
6f67c50f
JQ
1229 qemu_put_buffer(f, v, size);
1230}
1231
1232const VMStateInfo vmstate_info_buffer = {
1233 .name = "buffer",
1234 .get = get_buffer,
1235 .put = put_buffer,
1236};
1237
76507c75 1238/* unused buffers: space that was used for some fields that are
61cc8701 1239 not useful anymore */
76507c75
JQ
1240
1241static int get_unused_buffer(QEMUFile *f, void *pv, size_t size)
1242{
21174c34
JK
1243 uint8_t buf[1024];
1244 int block_len;
1245
1246 while (size > 0) {
1247 block_len = MIN(sizeof(buf), size);
1248 size -= block_len;
1249 qemu_get_buffer(f, buf, block_len);
1250 }
1251 return 0;
76507c75
JQ
1252}
1253
1254static void put_unused_buffer(QEMUFile *f, void *pv, size_t size)
1255{
21174c34
JK
1256 static const uint8_t buf[1024];
1257 int block_len;
1258
1259 while (size > 0) {
1260 block_len = MIN(sizeof(buf), size);
1261 size -= block_len;
1262 qemu_put_buffer(f, buf, block_len);
1263 }
76507c75
JQ
1264}
1265
1266const VMStateInfo vmstate_info_unused_buffer = {
1267 .name = "unused_buffer",
1268 .get = get_unused_buffer,
1269 .put = put_unused_buffer,
1270};
1271
08e99e29
PM
1272/* bitmaps (as defined by bitmap.h). Note that size here is the size
1273 * of the bitmap in bits. The on-the-wire format of a bitmap is 64
1274 * bit words with the bits in big endian order. The in-memory format
1275 * is an array of 'unsigned long', which may be either 32 or 64 bits.
1276 */
1277/* This is the number of 64 bit words sent over the wire */
1278#define BITS_TO_U64S(nr) DIV_ROUND_UP(nr, 64)
1279static int get_bitmap(QEMUFile *f, void *pv, size_t size)
1280{
1281 unsigned long *bmp = pv;
1282 int i, idx = 0;
1283 for (i = 0; i < BITS_TO_U64S(size); i++) {
1284 uint64_t w = qemu_get_be64(f);
1285 bmp[idx++] = w;
1286 if (sizeof(unsigned long) == 4 && idx < BITS_TO_LONGS(size)) {
1287 bmp[idx++] = w >> 32;
1288 }
1289 }
1290 return 0;
1291}
1292
1293static void put_bitmap(QEMUFile *f, void *pv, size_t size)
1294{
1295 unsigned long *bmp = pv;
1296 int i, idx = 0;
1297 for (i = 0; i < BITS_TO_U64S(size); i++) {
1298 uint64_t w = bmp[idx++];
1299 if (sizeof(unsigned long) == 4 && idx < BITS_TO_LONGS(size)) {
1300 w |= ((uint64_t)bmp[idx++]) << 32;
1301 }
1302 qemu_put_be64(f, w);
1303 }
1304}
1305
1306const VMStateInfo vmstate_info_bitmap = {
1307 .name = "bitmap",
1308 .get = get_bitmap,
1309 .put = put_bitmap,
1310};
1311
7685ee6a
AW
1312typedef struct CompatEntry {
1313 char idstr[256];
1314 int instance_id;
1315} CompatEntry;
1316
a672b469 1317typedef struct SaveStateEntry {
72cf2d4f 1318 QTAILQ_ENTRY(SaveStateEntry) entry;
a672b469
AL
1319 char idstr[256];
1320 int instance_id;
4d2ffa08 1321 int alias_id;
a672b469
AL
1322 int version_id;
1323 int section_id;
22ea40f4 1324 SaveVMHandlers *ops;
9ed7d6ae 1325 const VMStateDescription *vmsd;
a672b469 1326 void *opaque;
7685ee6a 1327 CompatEntry *compat;
24312968 1328 int no_migrate;
a7ae8355 1329 int is_ram;
a672b469
AL
1330} SaveStateEntry;
1331
c163b5ca 1332
72cf2d4f
BS
1333static QTAILQ_HEAD(savevm_handlers, SaveStateEntry) savevm_handlers =
1334 QTAILQ_HEAD_INITIALIZER(savevm_handlers);
9ed7d6ae 1335static int global_section_id;
a672b469 1336
8718e999
JQ
1337static int calculate_new_instance_id(const char *idstr)
1338{
1339 SaveStateEntry *se;
1340 int instance_id = 0;
1341
72cf2d4f 1342 QTAILQ_FOREACH(se, &savevm_handlers, entry) {
8718e999
JQ
1343 if (strcmp(idstr, se->idstr) == 0
1344 && instance_id <= se->instance_id) {
1345 instance_id = se->instance_id + 1;
1346 }
1347 }
1348 return instance_id;
1349}
1350
7685ee6a
AW
1351static int calculate_compat_instance_id(const char *idstr)
1352{
1353 SaveStateEntry *se;
1354 int instance_id = 0;
1355
1356 QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1357 if (!se->compat)
1358 continue;
1359
1360 if (strcmp(idstr, se->compat->idstr) == 0
1361 && instance_id <= se->compat->instance_id) {
1362 instance_id = se->compat->instance_id + 1;
1363 }
1364 }
1365 return instance_id;
1366}
1367
a672b469
AL
1368/* TODO: Individual devices generally have very little idea about the rest
1369 of the system, so instance_id should be removed/replaced.
1370 Meanwhile pass -1 as instance_id if you do not already have a clearly
1371 distinguishing id for all instances of your device class. */
0be71e32
AW
1372int register_savevm_live(DeviceState *dev,
1373 const char *idstr,
a672b469
AL
1374 int instance_id,
1375 int version_id,
7908c78d 1376 SaveVMHandlers *ops,
a672b469
AL
1377 void *opaque)
1378{
8718e999 1379 SaveStateEntry *se;
a672b469 1380
7267c094 1381 se = g_malloc0(sizeof(SaveStateEntry));
a672b469
AL
1382 se->version_id = version_id;
1383 se->section_id = global_section_id++;
7908c78d 1384 se->ops = ops;
a672b469 1385 se->opaque = opaque;
9ed7d6ae 1386 se->vmsd = NULL;
24312968 1387 se->no_migrate = 0;
a7ae8355 1388 /* if this is a live_savem then set is_ram */
16310a3c 1389 if (ops->save_live_setup != NULL) {
a7ae8355
SS
1390 se->is_ram = 1;
1391 }
a672b469 1392
09e5ab63
AL
1393 if (dev) {
1394 char *id = qdev_get_dev_path(dev);
7685ee6a
AW
1395 if (id) {
1396 pstrcpy(se->idstr, sizeof(se->idstr), id);
1397 pstrcat(se->idstr, sizeof(se->idstr), "/");
7267c094 1398 g_free(id);
7685ee6a 1399
7267c094 1400 se->compat = g_malloc0(sizeof(CompatEntry));
7685ee6a
AW
1401 pstrcpy(se->compat->idstr, sizeof(se->compat->idstr), idstr);
1402 se->compat->instance_id = instance_id == -1 ?
1403 calculate_compat_instance_id(idstr) : instance_id;
1404 instance_id = -1;
1405 }
1406 }
1407 pstrcat(se->idstr, sizeof(se->idstr), idstr);
1408
8718e999 1409 if (instance_id == -1) {
7685ee6a 1410 se->instance_id = calculate_new_instance_id(se->idstr);
8718e999
JQ
1411 } else {
1412 se->instance_id = instance_id;
a672b469 1413 }
7685ee6a 1414 assert(!se->compat || se->instance_id == 0);
8718e999 1415 /* add at the end of list */
72cf2d4f 1416 QTAILQ_INSERT_TAIL(&savevm_handlers, se, entry);
a672b469
AL
1417 return 0;
1418}
1419
0be71e32
AW
1420int register_savevm(DeviceState *dev,
1421 const char *idstr,
a672b469
AL
1422 int instance_id,
1423 int version_id,
1424 SaveStateHandler *save_state,
1425 LoadStateHandler *load_state,
1426 void *opaque)
1427{
7908c78d
JQ
1428 SaveVMHandlers *ops = g_malloc0(sizeof(SaveVMHandlers));
1429 ops->save_state = save_state;
1430 ops->load_state = load_state;
0be71e32 1431 return register_savevm_live(dev, idstr, instance_id, version_id,
7908c78d 1432 ops, opaque);
a672b469
AL
1433}
1434
0be71e32 1435void unregister_savevm(DeviceState *dev, const char *idstr, void *opaque)
41bd13af 1436{
8718e999 1437 SaveStateEntry *se, *new_se;
7685ee6a
AW
1438 char id[256] = "";
1439
09e5ab63
AL
1440 if (dev) {
1441 char *path = qdev_get_dev_path(dev);
7685ee6a
AW
1442 if (path) {
1443 pstrcpy(id, sizeof(id), path);
1444 pstrcat(id, sizeof(id), "/");
7267c094 1445 g_free(path);
7685ee6a
AW
1446 }
1447 }
1448 pstrcat(id, sizeof(id), idstr);
41bd13af 1449
72cf2d4f 1450 QTAILQ_FOREACH_SAFE(se, &savevm_handlers, entry, new_se) {
7685ee6a 1451 if (strcmp(se->idstr, id) == 0 && se->opaque == opaque) {
72cf2d4f 1452 QTAILQ_REMOVE(&savevm_handlers, se, entry);
69e58af9 1453 if (se->compat) {
7267c094 1454 g_free(se->compat);
69e58af9 1455 }
22ea40f4 1456 g_free(se->ops);
7267c094 1457 g_free(se);
41bd13af 1458 }
41bd13af
AL
1459 }
1460}
1461
0be71e32 1462int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
4d2ffa08
JK
1463 const VMStateDescription *vmsd,
1464 void *opaque, int alias_id,
1465 int required_for_version)
9ed7d6ae 1466{
8718e999 1467 SaveStateEntry *se;
9ed7d6ae 1468
4d2ffa08
JK
1469 /* If this triggers, alias support can be dropped for the vmsd. */
1470 assert(alias_id == -1 || required_for_version >= vmsd->minimum_version_id);
1471
7267c094 1472 se = g_malloc0(sizeof(SaveStateEntry));
9ed7d6ae
JQ
1473 se->version_id = vmsd->version_id;
1474 se->section_id = global_section_id++;
9ed7d6ae
JQ
1475 se->opaque = opaque;
1476 se->vmsd = vmsd;
4d2ffa08 1477 se->alias_id = alias_id;
2837c8ea 1478 se->no_migrate = vmsd->unmigratable;
9ed7d6ae 1479
09e5ab63
AL
1480 if (dev) {
1481 char *id = qdev_get_dev_path(dev);
7685ee6a
AW
1482 if (id) {
1483 pstrcpy(se->idstr, sizeof(se->idstr), id);
1484 pstrcat(se->idstr, sizeof(se->idstr), "/");
7267c094 1485 g_free(id);
7685ee6a 1486
7267c094 1487 se->compat = g_malloc0(sizeof(CompatEntry));
7685ee6a
AW
1488 pstrcpy(se->compat->idstr, sizeof(se->compat->idstr), vmsd->name);
1489 se->compat->instance_id = instance_id == -1 ?
1490 calculate_compat_instance_id(vmsd->name) : instance_id;
1491 instance_id = -1;
1492 }
1493 }
1494 pstrcat(se->idstr, sizeof(se->idstr), vmsd->name);
1495
8718e999 1496 if (instance_id == -1) {
7685ee6a 1497 se->instance_id = calculate_new_instance_id(se->idstr);
8718e999
JQ
1498 } else {
1499 se->instance_id = instance_id;
9ed7d6ae 1500 }
7685ee6a 1501 assert(!se->compat || se->instance_id == 0);
8718e999 1502 /* add at the end of list */
72cf2d4f 1503 QTAILQ_INSERT_TAIL(&savevm_handlers, se, entry);
9ed7d6ae
JQ
1504 return 0;
1505}
1506
0be71e32
AW
1507void vmstate_unregister(DeviceState *dev, const VMStateDescription *vmsd,
1508 void *opaque)
9ed7d6ae 1509{
1eb7538b
JQ
1510 SaveStateEntry *se, *new_se;
1511
72cf2d4f 1512 QTAILQ_FOREACH_SAFE(se, &savevm_handlers, entry, new_se) {
1eb7538b 1513 if (se->vmsd == vmsd && se->opaque == opaque) {
72cf2d4f 1514 QTAILQ_REMOVE(&savevm_handlers, se, entry);
69e58af9 1515 if (se->compat) {
7267c094 1516 g_free(se->compat);
69e58af9 1517 }
7267c094 1518 g_free(se);
1eb7538b
JQ
1519 }
1520 }
9ed7d6ae
JQ
1521}
1522
811814bd
JQ
1523static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
1524 void *opaque);
1525static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
1526 void *opaque);
1527
9ed7d6ae
JQ
1528int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
1529 void *opaque, int version_id)
1530{
1531 VMStateField *field = vmsd->fields;
811814bd 1532 int ret;
9ed7d6ae
JQ
1533
1534 if (version_id > vmsd->version_id) {
1535 return -EINVAL;
1536 }
1537 if (version_id < vmsd->minimum_version_id_old) {
1538 return -EINVAL;
1539 }
1540 if (version_id < vmsd->minimum_version_id) {
1541 return vmsd->load_state_old(f, opaque, version_id);
1542 }
fd4d52de
JQ
1543 if (vmsd->pre_load) {
1544 int ret = vmsd->pre_load(opaque);
1545 if (ret)
1546 return ret;
1547 }
9ed7d6ae 1548 while(field->name) {
f11f6a5f
JQ
1549 if ((field->field_exists &&
1550 field->field_exists(opaque, version_id)) ||
1551 (!field->field_exists &&
1552 field->version_id <= version_id)) {
f752a6aa 1553 void *base_addr = opaque + field->offset;
811814bd 1554 int i, n_elems = 1;
e61a1e0a 1555 int size = field->size;
9ed7d6ae 1556
e61a1e0a
JQ
1557 if (field->flags & VMS_VBUFFER) {
1558 size = *(int32_t *)(opaque+field->size_offset);
33599e2a
JQ
1559 if (field->flags & VMS_MULTIPLY) {
1560 size *= field->size;
1561 }
e61a1e0a 1562 }
f752a6aa
JQ
1563 if (field->flags & VMS_ARRAY) {
1564 n_elems = field->num;
d6698281
JQ
1565 } else if (field->flags & VMS_VARRAY_INT32) {
1566 n_elems = *(int32_t *)(opaque+field->num_offset);
a624b086
JQ
1567 } else if (field->flags & VMS_VARRAY_UINT32) {
1568 n_elems = *(uint32_t *)(opaque+field->num_offset);
bdb4941d
JQ
1569 } else if (field->flags & VMS_VARRAY_UINT16) {
1570 n_elems = *(uint16_t *)(opaque+field->num_offset);
82fa39b7
JQ
1571 } else if (field->flags & VMS_VARRAY_UINT8) {
1572 n_elems = *(uint8_t *)(opaque+field->num_offset);
f752a6aa 1573 }
dde0463b 1574 if (field->flags & VMS_POINTER) {
e61a1e0a 1575 base_addr = *(void **)base_addr + field->start;
dde0463b 1576 }
f752a6aa 1577 for (i = 0; i < n_elems; i++) {
e61a1e0a 1578 void *addr = base_addr + size * i;
ec245e21 1579
19df438b
JQ
1580 if (field->flags & VMS_ARRAY_OF_POINTER) {
1581 addr = *(void **)addr;
1582 }
ec245e21 1583 if (field->flags & VMS_STRUCT) {
fa3aad24 1584 ret = vmstate_load_state(f, field->vmsd, addr, field->vmsd->version_id);
ec245e21 1585 } else {
e61a1e0a 1586 ret = field->info->get(f, addr, size);
ec245e21
JQ
1587
1588 }
f752a6aa
JQ
1589 if (ret < 0) {
1590 return ret;
1591 }
9ed7d6ae
JQ
1592 }
1593 }
1594 field++;
1595 }
811814bd
JQ
1596 ret = vmstate_subsection_load(f, vmsd, opaque);
1597 if (ret != 0) {
1598 return ret;
1599 }
752ff2fa 1600 if (vmsd->post_load) {
e59fb374 1601 return vmsd->post_load(opaque, version_id);
752ff2fa 1602 }
9ed7d6ae
JQ
1603 return 0;
1604}
1605
1606void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
84e2e3eb 1607 void *opaque)
9ed7d6ae
JQ
1608{
1609 VMStateField *field = vmsd->fields;
1610
8fb0791d
JQ
1611 if (vmsd->pre_save) {
1612 vmsd->pre_save(opaque);
1613 }
9ed7d6ae 1614 while(field->name) {
f11f6a5f
JQ
1615 if (!field->field_exists ||
1616 field->field_exists(opaque, vmsd->version_id)) {
1617 void *base_addr = opaque + field->offset;
1618 int i, n_elems = 1;
e61a1e0a 1619 int size = field->size;
dde0463b 1620
e61a1e0a
JQ
1621 if (field->flags & VMS_VBUFFER) {
1622 size = *(int32_t *)(opaque+field->size_offset);
33599e2a
JQ
1623 if (field->flags & VMS_MULTIPLY) {
1624 size *= field->size;
1625 }
e61a1e0a 1626 }
f11f6a5f
JQ
1627 if (field->flags & VMS_ARRAY) {
1628 n_elems = field->num;
d6698281
JQ
1629 } else if (field->flags & VMS_VARRAY_INT32) {
1630 n_elems = *(int32_t *)(opaque+field->num_offset);
1329d189
AK
1631 } else if (field->flags & VMS_VARRAY_UINT32) {
1632 n_elems = *(uint32_t *)(opaque+field->num_offset);
bdb4941d
JQ
1633 } else if (field->flags & VMS_VARRAY_UINT16) {
1634 n_elems = *(uint16_t *)(opaque+field->num_offset);
b784421c
JQ
1635 } else if (field->flags & VMS_VARRAY_UINT8) {
1636 n_elems = *(uint8_t *)(opaque+field->num_offset);
f11f6a5f
JQ
1637 }
1638 if (field->flags & VMS_POINTER) {
e61a1e0a 1639 base_addr = *(void **)base_addr + field->start;
f11f6a5f
JQ
1640 }
1641 for (i = 0; i < n_elems; i++) {
e61a1e0a 1642 void *addr = base_addr + size * i;
ec245e21 1643
8595387e
JQ
1644 if (field->flags & VMS_ARRAY_OF_POINTER) {
1645 addr = *(void **)addr;
1646 }
f11f6a5f
JQ
1647 if (field->flags & VMS_STRUCT) {
1648 vmstate_save_state(f, field->vmsd, addr);
1649 } else {
e61a1e0a 1650 field->info->put(f, addr, size);
f11f6a5f 1651 }
ec245e21 1652 }
dde0463b 1653 }
9ed7d6ae
JQ
1654 field++;
1655 }
811814bd 1656 vmstate_subsection_save(f, vmsd, opaque);
9ed7d6ae
JQ
1657}
1658
4082be4d
JQ
1659static int vmstate_load(QEMUFile *f, SaveStateEntry *se, int version_id)
1660{
9ed7d6ae 1661 if (!se->vmsd) { /* Old style */
22ea40f4 1662 return se->ops->load_state(f, se->opaque, version_id);
9ed7d6ae
JQ
1663 }
1664 return vmstate_load_state(f, se->vmsd, se->opaque, version_id);
4082be4d
JQ
1665}
1666
dc912121 1667static void vmstate_save(QEMUFile *f, SaveStateEntry *se)
4082be4d 1668{
9ed7d6ae 1669 if (!se->vmsd) { /* Old style */
22ea40f4 1670 se->ops->save_state(f, se->opaque);
dc912121 1671 return;
9ed7d6ae
JQ
1672 }
1673 vmstate_save_state(f,se->vmsd, se->opaque);
4082be4d
JQ
1674}
1675
a672b469
AL
1676#define QEMU_VM_FILE_MAGIC 0x5145564d
1677#define QEMU_VM_FILE_VERSION_COMPAT 0x00000002
1678#define QEMU_VM_FILE_VERSION 0x00000003
1679
1680#define QEMU_VM_EOF 0x00
1681#define QEMU_VM_SECTION_START 0x01
1682#define QEMU_VM_SECTION_PART 0x02
1683#define QEMU_VM_SECTION_END 0x03
1684#define QEMU_VM_SECTION_FULL 0x04
811814bd 1685#define QEMU_VM_SUBSECTION 0x05
a672b469 1686
e1c37d0e 1687bool qemu_savevm_state_blocked(Error **errp)
dc912121
AW
1688{
1689 SaveStateEntry *se;
1690
1691 QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1692 if (se->no_migrate) {
e1c37d0e 1693 error_set(errp, QERR_MIGRATION_NOT_SUPPORTED, se->idstr);
dc912121
AW
1694 return true;
1695 }
1696 }
1697 return false;
1698}
1699
47c8c17a
PB
1700void qemu_savevm_state_begin(QEMUFile *f,
1701 const MigrationParams *params)
a672b469
AL
1702{
1703 SaveStateEntry *se;
39346385 1704 int ret;
a672b469 1705
c163b5ca 1706 QTAILQ_FOREACH(se, &savevm_handlers, entry) {
22ea40f4 1707 if (!se->ops || !se->ops->set_params) {
c163b5ca 1708 continue;
6607ae23 1709 }
22ea40f4 1710 se->ops->set_params(params, se->opaque);
c163b5ca 1711 }
1712
a672b469
AL
1713 qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
1714 qemu_put_be32(f, QEMU_VM_FILE_VERSION);
1715
72cf2d4f 1716 QTAILQ_FOREACH(se, &savevm_handlers, entry) {
a672b469
AL
1717 int len;
1718
d1315aac 1719 if (!se->ops || !se->ops->save_live_setup) {
a672b469 1720 continue;
22ea40f4 1721 }
6bd68781
JQ
1722 if (se->ops && se->ops->is_active) {
1723 if (!se->ops->is_active(se->opaque)) {
1724 continue;
1725 }
1726 }
a672b469
AL
1727 /* Section type */
1728 qemu_put_byte(f, QEMU_VM_SECTION_START);
1729 qemu_put_be32(f, se->section_id);
1730
1731 /* ID string */
1732 len = strlen(se->idstr);
1733 qemu_put_byte(f, len);
1734 qemu_put_buffer(f, (uint8_t *)se->idstr, len);
1735
1736 qemu_put_be32(f, se->instance_id);
1737 qemu_put_be32(f, se->version_id);
1738
d1315aac 1739 ret = se->ops->save_live_setup(f, se->opaque);
2975725f 1740 if (ret < 0) {
47c8c17a
PB
1741 qemu_file_set_error(f, ret);
1742 break;
2975725f 1743 }
a672b469 1744 }
a672b469
AL
1745}
1746
39346385 1747/*
07f35073 1748 * this function has three return values:
39346385
JQ
1749 * negative: there was one error, and we have -errno.
1750 * 0 : We haven't finished, caller have to go again
1751 * 1 : We have finished, we can go to complete phase
1752 */
539de124 1753int qemu_savevm_state_iterate(QEMUFile *f)
a672b469
AL
1754{
1755 SaveStateEntry *se;
1756 int ret = 1;
1757
72cf2d4f 1758 QTAILQ_FOREACH(se, &savevm_handlers, entry) {
16310a3c 1759 if (!se->ops || !se->ops->save_live_iterate) {
a672b469 1760 continue;
22ea40f4 1761 }
6bd68781
JQ
1762 if (se->ops && se->ops->is_active) {
1763 if (!se->ops->is_active(se->opaque)) {
1764 continue;
1765 }
1766 }
aac844ed
JQ
1767 if (qemu_file_rate_limit(f)) {
1768 return 0;
1769 }
517a13c9 1770 trace_savevm_section_start();
a672b469
AL
1771 /* Section type */
1772 qemu_put_byte(f, QEMU_VM_SECTION_PART);
1773 qemu_put_be32(f, se->section_id);
1774
16310a3c 1775 ret = se->ops->save_live_iterate(f, se->opaque);
517a13c9
JQ
1776 trace_savevm_section_end(se->section_id);
1777
47c8c17a
PB
1778 if (ret < 0) {
1779 qemu_file_set_error(f, ret);
1780 }
2975725f 1781 if (ret <= 0) {
90697be8
JK
1782 /* Do not proceed to the next vmstate before this one reported
1783 completion of the current stage. This serializes the migration
1784 and reduces the probability that a faster changing state is
1785 synchronized over and over again. */
1786 break;
1787 }
a672b469 1788 }
39346385 1789 return ret;
a672b469
AL
1790}
1791
47c8c17a 1792void qemu_savevm_state_complete(QEMUFile *f)
a672b469
AL
1793{
1794 SaveStateEntry *se;
2975725f 1795 int ret;
a672b469 1796
ea375f9a
JK
1797 cpu_synchronize_all_states();
1798
72cf2d4f 1799 QTAILQ_FOREACH(se, &savevm_handlers, entry) {
16310a3c 1800 if (!se->ops || !se->ops->save_live_complete) {
a672b469 1801 continue;
22ea40f4 1802 }
6bd68781
JQ
1803 if (se->ops && se->ops->is_active) {
1804 if (!se->ops->is_active(se->opaque)) {
1805 continue;
1806 }
1807 }
517a13c9 1808 trace_savevm_section_start();
a672b469
AL
1809 /* Section type */
1810 qemu_put_byte(f, QEMU_VM_SECTION_END);
1811 qemu_put_be32(f, se->section_id);
1812
16310a3c 1813 ret = se->ops->save_live_complete(f, se->opaque);
517a13c9 1814 trace_savevm_section_end(se->section_id);
2975725f 1815 if (ret < 0) {
47c8c17a
PB
1816 qemu_file_set_error(f, ret);
1817 return;
2975725f 1818 }
a672b469
AL
1819 }
1820
72cf2d4f 1821 QTAILQ_FOREACH(se, &savevm_handlers, entry) {
a672b469
AL
1822 int len;
1823
22ea40f4 1824 if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
a672b469 1825 continue;
22ea40f4 1826 }
517a13c9 1827 trace_savevm_section_start();
a672b469
AL
1828 /* Section type */
1829 qemu_put_byte(f, QEMU_VM_SECTION_FULL);
1830 qemu_put_be32(f, se->section_id);
1831
1832 /* ID string */
1833 len = strlen(se->idstr);
1834 qemu_put_byte(f, len);
1835 qemu_put_buffer(f, (uint8_t *)se->idstr, len);
1836
1837 qemu_put_be32(f, se->instance_id);
1838 qemu_put_be32(f, se->version_id);
1839
dc912121 1840 vmstate_save(f, se);
517a13c9 1841 trace_savevm_section_end(se->section_id);
a672b469
AL
1842 }
1843
1844 qemu_put_byte(f, QEMU_VM_EOF);
edaae611 1845 qemu_fflush(f);
a672b469
AL
1846}
1847
e4ed1541
JQ
1848uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size)
1849{
1850 SaveStateEntry *se;
1851 uint64_t ret = 0;
1852
1853 QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1854 if (!se->ops || !se->ops->save_live_pending) {
1855 continue;
1856 }
1857 if (se->ops && se->ops->is_active) {
1858 if (!se->ops->is_active(se->opaque)) {
1859 continue;
1860 }
1861 }
1862 ret += se->ops->save_live_pending(f, se->opaque, max_size);
1863 }
1864 return ret;
1865}
1866
6522773f 1867void qemu_savevm_state_cancel(void)
4ec7fcc7
JK
1868{
1869 SaveStateEntry *se;
1870
1871 QTAILQ_FOREACH(se, &savevm_handlers, entry) {
9b5bfab0
JQ
1872 if (se->ops && se->ops->cancel) {
1873 se->ops->cancel(se->opaque);
4ec7fcc7
JK
1874 }
1875 }
1876}
1877
e1c37d0e 1878static int qemu_savevm_state(QEMUFile *f)
a672b469 1879{
a672b469 1880 int ret;
6607ae23
IY
1881 MigrationParams params = {
1882 .blk = 0,
1883 .shared = 0
1884 };
a672b469 1885
e1c37d0e 1886 if (qemu_savevm_state_blocked(NULL)) {
04943eba 1887 return -EINVAL;
dc912121
AW
1888 }
1889
9b095037 1890 qemu_mutex_unlock_iothread();
47c8c17a 1891 qemu_savevm_state_begin(f, &params);
9b095037
PB
1892 qemu_mutex_lock_iothread();
1893
47c8c17a
PB
1894 while (qemu_file_get_error(f) == 0) {
1895 if (qemu_savevm_state_iterate(f) > 0) {
1896 break;
1897 }
1898 }
a672b469 1899
47c8c17a 1900 ret = qemu_file_get_error(f);
39346385 1901 if (ret == 0) {
47c8c17a 1902 qemu_savevm_state_complete(f);
624b9cc2 1903 ret = qemu_file_get_error(f);
39346385 1904 }
04943eba
PB
1905 if (ret != 0) {
1906 qemu_savevm_state_cancel();
1907 }
a672b469
AL
1908 return ret;
1909}
1910
a7ae8355
SS
1911static int qemu_save_device_state(QEMUFile *f)
1912{
1913 SaveStateEntry *se;
1914
1915 qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
1916 qemu_put_be32(f, QEMU_VM_FILE_VERSION);
1917
1918 cpu_synchronize_all_states();
1919
1920 QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1921 int len;
1922
1923 if (se->is_ram) {
1924 continue;
1925 }
22ea40f4 1926 if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
a7ae8355
SS
1927 continue;
1928 }
1929
1930 /* Section type */
1931 qemu_put_byte(f, QEMU_VM_SECTION_FULL);
1932 qemu_put_be32(f, se->section_id);
1933
1934 /* ID string */
1935 len = strlen(se->idstr);
1936 qemu_put_byte(f, len);
1937 qemu_put_buffer(f, (uint8_t *)se->idstr, len);
1938
1939 qemu_put_be32(f, se->instance_id);
1940 qemu_put_be32(f, se->version_id);
1941
1942 vmstate_save(f, se);
1943 }
1944
1945 qemu_put_byte(f, QEMU_VM_EOF);
1946
1947 return qemu_file_get_error(f);
1948}
1949
a672b469
AL
1950static SaveStateEntry *find_se(const char *idstr, int instance_id)
1951{
1952 SaveStateEntry *se;
1953
72cf2d4f 1954 QTAILQ_FOREACH(se, &savevm_handlers, entry) {
a672b469 1955 if (!strcmp(se->idstr, idstr) &&
4d2ffa08
JK
1956 (instance_id == se->instance_id ||
1957 instance_id == se->alias_id))
a672b469 1958 return se;
7685ee6a
AW
1959 /* Migrating from an older version? */
1960 if (strstr(se->idstr, idstr) && se->compat) {
1961 if (!strcmp(se->compat->idstr, idstr) &&
1962 (instance_id == se->compat->instance_id ||
1963 instance_id == se->alias_id))
1964 return se;
1965 }
a672b469
AL
1966 }
1967 return NULL;
1968}
1969
811814bd
JQ
1970static const VMStateDescription *vmstate_get_subsection(const VMStateSubsection *sub, char *idstr)
1971{
1972 while(sub && sub->needed) {
1973 if (strcmp(idstr, sub->vmsd->name) == 0) {
1974 return sub->vmsd;
1975 }
1976 sub++;
1977 }
1978 return NULL;
1979}
1980
1981static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
1982 void *opaque)
1983{
c6380724 1984 while (qemu_peek_byte(f, 0) == QEMU_VM_SUBSECTION) {
811814bd
JQ
1985 char idstr[256];
1986 int ret;
c6380724 1987 uint8_t version_id, len, size;
811814bd
JQ
1988 const VMStateDescription *sub_vmsd;
1989
c6380724
JQ
1990 len = qemu_peek_byte(f, 1);
1991 if (len < strlen(vmsd->name) + 1) {
1992 /* subsection name has be be "section_name/a" */
1993 return 0;
1994 }
1995 size = qemu_peek_buffer(f, (uint8_t *)idstr, len, 2);
1996 if (size != len) {
1997 return 0;
1998 }
1999 idstr[size] = 0;
811814bd 2000
c6380724
JQ
2001 if (strncmp(vmsd->name, idstr, strlen(vmsd->name)) != 0) {
2002 /* it don't have a valid subsection name */
2003 return 0;
2004 }
3da9eebd 2005 sub_vmsd = vmstate_get_subsection(vmsd->subsections, idstr);
811814bd
JQ
2006 if (sub_vmsd == NULL) {
2007 return -ENOENT;
2008 }
c6380724
JQ
2009 qemu_file_skip(f, 1); /* subsection */
2010 qemu_file_skip(f, 1); /* len */
2011 qemu_file_skip(f, len); /* idstr */
2012 version_id = qemu_get_be32(f);
2013
811814bd
JQ
2014 ret = vmstate_load_state(f, sub_vmsd, opaque, version_id);
2015 if (ret) {
2016 return ret;
2017 }
2018 }
2019 return 0;
2020}
2021
2022static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
2023 void *opaque)
2024{
2025 const VMStateSubsection *sub = vmsd->subsections;
2026
2027 while (sub && sub->needed) {
2028 if (sub->needed(opaque)) {
2029 const VMStateDescription *vmsd = sub->vmsd;
2030 uint8_t len;
2031
2032 qemu_put_byte(f, QEMU_VM_SUBSECTION);
2033 len = strlen(vmsd->name);
2034 qemu_put_byte(f, len);
2035 qemu_put_buffer(f, (uint8_t *)vmsd->name, len);
2036 qemu_put_be32(f, vmsd->version_id);
2037 vmstate_save_state(f, vmsd, opaque);
2038 }
2039 sub++;
2040 }
2041}
2042
a672b469 2043typedef struct LoadStateEntry {
72cf2d4f 2044 QLIST_ENTRY(LoadStateEntry) entry;
a672b469
AL
2045 SaveStateEntry *se;
2046 int section_id;
2047 int version_id;
a672b469
AL
2048} LoadStateEntry;
2049
a672b469
AL
2050int qemu_loadvm_state(QEMUFile *f)
2051{
72cf2d4f
BS
2052 QLIST_HEAD(, LoadStateEntry) loadvm_handlers =
2053 QLIST_HEAD_INITIALIZER(loadvm_handlers);
f4dbb8dd 2054 LoadStateEntry *le, *new_le;
a672b469
AL
2055 uint8_t section_type;
2056 unsigned int v;
2057 int ret;
2058
e1c37d0e 2059 if (qemu_savevm_state_blocked(NULL)) {
dc912121
AW
2060 return -EINVAL;
2061 }
2062
a672b469
AL
2063 v = qemu_get_be32(f);
2064 if (v != QEMU_VM_FILE_MAGIC)
2065 return -EINVAL;
2066
2067 v = qemu_get_be32(f);
bbfe1408
JQ
2068 if (v == QEMU_VM_FILE_VERSION_COMPAT) {
2069 fprintf(stderr, "SaveVM v2 format is obsolete and don't work anymore\n");
2070 return -ENOTSUP;
2071 }
a672b469
AL
2072 if (v != QEMU_VM_FILE_VERSION)
2073 return -ENOTSUP;
2074
2075 while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) {
2076 uint32_t instance_id, version_id, section_id;
a672b469
AL
2077 SaveStateEntry *se;
2078 char idstr[257];
2079 int len;
2080
2081 switch (section_type) {
2082 case QEMU_VM_SECTION_START:
2083 case QEMU_VM_SECTION_FULL:
2084 /* Read section start */
2085 section_id = qemu_get_be32(f);
2086 len = qemu_get_byte(f);
2087 qemu_get_buffer(f, (uint8_t *)idstr, len);
2088 idstr[len] = 0;
2089 instance_id = qemu_get_be32(f);
2090 version_id = qemu_get_be32(f);
2091
2092 /* Find savevm section */
2093 se = find_se(idstr, instance_id);
2094 if (se == NULL) {
2095 fprintf(stderr, "Unknown savevm section or instance '%s' %d\n", idstr, instance_id);
2096 ret = -EINVAL;
2097 goto out;
2098 }
2099
2100 /* Validate version */
2101 if (version_id > se->version_id) {
2102 fprintf(stderr, "savevm: unsupported version %d for '%s' v%d\n",
2103 version_id, idstr, se->version_id);
2104 ret = -EINVAL;
2105 goto out;
2106 }
2107
2108 /* Add entry */
7267c094 2109 le = g_malloc0(sizeof(*le));
a672b469
AL
2110
2111 le->se = se;
2112 le->section_id = section_id;
2113 le->version_id = version_id;
72cf2d4f 2114 QLIST_INSERT_HEAD(&loadvm_handlers, le, entry);
a672b469 2115
4082be4d 2116 ret = vmstate_load(f, le->se, le->version_id);
b5a22e4a
JQ
2117 if (ret < 0) {
2118 fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n",
2119 instance_id, idstr);
2120 goto out;
2121 }
a672b469
AL
2122 break;
2123 case QEMU_VM_SECTION_PART:
2124 case QEMU_VM_SECTION_END:
2125 section_id = qemu_get_be32(f);
2126
72cf2d4f 2127 QLIST_FOREACH(le, &loadvm_handlers, entry) {
f4dbb8dd
JQ
2128 if (le->section_id == section_id) {
2129 break;
2130 }
2131 }
a672b469
AL
2132 if (le == NULL) {
2133 fprintf(stderr, "Unknown savevm section %d\n", section_id);
2134 ret = -EINVAL;
2135 goto out;
2136 }
2137
4082be4d 2138 ret = vmstate_load(f, le->se, le->version_id);
b5a22e4a
JQ
2139 if (ret < 0) {
2140 fprintf(stderr, "qemu: warning: error while loading state section id %d\n",
2141 section_id);
2142 goto out;
2143 }
a672b469
AL
2144 break;
2145 default:
2146 fprintf(stderr, "Unknown savevm section type %d\n", section_type);
2147 ret = -EINVAL;
2148 goto out;
2149 }
2150 }
2151
ea375f9a
JK
2152 cpu_synchronize_all_post_init();
2153
a672b469
AL
2154 ret = 0;
2155
2156out:
72cf2d4f
BS
2157 QLIST_FOREACH_SAFE(le, &loadvm_handlers, entry, new_le) {
2158 QLIST_REMOVE(le, entry);
7267c094 2159 g_free(le);
a672b469
AL
2160 }
2161
42802d47
JQ
2162 if (ret == 0) {
2163 ret = qemu_file_get_error(f);
624b9cc2 2164 }
a672b469
AL
2165
2166 return ret;
2167}
2168
a672b469
AL
2169static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
2170 const char *name)
2171{
2172 QEMUSnapshotInfo *sn_tab, *sn;
2173 int nb_sns, i, ret;
2174
2175 ret = -ENOENT;
2176 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
2177 if (nb_sns < 0)
2178 return ret;
2179 for(i = 0; i < nb_sns; i++) {
2180 sn = &sn_tab[i];
2181 if (!strcmp(sn->id_str, name) || !strcmp(sn->name, name)) {
2182 *sn_info = *sn;
2183 ret = 0;
2184 break;
2185 }
2186 }
7267c094 2187 g_free(sn_tab);
a672b469
AL
2188 return ret;
2189}
2190
cb499fb2
KW
2191/*
2192 * Deletes snapshots of a given name in all opened images.
2193 */
2194static int del_existing_snapshots(Monitor *mon, const char *name)
2195{
2196 BlockDriverState *bs;
cb499fb2
KW
2197 QEMUSnapshotInfo sn1, *snapshot = &sn1;
2198 int ret;
2199
dbc13590
MA
2200 bs = NULL;
2201 while ((bs = bdrv_next(bs))) {
cb499fb2
KW
2202 if (bdrv_can_snapshot(bs) &&
2203 bdrv_snapshot_find(bs, snapshot, name) >= 0)
2204 {
2205 ret = bdrv_snapshot_delete(bs, name);
2206 if (ret < 0) {
2207 monitor_printf(mon,
2208 "Error while deleting snapshot on '%s'\n",
2209 bdrv_get_device_name(bs));
2210 return -1;
2211 }
2212 }
2213 }
2214
2215 return 0;
2216}
2217
d54908a5 2218void do_savevm(Monitor *mon, const QDict *qdict)
a672b469
AL
2219{
2220 BlockDriverState *bs, *bs1;
2221 QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
cb499fb2 2222 int ret;
a672b469
AL
2223 QEMUFile *f;
2224 int saved_vm_running;
c2c9a466 2225 uint64_t vm_state_size;
68b891ec 2226 qemu_timeval tv;
7d631a11 2227 struct tm tm;
d54908a5 2228 const char *name = qdict_get_try_str(qdict, "name");
a672b469 2229
feeee5ac 2230 /* Verify if there is a device that doesn't support snapshots and is writable */
dbc13590
MA
2231 bs = NULL;
2232 while ((bs = bdrv_next(bs))) {
feeee5ac 2233
07b70bfb 2234 if (!bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
feeee5ac
MDCF
2235 continue;
2236 }
2237
2238 if (!bdrv_can_snapshot(bs)) {
2239 monitor_printf(mon, "Device '%s' is writable but does not support snapshots.\n",
2240 bdrv_get_device_name(bs));
2241 return;
2242 }
2243 }
2244
f9092b10 2245 bs = bdrv_snapshots();
a672b469 2246 if (!bs) {
376253ec 2247 monitor_printf(mon, "No block device can accept snapshots\n");
a672b469
AL
2248 return;
2249 }
a672b469 2250
1354869c 2251 saved_vm_running = runstate_is_running();
0461d5a6 2252 vm_stop(RUN_STATE_SAVE_VM);
a672b469 2253
cb499fb2 2254 memset(sn, 0, sizeof(*sn));
a672b469
AL
2255
2256 /* fill auxiliary fields */
68b891ec 2257 qemu_gettimeofday(&tv);
a672b469
AL
2258 sn->date_sec = tv.tv_sec;
2259 sn->date_nsec = tv.tv_usec * 1000;
74475455 2260 sn->vm_clock_nsec = qemu_get_clock_ns(vm_clock);
a672b469 2261
7d631a11
MDCF
2262 if (name) {
2263 ret = bdrv_snapshot_find(bs, old_sn, name);
2264 if (ret >= 0) {
2265 pstrcpy(sn->name, sizeof(sn->name), old_sn->name);
2266 pstrcpy(sn->id_str, sizeof(sn->id_str), old_sn->id_str);
2267 } else {
2268 pstrcpy(sn->name, sizeof(sn->name), name);
2269 }
2270 } else {
d7d9b528
BS
2271 /* cast below needed for OpenBSD where tv_sec is still 'long' */
2272 localtime_r((const time_t *)&tv.tv_sec, &tm);
7d631a11 2273 strftime(sn->name, sizeof(sn->name), "vm-%Y%m%d%H%M%S", &tm);
7d631a11
MDCF
2274 }
2275
cb499fb2 2276 /* Delete old snapshots of the same name */
f139a412 2277 if (name && del_existing_snapshots(mon, name) < 0) {
cb499fb2
KW
2278 goto the_end;
2279 }
2280
a672b469 2281 /* save the VM state */
45566e9c 2282 f = qemu_fopen_bdrv(bs, 1);
a672b469 2283 if (!f) {
376253ec 2284 monitor_printf(mon, "Could not open VM state file\n");
a672b469
AL
2285 goto the_end;
2286 }
e1c37d0e 2287 ret = qemu_savevm_state(f);
2d22b18f 2288 vm_state_size = qemu_ftell(f);
a672b469
AL
2289 qemu_fclose(f);
2290 if (ret < 0) {
376253ec 2291 monitor_printf(mon, "Error %d while writing VM\n", ret);
a672b469
AL
2292 goto the_end;
2293 }
2294
2295 /* create the snapshots */
2296
dbc13590
MA
2297 bs1 = NULL;
2298 while ((bs1 = bdrv_next(bs1))) {
feeee5ac 2299 if (bdrv_can_snapshot(bs1)) {
2d22b18f
AL
2300 /* Write VM state size only to the image that contains the state */
2301 sn->vm_state_size = (bs == bs1 ? vm_state_size : 0);
a672b469
AL
2302 ret = bdrv_snapshot_create(bs1, sn);
2303 if (ret < 0) {
376253ec
AL
2304 monitor_printf(mon, "Error while creating snapshot on '%s'\n",
2305 bdrv_get_device_name(bs1));
a672b469
AL
2306 }
2307 }
2308 }
2309
2310 the_end:
2311 if (saved_vm_running)
2312 vm_start();
2313}
2314
a7ae8355
SS
2315void qmp_xen_save_devices_state(const char *filename, Error **errp)
2316{
2317 QEMUFile *f;
2318 int saved_vm_running;
2319 int ret;
2320
2321 saved_vm_running = runstate_is_running();
2322 vm_stop(RUN_STATE_SAVE_VM);
2323
2324 f = qemu_fopen(filename, "wb");
2325 if (!f) {
2326 error_set(errp, QERR_OPEN_FILE_FAILED, filename);
2327 goto the_end;
2328 }
2329 ret = qemu_save_device_state(f);
2330 qemu_fclose(f);
2331 if (ret < 0) {
2332 error_set(errp, QERR_IO_ERROR);
2333 }
2334
2335 the_end:
2336 if (saved_vm_running)
2337 vm_start();
a7ae8355
SS
2338}
2339
03cd4655 2340int load_vmstate(const char *name)
a672b469 2341{
f0aa7a8b 2342 BlockDriverState *bs, *bs_vm_state;
2d22b18f 2343 QEMUSnapshotInfo sn;
a672b469 2344 QEMUFile *f;
751c6a17 2345 int ret;
a672b469 2346
f0aa7a8b
MDCF
2347 bs_vm_state = bdrv_snapshots();
2348 if (!bs_vm_state) {
2349 error_report("No block device supports snapshots");
2350 return -ENOTSUP;
2351 }
2352
2353 /* Don't even try to load empty VM states */
2354 ret = bdrv_snapshot_find(bs_vm_state, &sn, name);
2355 if (ret < 0) {
2356 return ret;
2357 } else if (sn.vm_state_size == 0) {
e11480db
KW
2358 error_report("This is a disk-only snapshot. Revert to it offline "
2359 "using qemu-img.");
f0aa7a8b
MDCF
2360 return -EINVAL;
2361 }
2362
2363 /* Verify if there is any device that doesn't support snapshots and is
2364 writable and check if the requested snapshot is available too. */
dbc13590
MA
2365 bs = NULL;
2366 while ((bs = bdrv_next(bs))) {
feeee5ac 2367
07b70bfb 2368 if (!bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
feeee5ac
MDCF
2369 continue;
2370 }
2371
2372 if (!bdrv_can_snapshot(bs)) {
2373 error_report("Device '%s' is writable but does not support snapshots.",
2374 bdrv_get_device_name(bs));
2375 return -ENOTSUP;
2376 }
feeee5ac 2377
f0aa7a8b
MDCF
2378 ret = bdrv_snapshot_find(bs, &sn, name);
2379 if (ret < 0) {
2380 error_report("Device '%s' does not have the requested snapshot '%s'",
2381 bdrv_get_device_name(bs), name);
2382 return ret;
2383 }
a672b469
AL
2384 }
2385
2386 /* Flush all IO requests so they don't interfere with the new state. */
922453bc 2387 bdrv_drain_all();
a672b469 2388
f0aa7a8b
MDCF
2389 bs = NULL;
2390 while ((bs = bdrv_next(bs))) {
2391 if (bdrv_can_snapshot(bs)) {
2392 ret = bdrv_snapshot_goto(bs, name);
a672b469 2393 if (ret < 0) {
f0aa7a8b
MDCF
2394 error_report("Error %d while activating snapshot '%s' on '%s'",
2395 ret, name, bdrv_get_device_name(bs));
2396 return ret;
a672b469
AL
2397 }
2398 }
2399 }
2400
a672b469 2401 /* restore the VM state */
f0aa7a8b 2402 f = qemu_fopen_bdrv(bs_vm_state, 0);
a672b469 2403 if (!f) {
1ecda02b 2404 error_report("Could not open VM state file");
05f2401e 2405 return -EINVAL;
a672b469 2406 }
f0aa7a8b 2407
5a8a49d7 2408 qemu_system_reset(VMRESET_SILENT);
a672b469 2409 ret = qemu_loadvm_state(f);
f0aa7a8b 2410
a672b469
AL
2411 qemu_fclose(f);
2412 if (ret < 0) {
1ecda02b 2413 error_report("Error %d while loading VM state", ret);
05f2401e 2414 return ret;
a672b469 2415 }
f0aa7a8b 2416
05f2401e 2417 return 0;
7b630349
JQ
2418}
2419
d54908a5 2420void do_delvm(Monitor *mon, const QDict *qdict)
a672b469
AL
2421{
2422 BlockDriverState *bs, *bs1;
751c6a17 2423 int ret;
d54908a5 2424 const char *name = qdict_get_str(qdict, "name");
a672b469 2425
f9092b10 2426 bs = bdrv_snapshots();
a672b469 2427 if (!bs) {
376253ec 2428 monitor_printf(mon, "No block device supports snapshots\n");
a672b469
AL
2429 return;
2430 }
2431
dbc13590
MA
2432 bs1 = NULL;
2433 while ((bs1 = bdrv_next(bs1))) {
feeee5ac 2434 if (bdrv_can_snapshot(bs1)) {
a672b469
AL
2435 ret = bdrv_snapshot_delete(bs1, name);
2436 if (ret < 0) {
2437 if (ret == -ENOTSUP)
376253ec
AL
2438 monitor_printf(mon,
2439 "Snapshots not supported on device '%s'\n",
2440 bdrv_get_device_name(bs1));
a672b469 2441 else
376253ec
AL
2442 monitor_printf(mon, "Error %d while deleting snapshot on "
2443 "'%s'\n", ret, bdrv_get_device_name(bs1));
a672b469
AL
2444 }
2445 }
2446 }
2447}
2448
84f2d0ea 2449void do_info_snapshots(Monitor *mon, const QDict *qdict)
a672b469
AL
2450{
2451 BlockDriverState *bs, *bs1;
f9209915
MDCF
2452 QEMUSnapshotInfo *sn_tab, *sn, s, *sn_info = &s;
2453 int nb_sns, i, ret, available;
2454 int total;
2455 int *available_snapshots;
a672b469
AL
2456 char buf[256];
2457
f9092b10 2458 bs = bdrv_snapshots();
a672b469 2459 if (!bs) {
376253ec 2460 monitor_printf(mon, "No available block device supports snapshots\n");
a672b469
AL
2461 return;
2462 }
a672b469
AL
2463
2464 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
2465 if (nb_sns < 0) {
376253ec 2466 monitor_printf(mon, "bdrv_snapshot_list: error %d\n", nb_sns);
a672b469
AL
2467 return;
2468 }
f9209915
MDCF
2469
2470 if (nb_sns == 0) {
2471 monitor_printf(mon, "There is no snapshot available.\n");
2472 return;
2473 }
2474
7267c094 2475 available_snapshots = g_malloc0(sizeof(int) * nb_sns);
f9209915
MDCF
2476 total = 0;
2477 for (i = 0; i < nb_sns; i++) {
a672b469 2478 sn = &sn_tab[i];
f9209915
MDCF
2479 available = 1;
2480 bs1 = NULL;
2481
2482 while ((bs1 = bdrv_next(bs1))) {
2483 if (bdrv_can_snapshot(bs1) && bs1 != bs) {
2484 ret = bdrv_snapshot_find(bs1, sn_info, sn->id_str);
2485 if (ret < 0) {
2486 available = 0;
2487 break;
2488 }
2489 }
2490 }
2491
2492 if (available) {
2493 available_snapshots[total] = i;
2494 total++;
2495 }
a672b469 2496 }
f9209915
MDCF
2497
2498 if (total > 0) {
2499 monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
2500 for (i = 0; i < total; i++) {
2501 sn = &sn_tab[available_snapshots[i]];
2502 monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
2503 }
2504 } else {
2505 monitor_printf(mon, "There is no suitable snapshot available\n");
2506 }
2507
7267c094
AL
2508 g_free(sn_tab);
2509 g_free(available_snapshots);
f9209915 2510
a672b469 2511}
c5705a77
AK
2512
2513void vmstate_register_ram(MemoryRegion *mr, DeviceState *dev)
2514{
1ddde087 2515 qemu_ram_set_idstr(memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK,
c5705a77
AK
2516 memory_region_name(mr), dev);
2517}
2518
2519void vmstate_unregister_ram(MemoryRegion *mr, DeviceState *dev)
2520{
2521 /* Nothing do to while the implementation is in RAMBlock */
2522}
2523
2524void vmstate_register_ram_global(MemoryRegion *mr)
2525{
2526 vmstate_register_ram(mr, NULL);
2527}