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