xref: /illumos-kvm-cmd/savevm.c (revision 68396ea9)
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  */
24 #include <unistd.h>
25 #include <fcntl.h>
26 #include <signal.h>
27 #include <time.h>
28 #include <errno.h>
29 #include <sys/time.h>
30 #include <zlib.h>
31 
32 /* Needed early for CONFIG_BSD etc. */
33 #include "config-host.h"
34 
35 #ifndef _WIN32
36 #include <sys/times.h>
37 #include <sys/wait.h>
38 #include <termios.h>
39 #include <sys/mman.h>
40 #include <sys/ioctl.h>
41 #include <sys/resource.h>
42 #include <sys/socket.h>
43 #include <netinet/in.h>
44 #include <net/if.h>
45 #include <arpa/inet.h>
46 #include <dirent.h>
47 #include <netdb.h>
48 #include <sys/select.h>
49 #ifdef CONFIG_BSD
50 #include <sys/stat.h>
51 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
52 #include <libutil.h>
53 #else
54 #include <util.h>
55 #endif
56 #ifdef __linux__
57 #include <pty.h>
58 #include <malloc.h>
59 #include <linux/rtc.h>
60 #endif
61 #endif
62 #endif
63 
64 #ifdef _WIN32
65 #include <windows.h>
66 #include <malloc.h>
67 #include <sys/timeb.h>
68 #include <mmsystem.h>
69 #define getopt_long_only getopt_long
70 #define memalign(align, size) malloc(size)
71 #endif
72 
73 #include "qemu-common.h"
74 #include "hw/hw.h"
75 #include "hw/qdev.h"
76 #include "net.h"
77 #include "monitor.h"
78 #include "sysemu.h"
79 #include "qemu-timer.h"
80 #include "qemu-char.h"
81 #include "audio/audio.h"
82 #include "migration.h"
83 #include "qemu_socket.h"
84 #include "qemu-queue.h"
85 
86 #define SELF_ANNOUNCE_ROUNDS 5
87 
88 #ifndef ETH_P_RARP
89 #define ETH_P_RARP 0x8035
90 #endif
91 #define ARP_HTYPE_ETH 0x0001
92 #define ARP_PTYPE_IP 0x0800
93 #define ARP_OP_REQUEST_REV 0x3
94 
announce_self_create(uint8_t * buf,uint8_t * mac_addr)95 static int announce_self_create(uint8_t *buf,
96 				uint8_t *mac_addr)
97 {
98     /* Ethernet header. */
99     memset(buf, 0xff, 6);         /* destination MAC addr */
100     memcpy(buf + 6, mac_addr, 6); /* source MAC addr */
101     *(uint16_t *)(buf + 12) = htons(ETH_P_RARP); /* ethertype */
102 
103     /* RARP header. */
104     *(uint16_t *)(buf + 14) = htons(ARP_HTYPE_ETH); /* hardware addr space */
105     *(uint16_t *)(buf + 16) = htons(ARP_PTYPE_IP); /* protocol addr space */
106     *(buf + 18) = 6; /* hardware addr length (ethernet) */
107     *(buf + 19) = 4; /* protocol addr length (IPv4) */
108     *(uint16_t *)(buf + 20) = htons(ARP_OP_REQUEST_REV); /* opcode */
109     memcpy(buf + 22, mac_addr, 6); /* source hw addr */
110     memset(buf + 28, 0x00, 4);     /* source protocol addr */
111     memcpy(buf + 32, mac_addr, 6); /* target hw addr */
112     memset(buf + 38, 0x00, 4);     /* target protocol addr */
113 
114     /* Padding to get up to 60 bytes (ethernet min packet size, minus FCS). */
115     memset(buf + 42, 0x00, 18);
116 
117     return 60; /* len (FCS will be added by hardware) */
118 }
119 
qemu_announce_self_iter(NICState * nic,void * opaque)120 static void qemu_announce_self_iter(NICState *nic, void *opaque)
121 {
122     uint8_t buf[60];
123     int len;
124 
125     len = announce_self_create(buf, nic->conf->macaddr.a);
126 
127     qemu_send_packet_raw(&nic->nc, buf, len);
128 }
129 
130 
qemu_announce_self_once(void * opaque)131 static void qemu_announce_self_once(void *opaque)
132 {
133     static int count = SELF_ANNOUNCE_ROUNDS;
134     QEMUTimer *timer = *(QEMUTimer **)opaque;
135 
136     qemu_foreach_nic(qemu_announce_self_iter, NULL);
137 
138     if (--count) {
139         /* delay 50ms, 150ms, 250ms, ... */
140         qemu_mod_timer(timer, qemu_get_clock(rt_clock) +
141                        50 + (SELF_ANNOUNCE_ROUNDS - count - 1) * 100);
142     } else {
143 	    qemu_del_timer(timer);
144 	    qemu_free_timer(timer);
145     }
146 }
147 
qemu_announce_self(void)148 void qemu_announce_self(void)
149 {
150 	static QEMUTimer *timer;
151 	timer = qemu_new_timer(rt_clock, qemu_announce_self_once, &timer);
152 	qemu_announce_self_once(&timer);
153 }
154 
155 /***********************************************************/
156 /* savevm/loadvm support */
157 
158 #define IO_BUF_SIZE 32768
159 
160 struct QEMUFile {
161     QEMUFilePutBufferFunc *put_buffer;
162     QEMUFileGetBufferFunc *get_buffer;
163     QEMUFileCloseFunc *close;
164     QEMUFileRateLimit *rate_limit;
165     QEMUFileSetRateLimit *set_rate_limit;
166     QEMUFileGetRateLimit *get_rate_limit;
167     void *opaque;
168     int is_write;
169 
170     int64_t buf_offset; /* start of buffer when writing, end of buffer
171                            when reading */
172     int buf_index;
173     int buf_size; /* 0 when writing */
174     uint8_t buf[IO_BUF_SIZE];
175 
176     int has_error;
177 };
178 
179 typedef struct QEMUFileStdio
180 {
181     FILE *stdio_file;
182     QEMUFile *file;
183 } QEMUFileStdio;
184 
185 typedef struct QEMUFileSocket
186 {
187     int fd;
188     QEMUFile *file;
189 } QEMUFileSocket;
190 
socket_get_buffer(void * opaque,uint8_t * buf,int64_t pos,int size)191 static int socket_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
192 {
193     QEMUFileSocket *s = opaque;
194     ssize_t len;
195 
196     do {
197         len = recv(s->fd, (void *)buf, size, 0);
198     } while (len == -1 && socket_error() == EINTR);
199 
200     if (len == -1)
201         len = -socket_error();
202 
203     return len;
204 }
205 
socket_close(void * opaque)206 static int socket_close(void *opaque)
207 {
208     QEMUFileSocket *s = opaque;
209     qemu_free(s);
210     return 0;
211 }
212 
stdio_put_buffer(void * opaque,const uint8_t * buf,int64_t pos,int size)213 static int stdio_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size)
214 {
215     QEMUFileStdio *s = opaque;
216     return fwrite(buf, 1, size, s->stdio_file);
217 }
218 
stdio_get_buffer(void * opaque,uint8_t * buf,int64_t pos,int size)219 static int stdio_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
220 {
221     QEMUFileStdio *s = opaque;
222     FILE *fp = s->stdio_file;
223     int bytes;
224 
225     do {
226         clearerr(fp);
227         bytes = fread(buf, 1, size, fp);
228     } while ((bytes == 0) && ferror(fp) && (errno == EINTR));
229     return bytes;
230 }
231 
stdio_pclose(void * opaque)232 static int stdio_pclose(void *opaque)
233 {
234     QEMUFileStdio *s = opaque;
235     int ret;
236     ret = pclose(s->stdio_file);
237     qemu_free(s);
238     return ret;
239 }
240 
stdio_fclose(void * opaque)241 static int stdio_fclose(void *opaque)
242 {
243     QEMUFileStdio *s = opaque;
244     fclose(s->stdio_file);
245     qemu_free(s);
246     return 0;
247 }
248 
qemu_popen(FILE * stdio_file,const char * mode)249 QEMUFile *qemu_popen(FILE *stdio_file, const char *mode)
250 {
251     QEMUFileStdio *s;
252 
253     if (stdio_file == NULL || mode == NULL || (mode[0] != 'r' && mode[0] != 'w') || mode[1] != 0) {
254         fprintf(stderr, "qemu_popen: Argument validity check failed\n");
255         return NULL;
256     }
257 
258     s = qemu_mallocz(sizeof(QEMUFileStdio));
259 
260     s->stdio_file = stdio_file;
261 
262     if(mode[0] == 'r') {
263         s->file = qemu_fopen_ops(s, NULL, stdio_get_buffer, stdio_pclose,
264 				 NULL, NULL, NULL);
265     } else {
266         s->file = qemu_fopen_ops(s, stdio_put_buffer, NULL, stdio_pclose,
267 				 NULL, NULL, NULL);
268     }
269     return s->file;
270 }
271 
qemu_popen_cmd(const char * command,const char * mode)272 QEMUFile *qemu_popen_cmd(const char *command, const char *mode)
273 {
274     FILE *popen_file;
275 
276     popen_file = popen(command, mode);
277     if(popen_file == NULL) {
278         return NULL;
279     }
280 
281     return qemu_popen(popen_file, mode);
282 }
283 
qemu_stdio_fd(QEMUFile * f)284 int qemu_stdio_fd(QEMUFile *f)
285 {
286     QEMUFileStdio *p;
287     int fd;
288 
289     p = (QEMUFileStdio *)f->opaque;
290     fd = fileno(p->stdio_file);
291 
292     return fd;
293 }
294 
qemu_fdopen(int fd,const char * mode)295 QEMUFile *qemu_fdopen(int fd, const char *mode)
296 {
297     QEMUFileStdio *s;
298 
299     if (mode == NULL ||
300 	(mode[0] != 'r' && mode[0] != 'w') ||
301 	mode[1] != 'b' || mode[2] != 0) {
302         fprintf(stderr, "qemu_fdopen: Argument validity check failed\n");
303         return NULL;
304     }
305 
306     s = qemu_mallocz(sizeof(QEMUFileStdio));
307     s->stdio_file = fdopen(fd, mode);
308     if (!s->stdio_file)
309         goto fail;
310 
311     if(mode[0] == 'r') {
312         s->file = qemu_fopen_ops(s, NULL, stdio_get_buffer, stdio_fclose,
313 				 NULL, NULL, NULL);
314     } else {
315         s->file = qemu_fopen_ops(s, stdio_put_buffer, NULL, stdio_fclose,
316 				 NULL, NULL, NULL);
317     }
318     return s->file;
319 
320 fail:
321     qemu_free(s);
322     return NULL;
323 }
324 
qemu_fopen_socket(int fd)325 QEMUFile *qemu_fopen_socket(int fd)
326 {
327     QEMUFileSocket *s = qemu_mallocz(sizeof(QEMUFileSocket));
328 
329     s->fd = fd;
330     s->file = qemu_fopen_ops(s, NULL, socket_get_buffer, socket_close,
331 			     NULL, NULL, NULL);
332     return s->file;
333 }
334 
file_put_buffer(void * opaque,const uint8_t * buf,int64_t pos,int size)335 static int file_put_buffer(void *opaque, const uint8_t *buf,
336                             int64_t pos, int size)
337 {
338     QEMUFileStdio *s = opaque;
339     fseek(s->stdio_file, pos, SEEK_SET);
340     return fwrite(buf, 1, size, s->stdio_file);
341 }
342 
file_get_buffer(void * opaque,uint8_t * buf,int64_t pos,int size)343 static int file_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
344 {
345     QEMUFileStdio *s = opaque;
346     fseek(s->stdio_file, pos, SEEK_SET);
347     return fread(buf, 1, size, s->stdio_file);
348 }
349 
qemu_fopen(const char * filename,const char * mode)350 QEMUFile *qemu_fopen(const char *filename, const char *mode)
351 {
352     QEMUFileStdio *s;
353 
354     if (mode == NULL ||
355 	(mode[0] != 'r' && mode[0] != 'w') ||
356 	mode[1] != 'b' || mode[2] != 0) {
357         fprintf(stderr, "qemu_fopen: Argument validity check failed\n");
358         return NULL;
359     }
360 
361     s = qemu_mallocz(sizeof(QEMUFileStdio));
362 
363     s->stdio_file = fopen(filename, mode);
364     if (!s->stdio_file)
365         goto fail;
366 
367     if(mode[0] == 'w') {
368         s->file = qemu_fopen_ops(s, file_put_buffer, NULL, stdio_fclose,
369 				 NULL, NULL, NULL);
370     } else {
371         s->file = qemu_fopen_ops(s, NULL, file_get_buffer, stdio_fclose,
372 			       NULL, NULL, NULL);
373     }
374     return s->file;
375 fail:
376     qemu_free(s);
377     return NULL;
378 }
379 
block_put_buffer(void * opaque,const uint8_t * buf,int64_t pos,int size)380 static int block_put_buffer(void *opaque, const uint8_t *buf,
381                            int64_t pos, int size)
382 {
383     bdrv_save_vmstate(opaque, buf, pos, size);
384     return size;
385 }
386 
block_get_buffer(void * opaque,uint8_t * buf,int64_t pos,int size)387 static int block_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
388 {
389     return bdrv_load_vmstate(opaque, buf, pos, size);
390 }
391 
bdrv_fclose(void * opaque)392 static int bdrv_fclose(void *opaque)
393 {
394     return 0;
395 }
396 
qemu_fopen_bdrv(BlockDriverState * bs,int is_writable)397 static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int is_writable)
398 {
399     if (is_writable)
400         return qemu_fopen_ops(bs, block_put_buffer, NULL, bdrv_fclose,
401 			      NULL, NULL, NULL);
402     return qemu_fopen_ops(bs, NULL, block_get_buffer, bdrv_fclose, NULL, NULL, NULL);
403 }
404 
qemu_fopen_ops(void * opaque,QEMUFilePutBufferFunc * put_buffer,QEMUFileGetBufferFunc * get_buffer,QEMUFileCloseFunc * close,QEMUFileRateLimit * rate_limit,QEMUFileSetRateLimit * set_rate_limit,QEMUFileGetRateLimit * get_rate_limit)405 QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer,
406                          QEMUFileGetBufferFunc *get_buffer,
407                          QEMUFileCloseFunc *close,
408                          QEMUFileRateLimit *rate_limit,
409                          QEMUFileSetRateLimit *set_rate_limit,
410                          QEMUFileGetRateLimit *get_rate_limit)
411 {
412     QEMUFile *f;
413 
414     f = qemu_mallocz(sizeof(QEMUFile));
415 
416     f->opaque = opaque;
417     f->put_buffer = put_buffer;
418     f->get_buffer = get_buffer;
419     f->close = close;
420     f->rate_limit = rate_limit;
421     f->set_rate_limit = set_rate_limit;
422     f->get_rate_limit = get_rate_limit;
423     f->is_write = 0;
424 
425     return f;
426 }
427 
qemu_file_has_error(QEMUFile * f)428 int qemu_file_has_error(QEMUFile *f)
429 {
430     return f->has_error;
431 }
432 
qemu_file_set_error(QEMUFile * f)433 void qemu_file_set_error(QEMUFile *f)
434 {
435     f->has_error = 1;
436 }
437 
qemu_fflush(QEMUFile * f)438 void qemu_fflush(QEMUFile *f)
439 {
440     if (!f->put_buffer)
441         return;
442 
443     if (f->is_write && f->buf_index > 0) {
444         int len;
445 
446         len = f->put_buffer(f->opaque, f->buf, f->buf_offset, f->buf_index);
447         if (len > 0)
448             f->buf_offset += f->buf_index;
449         else
450             f->has_error = 1;
451         f->buf_index = 0;
452     }
453 }
454 
qemu_fill_buffer(QEMUFile * f)455 static void qemu_fill_buffer(QEMUFile *f)
456 {
457     int len;
458 
459     if (!f->get_buffer)
460         return;
461 
462     if (f->is_write)
463         abort();
464 
465     len = f->get_buffer(f->opaque, f->buf, f->buf_offset, IO_BUF_SIZE);
466     if (len > 0) {
467         f->buf_index = 0;
468         f->buf_size = len;
469         f->buf_offset += len;
470     } else if (len != -EAGAIN)
471         f->has_error = 1;
472 }
473 
qemu_fclose(QEMUFile * f)474 int qemu_fclose(QEMUFile *f)
475 {
476     int ret = 0;
477     qemu_fflush(f);
478     if (f->close)
479         ret = f->close(f->opaque);
480     qemu_free(f);
481     return ret;
482 }
483 
qemu_file_put_notify(QEMUFile * f)484 void qemu_file_put_notify(QEMUFile *f)
485 {
486     f->put_buffer(f->opaque, NULL, 0, 0);
487 }
488 
qemu_put_buffer(QEMUFile * f,const uint8_t * buf,int size)489 void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
490 {
491     int l;
492 
493     if (!f->has_error && f->is_write == 0 && f->buf_index > 0) {
494         fprintf(stderr,
495                 "Attempted to write to buffer while read buffer is not empty\n");
496         abort();
497     }
498 
499     while (!f->has_error && size > 0) {
500         l = IO_BUF_SIZE - f->buf_index;
501         if (l > size)
502             l = size;
503         memcpy(f->buf + f->buf_index, buf, l);
504         f->is_write = 1;
505         f->buf_index += l;
506         buf += l;
507         size -= l;
508         if (f->buf_index >= IO_BUF_SIZE)
509             qemu_fflush(f);
510     }
511 }
512 
qemu_put_byte(QEMUFile * f,int v)513 void qemu_put_byte(QEMUFile *f, int v)
514 {
515     if (!f->has_error && f->is_write == 0 && f->buf_index > 0) {
516         fprintf(stderr,
517                 "Attempted to write to buffer while read buffer is not empty\n");
518         abort();
519     }
520 
521     f->buf[f->buf_index++] = v;
522     f->is_write = 1;
523     if (f->buf_index >= IO_BUF_SIZE)
524         qemu_fflush(f);
525 }
526 
qemu_get_buffer(QEMUFile * f,uint8_t * buf,int size1)527 int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size1)
528 {
529     int size, l;
530 
531     if (f->is_write)
532         abort();
533 
534     size = size1;
535     while (size > 0) {
536         l = f->buf_size - f->buf_index;
537         if (l == 0) {
538             qemu_fill_buffer(f);
539             l = f->buf_size - f->buf_index;
540             if (l == 0)
541                 break;
542         }
543         if (l > size)
544             l = size;
545         memcpy(buf, f->buf + f->buf_index, l);
546         f->buf_index += l;
547         buf += l;
548         size -= l;
549     }
550     return size1 - size;
551 }
552 
qemu_peek_byte(QEMUFile * f)553 static int qemu_peek_byte(QEMUFile *f)
554 {
555     if (f->is_write)
556         abort();
557 
558     if (f->buf_index >= f->buf_size) {
559         qemu_fill_buffer(f);
560         if (f->buf_index >= f->buf_size)
561             return 0;
562     }
563     return f->buf[f->buf_index];
564 }
565 
qemu_get_byte(QEMUFile * f)566 int qemu_get_byte(QEMUFile *f)
567 {
568     if (f->is_write)
569         abort();
570 
571     if (f->buf_index >= f->buf_size) {
572         qemu_fill_buffer(f);
573         if (f->buf_index >= f->buf_size)
574             return 0;
575     }
576     return f->buf[f->buf_index++];
577 }
578 
qemu_ftell(QEMUFile * f)579 int64_t qemu_ftell(QEMUFile *f)
580 {
581     return f->buf_offset - f->buf_size + f->buf_index;
582 }
583 
qemu_fseek(QEMUFile * f,int64_t pos,int whence)584 int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence)
585 {
586     if (whence == SEEK_SET) {
587         /* nothing to do */
588     } else if (whence == SEEK_CUR) {
589         pos += qemu_ftell(f);
590     } else {
591         /* SEEK_END not supported */
592         return -1;
593     }
594     if (f->put_buffer) {
595         qemu_fflush(f);
596         f->buf_offset = pos;
597     } else {
598         f->buf_offset = pos;
599         f->buf_index = 0;
600         f->buf_size = 0;
601     }
602     return pos;
603 }
604 
qemu_file_rate_limit(QEMUFile * f)605 int qemu_file_rate_limit(QEMUFile *f)
606 {
607     if (f->rate_limit)
608         return f->rate_limit(f->opaque);
609 
610     return 0;
611 }
612 
qemu_file_get_rate_limit(QEMUFile * f)613 int64_t qemu_file_get_rate_limit(QEMUFile *f)
614 {
615     if (f->get_rate_limit)
616         return f->get_rate_limit(f->opaque);
617 
618     return 0;
619 }
620 
qemu_file_set_rate_limit(QEMUFile * f,int64_t new_rate)621 int64_t qemu_file_set_rate_limit(QEMUFile *f, int64_t new_rate)
622 {
623     /* any failed or completed migration keeps its state to allow probing of
624      * migration data, but has no associated file anymore */
625     if (f && f->set_rate_limit)
626         return f->set_rate_limit(f->opaque, new_rate);
627 
628     return 0;
629 }
630 
qemu_put_be16(QEMUFile * f,unsigned int v)631 void qemu_put_be16(QEMUFile *f, unsigned int v)
632 {
633     qemu_put_byte(f, v >> 8);
634     qemu_put_byte(f, v);
635 }
636 
qemu_put_be32(QEMUFile * f,unsigned int v)637 void qemu_put_be32(QEMUFile *f, unsigned int v)
638 {
639     qemu_put_byte(f, v >> 24);
640     qemu_put_byte(f, v >> 16);
641     qemu_put_byte(f, v >> 8);
642     qemu_put_byte(f, v);
643 }
644 
qemu_put_be64(QEMUFile * f,uint64_t v)645 void qemu_put_be64(QEMUFile *f, uint64_t v)
646 {
647     qemu_put_be32(f, v >> 32);
648     qemu_put_be32(f, v);
649 }
650 
qemu_get_be16(QEMUFile * f)651 unsigned int qemu_get_be16(QEMUFile *f)
652 {
653     unsigned int v;
654     v = qemu_get_byte(f) << 8;
655     v |= qemu_get_byte(f);
656     return v;
657 }
658 
qemu_get_be32(QEMUFile * f)659 unsigned int qemu_get_be32(QEMUFile *f)
660 {
661     unsigned int v;
662     v = qemu_get_byte(f) << 24;
663     v |= qemu_get_byte(f) << 16;
664     v |= qemu_get_byte(f) << 8;
665     v |= qemu_get_byte(f);
666     return v;
667 }
668 
qemu_get_be64(QEMUFile * f)669 uint64_t qemu_get_be64(QEMUFile *f)
670 {
671     uint64_t v;
672     v = (uint64_t)qemu_get_be32(f) << 32;
673     v |= qemu_get_be32(f);
674     return v;
675 }
676 
677 /* bool */
678 
get_bool(QEMUFile * f,void * pv,size_t size)679 static int get_bool(QEMUFile *f, void *pv, size_t size)
680 {
681     bool *v = pv;
682     *v = qemu_get_byte(f);
683     return 0;
684 }
685 
put_bool(QEMUFile * f,void * pv,size_t size)686 static void put_bool(QEMUFile *f, void *pv, size_t size)
687 {
688     bool *v = pv;
689     qemu_put_byte(f, *v);
690 }
691 
692 const VMStateInfo vmstate_info_bool = {
693     .name = "bool",
694     .get  = get_bool,
695     .put  = put_bool,
696 };
697 
698 /* 8 bit int */
699 
get_int8(QEMUFile * f,void * pv,size_t size)700 static int get_int8(QEMUFile *f, void *pv, size_t size)
701 {
702     int8_t *v = pv;
703     qemu_get_s8s(f, v);
704     return 0;
705 }
706 
put_int8(QEMUFile * f,void * pv,size_t size)707 static void put_int8(QEMUFile *f, void *pv, size_t size)
708 {
709     int8_t *v = pv;
710     qemu_put_s8s(f, v);
711 }
712 
713 const VMStateInfo vmstate_info_int8 = {
714     .name = "int8",
715     .get  = get_int8,
716     .put  = put_int8,
717 };
718 
719 /* 16 bit int */
720 
get_int16(QEMUFile * f,void * pv,size_t size)721 static int get_int16(QEMUFile *f, void *pv, size_t size)
722 {
723     int16_t *v = pv;
724     qemu_get_sbe16s(f, v);
725     return 0;
726 }
727 
put_int16(QEMUFile * f,void * pv,size_t size)728 static void put_int16(QEMUFile *f, void *pv, size_t size)
729 {
730     int16_t *v = pv;
731     qemu_put_sbe16s(f, v);
732 }
733 
734 const VMStateInfo vmstate_info_int16 = {
735     .name = "int16",
736     .get  = get_int16,
737     .put  = put_int16,
738 };
739 
740 /* 32 bit int */
741 
get_int32(QEMUFile * f,void * pv,size_t size)742 static int get_int32(QEMUFile *f, void *pv, size_t size)
743 {
744     int32_t *v = pv;
745     qemu_get_sbe32s(f, v);
746     return 0;
747 }
748 
put_int32(QEMUFile * f,void * pv,size_t size)749 static void put_int32(QEMUFile *f, void *pv, size_t size)
750 {
751     int32_t *v = pv;
752     qemu_put_sbe32s(f, v);
753 }
754 
755 const VMStateInfo vmstate_info_int32 = {
756     .name = "int32",
757     .get  = get_int32,
758     .put  = put_int32,
759 };
760 
761 /* 32 bit int. See that the received value is the same than the one
762    in the field */
763 
get_int32_equal(QEMUFile * f,void * pv,size_t size)764 static int get_int32_equal(QEMUFile *f, void *pv, size_t size)
765 {
766     int32_t *v = pv;
767     int32_t v2;
768     qemu_get_sbe32s(f, &v2);
769 
770     if (*v == v2)
771         return 0;
772     return -EINVAL;
773 }
774 
775 const VMStateInfo vmstate_info_int32_equal = {
776     .name = "int32 equal",
777     .get  = get_int32_equal,
778     .put  = put_int32,
779 };
780 
781 /* 32 bit int. See that the received value is the less or the same
782    than the one in the field */
783 
get_int32_le(QEMUFile * f,void * pv,size_t size)784 static int get_int32_le(QEMUFile *f, void *pv, size_t size)
785 {
786     int32_t *old = pv;
787     int32_t new;
788     qemu_get_sbe32s(f, &new);
789 
790     if (*old <= new)
791         return 0;
792     return -EINVAL;
793 }
794 
795 const VMStateInfo vmstate_info_int32_le = {
796     .name = "int32 equal",
797     .get  = get_int32_le,
798     .put  = put_int32,
799 };
800 
801 /* 64 bit int */
802 
get_int64(QEMUFile * f,void * pv,size_t size)803 static int get_int64(QEMUFile *f, void *pv, size_t size)
804 {
805     int64_t *v = pv;
806     qemu_get_sbe64s(f, v);
807     return 0;
808 }
809 
put_int64(QEMUFile * f,void * pv,size_t size)810 static void put_int64(QEMUFile *f, void *pv, size_t size)
811 {
812     int64_t *v = pv;
813     qemu_put_sbe64s(f, v);
814 }
815 
816 const VMStateInfo vmstate_info_int64 = {
817     .name = "int64",
818     .get  = get_int64,
819     .put  = put_int64,
820 };
821 
822 /* 8 bit unsigned int */
823 
get_uint8(QEMUFile * f,void * pv,size_t size)824 static int get_uint8(QEMUFile *f, void *pv, size_t size)
825 {
826     uint8_t *v = pv;
827     qemu_get_8s(f, v);
828     return 0;
829 }
830 
put_uint8(QEMUFile * f,void * pv,size_t size)831 static void put_uint8(QEMUFile *f, void *pv, size_t size)
832 {
833     uint8_t *v = pv;
834     qemu_put_8s(f, v);
835 }
836 
837 const VMStateInfo vmstate_info_uint8 = {
838     .name = "uint8",
839     .get  = get_uint8,
840     .put  = put_uint8,
841 };
842 
843 /* 16 bit unsigned int */
844 
get_uint16(QEMUFile * f,void * pv,size_t size)845 static int get_uint16(QEMUFile *f, void *pv, size_t size)
846 {
847     uint16_t *v = pv;
848     qemu_get_be16s(f, v);
849     return 0;
850 }
851 
put_uint16(QEMUFile * f,void * pv,size_t size)852 static void put_uint16(QEMUFile *f, void *pv, size_t size)
853 {
854     uint16_t *v = pv;
855     qemu_put_be16s(f, v);
856 }
857 
858 const VMStateInfo vmstate_info_uint16 = {
859     .name = "uint16",
860     .get  = get_uint16,
861     .put  = put_uint16,
862 };
863 
864 /* 32 bit unsigned int */
865 
get_uint32(QEMUFile * f,void * pv,size_t size)866 static int get_uint32(QEMUFile *f, void *pv, size_t size)
867 {
868     uint32_t *v = pv;
869     qemu_get_be32s(f, v);
870     return 0;
871 }
872 
put_uint32(QEMUFile * f,void * pv,size_t size)873 static void put_uint32(QEMUFile *f, void *pv, size_t size)
874 {
875     uint32_t *v = pv;
876     qemu_put_be32s(f, v);
877 }
878 
879 const VMStateInfo vmstate_info_uint32 = {
880     .name = "uint32",
881     .get  = get_uint32,
882     .put  = put_uint32,
883 };
884 
885 /* 64 bit unsigned int */
886 
get_uint64(QEMUFile * f,void * pv,size_t size)887 static int get_uint64(QEMUFile *f, void *pv, size_t size)
888 {
889     uint64_t *v = pv;
890     qemu_get_be64s(f, v);
891     return 0;
892 }
893 
put_uint64(QEMUFile * f,void * pv,size_t size)894 static void put_uint64(QEMUFile *f, void *pv, size_t size)
895 {
896     uint64_t *v = pv;
897     qemu_put_be64s(f, v);
898 }
899 
900 const VMStateInfo vmstate_info_uint64 = {
901     .name = "uint64",
902     .get  = get_uint64,
903     .put  = put_uint64,
904 };
905 
906 /* 64 bit linux kernel unsigned int */
907 
908 #ifdef __linux__
get_u64(QEMUFile * f,void * pv,size_t size)909 static int get_u64(QEMUFile *f, void *pv, size_t size)
910 {
911     uint64_t *v = pv;
912     qemu_get_be64s(f, v);
913     return 0;
914 }
915 
put_u64(QEMUFile * f,void * pv,size_t size)916 static void put_u64(QEMUFile *f, void *pv, size_t size)
917 {
918     uint64_t *v = pv;
919     qemu_put_be64s(f, v);
920 }
921 
922 const VMStateInfo vmstate_info_u64 = {
923     .name = "__u64",
924     .get  = get_u64,
925     .put  = put_u64,
926 };
927 #endif /* __linux__ */
928 
929 /* 8 bit int. See that the received value is the same than the one
930    in the field */
931 
get_uint8_equal(QEMUFile * f,void * pv,size_t size)932 static int get_uint8_equal(QEMUFile *f, void *pv, size_t size)
933 {
934     uint8_t *v = pv;
935     uint8_t v2;
936     qemu_get_8s(f, &v2);
937 
938     if (*v == v2)
939         return 0;
940     return -EINVAL;
941 }
942 
943 const VMStateInfo vmstate_info_uint8_equal = {
944     .name = "uint8 equal",
945     .get  = get_uint8_equal,
946     .put  = put_uint8,
947 };
948 
949 /* 16 bit unsigned int int. See that the received value is the same than the one
950    in the field */
951 
get_uint16_equal(QEMUFile * f,void * pv,size_t size)952 static int get_uint16_equal(QEMUFile *f, void *pv, size_t size)
953 {
954     uint16_t *v = pv;
955     uint16_t v2;
956     qemu_get_be16s(f, &v2);
957 
958     if (*v == v2)
959         return 0;
960     return -EINVAL;
961 }
962 
963 const VMStateInfo vmstate_info_uint16_equal = {
964     .name = "uint16 equal",
965     .get  = get_uint16_equal,
966     .put  = put_uint16,
967 };
968 
969 /* timers  */
970 
get_timer(QEMUFile * f,void * pv,size_t size)971 static int get_timer(QEMUFile *f, void *pv, size_t size)
972 {
973     QEMUTimer *v = pv;
974     qemu_get_timer(f, v);
975     return 0;
976 }
977 
put_timer(QEMUFile * f,void * pv,size_t size)978 static void put_timer(QEMUFile *f, void *pv, size_t size)
979 {
980     QEMUTimer *v = pv;
981     qemu_put_timer(f, v);
982 }
983 
984 const VMStateInfo vmstate_info_timer = {
985     .name = "timer",
986     .get  = get_timer,
987     .put  = put_timer,
988 };
989 
990 /* uint8_t buffers */
991 
get_buffer(QEMUFile * f,void * pv,size_t size)992 static int get_buffer(QEMUFile *f, void *pv, size_t size)
993 {
994     uint8_t *v = pv;
995     qemu_get_buffer(f, v, size);
996     return 0;
997 }
998 
put_buffer(QEMUFile * f,void * pv,size_t size)999 static void put_buffer(QEMUFile *f, void *pv, size_t size)
1000 {
1001     uint8_t *v = pv;
1002     qemu_put_buffer(f, v, size);
1003 }
1004 
1005 const VMStateInfo vmstate_info_buffer = {
1006     .name = "buffer",
1007     .get  = get_buffer,
1008     .put  = put_buffer,
1009 };
1010 
1011 /* unused buffers: space that was used for some fields that are
1012    not usefull anymore */
1013 
get_unused_buffer(QEMUFile * f,void * pv,size_t size)1014 static int get_unused_buffer(QEMUFile *f, void *pv, size_t size)
1015 {
1016     uint8_t buf[1024];
1017     int block_len;
1018 
1019     while (size > 0) {
1020         block_len = MIN(sizeof(buf), size);
1021         size -= block_len;
1022         qemu_get_buffer(f, buf, block_len);
1023     }
1024    return 0;
1025 }
1026 
put_unused_buffer(QEMUFile * f,void * pv,size_t size)1027 static void put_unused_buffer(QEMUFile *f, void *pv, size_t size)
1028 {
1029     static const uint8_t buf[1024];
1030     int block_len;
1031 
1032     while (size > 0) {
1033         block_len = MIN(sizeof(buf), size);
1034         size -= block_len;
1035         qemu_put_buffer(f, buf, block_len);
1036     }
1037 }
1038 
1039 const VMStateInfo vmstate_info_unused_buffer = {
1040     .name = "unused_buffer",
1041     .get  = get_unused_buffer,
1042     .put  = put_unused_buffer,
1043 };
1044 
1045 typedef struct CompatEntry {
1046     char idstr[256];
1047     int instance_id;
1048 } CompatEntry;
1049 
1050 typedef struct SaveStateEntry {
1051     QTAILQ_ENTRY(SaveStateEntry) entry;
1052     char idstr[256];
1053     int instance_id;
1054     int alias_id;
1055     int version_id;
1056     int section_id;
1057     SaveSetParamsHandler *set_params;
1058     SaveLiveStateHandler *save_live_state;
1059     SaveStateHandler *save_state;
1060     LoadStateHandler *load_state;
1061     const VMStateDescription *vmsd;
1062     void *opaque;
1063     CompatEntry *compat;
1064     int no_migrate;
1065 } SaveStateEntry;
1066 
1067 
1068 static QTAILQ_HEAD(savevm_handlers, SaveStateEntry) savevm_handlers =
1069     QTAILQ_HEAD_INITIALIZER(savevm_handlers);
1070 static int global_section_id;
1071 
calculate_new_instance_id(const char * idstr)1072 static int calculate_new_instance_id(const char *idstr)
1073 {
1074     SaveStateEntry *se;
1075     int instance_id = 0;
1076 
1077     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1078         if (strcmp(idstr, se->idstr) == 0
1079             && instance_id <= se->instance_id) {
1080             instance_id = se->instance_id + 1;
1081         }
1082     }
1083     return instance_id;
1084 }
1085 
calculate_compat_instance_id(const char * idstr)1086 static int calculate_compat_instance_id(const char *idstr)
1087 {
1088     SaveStateEntry *se;
1089     int instance_id = 0;
1090 
1091     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1092         if (!se->compat)
1093             continue;
1094 
1095         if (strcmp(idstr, se->compat->idstr) == 0
1096             && instance_id <= se->compat->instance_id) {
1097             instance_id = se->compat->instance_id + 1;
1098         }
1099     }
1100     return instance_id;
1101 }
1102 
1103 /* TODO: Individual devices generally have very little idea about the rest
1104    of the system, so instance_id should be removed/replaced.
1105    Meanwhile pass -1 as instance_id if you do not already have a clearly
1106    distinguishing id for all instances of your device class. */
register_savevm_live(DeviceState * dev,const char * idstr,int instance_id,int version_id,SaveSetParamsHandler * set_params,SaveLiveStateHandler * save_live_state,SaveStateHandler * save_state,LoadStateHandler * load_state,void * opaque)1107 int register_savevm_live(DeviceState *dev,
1108                          const char *idstr,
1109                          int instance_id,
1110                          int version_id,
1111                          SaveSetParamsHandler *set_params,
1112                          SaveLiveStateHandler *save_live_state,
1113                          SaveStateHandler *save_state,
1114                          LoadStateHandler *load_state,
1115                          void *opaque)
1116 {
1117     SaveStateEntry *se;
1118 
1119     se = qemu_mallocz(sizeof(SaveStateEntry));
1120     se->version_id = version_id;
1121     se->section_id = global_section_id++;
1122     se->set_params = set_params;
1123     se->save_live_state = save_live_state;
1124     se->save_state = save_state;
1125     se->load_state = load_state;
1126     se->opaque = opaque;
1127     se->vmsd = NULL;
1128     se->no_migrate = 0;
1129 
1130     if (dev && dev->parent_bus && dev->parent_bus->info->get_dev_path) {
1131         char *id = dev->parent_bus->info->get_dev_path(dev);
1132         if (id) {
1133             pstrcpy(se->idstr, sizeof(se->idstr), id);
1134             pstrcat(se->idstr, sizeof(se->idstr), "/");
1135             qemu_free(id);
1136 
1137             se->compat = qemu_mallocz(sizeof(CompatEntry));
1138             pstrcpy(se->compat->idstr, sizeof(se->compat->idstr), idstr);
1139             se->compat->instance_id = instance_id == -1 ?
1140                          calculate_compat_instance_id(idstr) : instance_id;
1141             instance_id = -1;
1142         }
1143     }
1144     pstrcat(se->idstr, sizeof(se->idstr), idstr);
1145 
1146     if (instance_id == -1) {
1147         se->instance_id = calculate_new_instance_id(se->idstr);
1148     } else {
1149         se->instance_id = instance_id;
1150     }
1151     assert(!se->compat || se->instance_id == 0);
1152     /* add at the end of list */
1153     QTAILQ_INSERT_TAIL(&savevm_handlers, se, entry);
1154     return 0;
1155 }
1156 
register_savevm(DeviceState * dev,const char * idstr,int instance_id,int version_id,SaveStateHandler * save_state,LoadStateHandler * load_state,void * opaque)1157 int register_savevm(DeviceState *dev,
1158                     const char *idstr,
1159                     int instance_id,
1160                     int version_id,
1161                     SaveStateHandler *save_state,
1162                     LoadStateHandler *load_state,
1163                     void *opaque)
1164 {
1165     return register_savevm_live(dev, idstr, instance_id, version_id,
1166                                 NULL, NULL, save_state, load_state, opaque);
1167 }
1168 
unregister_savevm(DeviceState * dev,const char * idstr,void * opaque)1169 void unregister_savevm(DeviceState *dev, const char *idstr, void *opaque)
1170 {
1171     SaveStateEntry *se, *new_se;
1172     char id[256] = "";
1173 
1174     if (dev && dev->parent_bus && dev->parent_bus->info->get_dev_path) {
1175         char *path = dev->parent_bus->info->get_dev_path(dev);
1176         if (path) {
1177             pstrcpy(id, sizeof(id), path);
1178             pstrcat(id, sizeof(id), "/");
1179             qemu_free(path);
1180         }
1181     }
1182     pstrcat(id, sizeof(id), idstr);
1183 
1184     QTAILQ_FOREACH_SAFE(se, &savevm_handlers, entry, new_se) {
1185         if (strcmp(se->idstr, id) == 0 && se->opaque == opaque) {
1186             QTAILQ_REMOVE(&savevm_handlers, se, entry);
1187             if (se->compat) {
1188                 qemu_free(se->compat);
1189             }
1190             qemu_free(se);
1191         }
1192     }
1193 }
1194 
1195 /* mark a device as not to be migrated, that is the device should be
1196    unplugged before migration */
register_device_unmigratable(DeviceState * dev,const char * idstr,void * opaque)1197 void register_device_unmigratable(DeviceState *dev, const char *idstr,
1198                                                             void *opaque)
1199 {
1200     SaveStateEntry *se;
1201     char id[256] = "";
1202 
1203     if (dev && dev->parent_bus && dev->parent_bus->info->get_dev_path) {
1204         char *path = dev->parent_bus->info->get_dev_path(dev);
1205         if (path) {
1206             pstrcpy(id, sizeof(id), path);
1207             pstrcat(id, sizeof(id), "/");
1208             qemu_free(path);
1209         }
1210     }
1211     pstrcat(id, sizeof(id), idstr);
1212 
1213     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1214         if (strcmp(se->idstr, id) == 0 && se->opaque == opaque) {
1215             se->no_migrate = 1;
1216         }
1217     }
1218 }
1219 
vmstate_register_with_alias_id(DeviceState * dev,int instance_id,const VMStateDescription * vmsd,void * opaque,int alias_id,int required_for_version)1220 int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
1221                                    const VMStateDescription *vmsd,
1222                                    void *opaque, int alias_id,
1223                                    int required_for_version)
1224 {
1225     SaveStateEntry *se;
1226 
1227     /* If this triggers, alias support can be dropped for the vmsd. */
1228     assert(alias_id == -1 || required_for_version >= vmsd->minimum_version_id);
1229 
1230     se = qemu_mallocz(sizeof(SaveStateEntry));
1231     se->version_id = vmsd->version_id;
1232     se->section_id = global_section_id++;
1233     se->save_live_state = NULL;
1234     se->save_state = NULL;
1235     se->load_state = NULL;
1236     se->opaque = opaque;
1237     se->vmsd = vmsd;
1238     se->alias_id = alias_id;
1239 
1240     if (dev && dev->parent_bus && dev->parent_bus->info->get_dev_path) {
1241         char *id = dev->parent_bus->info->get_dev_path(dev);
1242         if (id) {
1243             pstrcpy(se->idstr, sizeof(se->idstr), id);
1244             pstrcat(se->idstr, sizeof(se->idstr), "/");
1245             qemu_free(id);
1246 
1247             se->compat = qemu_mallocz(sizeof(CompatEntry));
1248             pstrcpy(se->compat->idstr, sizeof(se->compat->idstr), vmsd->name);
1249             se->compat->instance_id = instance_id == -1 ?
1250                          calculate_compat_instance_id(vmsd->name) : instance_id;
1251             instance_id = -1;
1252         }
1253     }
1254     pstrcat(se->idstr, sizeof(se->idstr), vmsd->name);
1255 
1256     if (instance_id == -1) {
1257         se->instance_id = calculate_new_instance_id(se->idstr);
1258     } else {
1259         se->instance_id = instance_id;
1260     }
1261     assert(!se->compat || se->instance_id == 0);
1262     /* add at the end of list */
1263     QTAILQ_INSERT_TAIL(&savevm_handlers, se, entry);
1264     return 0;
1265 }
1266 
vmstate_register(DeviceState * dev,int instance_id,const VMStateDescription * vmsd,void * opaque)1267 int vmstate_register(DeviceState *dev, int instance_id,
1268                      const VMStateDescription *vmsd, void *opaque)
1269 {
1270     return vmstate_register_with_alias_id(dev, instance_id, vmsd,
1271                                           opaque, -1, 0);
1272 }
1273 
vmstate_unregister(DeviceState * dev,const VMStateDescription * vmsd,void * opaque)1274 void vmstate_unregister(DeviceState *dev, const VMStateDescription *vmsd,
1275                         void *opaque)
1276 {
1277     SaveStateEntry *se, *new_se;
1278 
1279     QTAILQ_FOREACH_SAFE(se, &savevm_handlers, entry, new_se) {
1280         if (se->vmsd == vmsd && se->opaque == opaque) {
1281             QTAILQ_REMOVE(&savevm_handlers, se, entry);
1282             if (se->compat) {
1283                 qemu_free(se->compat);
1284             }
1285             qemu_free(se);
1286         }
1287     }
1288 }
1289 
1290 static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
1291                                     void *opaque);
1292 static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
1293                                    void *opaque);
1294 
vmstate_load_state(QEMUFile * f,const VMStateDescription * vmsd,void * opaque,int version_id)1295 int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
1296                        void *opaque, int version_id)
1297 {
1298     VMStateField *field = vmsd->fields;
1299     int ret;
1300 
1301     if (version_id > vmsd->version_id) {
1302         return -EINVAL;
1303     }
1304     if (version_id < vmsd->minimum_version_id_old) {
1305         return -EINVAL;
1306     }
1307     if  (version_id < vmsd->minimum_version_id) {
1308         return vmsd->load_state_old(f, opaque, version_id);
1309     }
1310     if (vmsd->pre_load) {
1311         int ret = vmsd->pre_load(opaque);
1312         if (ret)
1313             return ret;
1314     }
1315     while(field->name) {
1316         if ((field->field_exists &&
1317              field->field_exists(opaque, version_id)) ||
1318             (!field->field_exists &&
1319              field->version_id <= version_id)) {
1320             void *base_addr = opaque + field->offset;
1321             int i, n_elems = 1;
1322             int size = field->size;
1323 
1324             if (field->flags & VMS_VBUFFER) {
1325                 size = *(int32_t *)(opaque+field->size_offset);
1326                 if (field->flags & VMS_MULTIPLY) {
1327                     size *= field->size;
1328                 }
1329             }
1330             if (field->flags & VMS_ARRAY) {
1331                 n_elems = field->num;
1332             } else if (field->flags & VMS_VARRAY_INT32) {
1333                 n_elems = *(int32_t *)(opaque+field->num_offset);
1334             } else if (field->flags & VMS_VARRAY_UINT16) {
1335                 n_elems = *(uint16_t *)(opaque+field->num_offset);
1336             }
1337             if (field->flags & VMS_POINTER) {
1338                 base_addr = *(void **)base_addr + field->start;
1339             }
1340             for (i = 0; i < n_elems; i++) {
1341                 void *addr = base_addr + size * i;
1342 
1343                 if (field->flags & VMS_ARRAY_OF_POINTER) {
1344                     addr = *(void **)addr;
1345                 }
1346                 if (field->flags & VMS_STRUCT) {
1347                     ret = vmstate_load_state(f, field->vmsd, addr, field->vmsd->version_id);
1348                 } else {
1349                     ret = field->info->get(f, addr, size);
1350 
1351                 }
1352                 if (ret < 0) {
1353                     return ret;
1354                 }
1355             }
1356         }
1357         field++;
1358     }
1359     ret = vmstate_subsection_load(f, vmsd, opaque);
1360     if (ret != 0) {
1361         return ret;
1362     }
1363     if (vmsd->post_load) {
1364         return vmsd->post_load(opaque, version_id);
1365     }
1366     return 0;
1367 }
1368 
vmstate_save_state(QEMUFile * f,const VMStateDescription * vmsd,void * opaque)1369 void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
1370                         void *opaque)
1371 {
1372     VMStateField *field = vmsd->fields;
1373 
1374     if (vmsd->pre_save) {
1375         vmsd->pre_save(opaque);
1376     }
1377     while(field->name) {
1378         if (!field->field_exists ||
1379             field->field_exists(opaque, vmsd->version_id)) {
1380             void *base_addr = opaque + field->offset;
1381             int i, n_elems = 1;
1382             int size = field->size;
1383 
1384             if (field->flags & VMS_VBUFFER) {
1385                 size = *(int32_t *)(opaque+field->size_offset);
1386                 if (field->flags & VMS_MULTIPLY) {
1387                     size *= field->size;
1388                 }
1389             }
1390             if (field->flags & VMS_ARRAY) {
1391                 n_elems = field->num;
1392             } else if (field->flags & VMS_VARRAY_INT32) {
1393                 n_elems = *(int32_t *)(opaque+field->num_offset);
1394             } else if (field->flags & VMS_VARRAY_UINT16) {
1395                 n_elems = *(uint16_t *)(opaque+field->num_offset);
1396             }
1397             if (field->flags & VMS_POINTER) {
1398                 base_addr = *(void **)base_addr + field->start;
1399             }
1400             for (i = 0; i < n_elems; i++) {
1401                 void *addr = base_addr + size * i;
1402 
1403                 if (field->flags & VMS_ARRAY_OF_POINTER) {
1404                     addr = *(void **)addr;
1405                 }
1406                 if (field->flags & VMS_STRUCT) {
1407                     vmstate_save_state(f, field->vmsd, addr);
1408                 } else {
1409                     field->info->put(f, addr, size);
1410                 }
1411             }
1412         }
1413         field++;
1414     }
1415     vmstate_subsection_save(f, vmsd, opaque);
1416 }
1417 
vmstate_load(QEMUFile * f,SaveStateEntry * se,int version_id)1418 static int vmstate_load(QEMUFile *f, SaveStateEntry *se, int version_id)
1419 {
1420     if (!se->vmsd) {         /* Old style */
1421         return se->load_state(f, se->opaque, version_id);
1422     }
1423     return vmstate_load_state(f, se->vmsd, se->opaque, version_id);
1424 }
1425 
vmstate_save(QEMUFile * f,SaveStateEntry * se)1426 static void vmstate_save(QEMUFile *f, SaveStateEntry *se)
1427 {
1428     if (!se->vmsd) {         /* Old style */
1429         se->save_state(f, se->opaque);
1430         return;
1431     }
1432     vmstate_save_state(f,se->vmsd, se->opaque);
1433 }
1434 
1435 #define QEMU_VM_FILE_MAGIC           0x5145564d
1436 #define QEMU_VM_FILE_VERSION_COMPAT  0x00000002
1437 #define QEMU_VM_FILE_VERSION         0x00000003
1438 
1439 #define QEMU_VM_EOF                  0x00
1440 #define QEMU_VM_SECTION_START        0x01
1441 #define QEMU_VM_SECTION_PART         0x02
1442 #define QEMU_VM_SECTION_END          0x03
1443 #define QEMU_VM_SECTION_FULL         0x04
1444 #define QEMU_VM_SUBSECTION           0x05
1445 
qemu_savevm_state_blocked(Monitor * mon)1446 bool qemu_savevm_state_blocked(Monitor *mon)
1447 {
1448     SaveStateEntry *se;
1449 
1450     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1451         if (se->no_migrate) {
1452             monitor_printf(mon, "state blocked by non-migratable device '%s'\n",
1453                            se->idstr);
1454             return true;
1455         }
1456     }
1457     return false;
1458 }
1459 
qemu_savevm_state_begin(Monitor * mon,QEMUFile * f,int blk_enable,int shared)1460 int qemu_savevm_state_begin(Monitor *mon, QEMUFile *f, int blk_enable,
1461                             int shared)
1462 {
1463     SaveStateEntry *se;
1464 
1465     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1466         if(se->set_params == NULL) {
1467             continue;
1468 	}
1469 	se->set_params(blk_enable, shared, se->opaque);
1470     }
1471 
1472     qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
1473     qemu_put_be32(f, QEMU_VM_FILE_VERSION);
1474 
1475     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1476         int len;
1477 
1478         if (se->save_live_state == NULL)
1479             continue;
1480 
1481         /* Section type */
1482         qemu_put_byte(f, QEMU_VM_SECTION_START);
1483         qemu_put_be32(f, se->section_id);
1484 
1485         /* ID string */
1486         len = strlen(se->idstr);
1487         qemu_put_byte(f, len);
1488         qemu_put_buffer(f, (uint8_t *)se->idstr, len);
1489 
1490         qemu_put_be32(f, se->instance_id);
1491         qemu_put_be32(f, se->version_id);
1492 
1493         se->save_live_state(mon, f, QEMU_VM_SECTION_START, se->opaque);
1494     }
1495 
1496     if (qemu_file_has_error(f)) {
1497         qemu_savevm_state_cancel(mon, f);
1498         return -EIO;
1499     }
1500 
1501     return 0;
1502 }
1503 
qemu_savevm_state_iterate(Monitor * mon,QEMUFile * f)1504 int qemu_savevm_state_iterate(Monitor *mon, QEMUFile *f)
1505 {
1506     SaveStateEntry *se;
1507     int ret = 1;
1508 
1509     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1510         if (se->save_live_state == NULL)
1511             continue;
1512 
1513         /* Section type */
1514         qemu_put_byte(f, QEMU_VM_SECTION_PART);
1515         qemu_put_be32(f, se->section_id);
1516 
1517         ret = se->save_live_state(mon, f, QEMU_VM_SECTION_PART, se->opaque);
1518         if (!ret) {
1519             /* Do not proceed to the next vmstate before this one reported
1520                completion of the current stage. This serializes the migration
1521                and reduces the probability that a faster changing state is
1522                synchronized over and over again. */
1523             break;
1524         }
1525     }
1526 
1527     if (ret)
1528         return 1;
1529 
1530     if (qemu_file_has_error(f)) {
1531         qemu_savevm_state_cancel(mon, f);
1532         return -EIO;
1533     }
1534 
1535     return 0;
1536 }
1537 
qemu_savevm_state_complete(Monitor * mon,QEMUFile * f)1538 int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f)
1539 {
1540     SaveStateEntry *se;
1541 
1542     cpu_synchronize_all_states();
1543 
1544     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1545         if (se->save_live_state == NULL)
1546             continue;
1547 
1548         /* Section type */
1549         qemu_put_byte(f, QEMU_VM_SECTION_END);
1550         qemu_put_be32(f, se->section_id);
1551 
1552         se->save_live_state(mon, f, QEMU_VM_SECTION_END, se->opaque);
1553     }
1554 
1555     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1556         int len;
1557 
1558 	if (se->save_state == NULL && se->vmsd == NULL)
1559 	    continue;
1560 
1561         /* Section type */
1562         qemu_put_byte(f, QEMU_VM_SECTION_FULL);
1563         qemu_put_be32(f, se->section_id);
1564 
1565         /* ID string */
1566         len = strlen(se->idstr);
1567         qemu_put_byte(f, len);
1568         qemu_put_buffer(f, (uint8_t *)se->idstr, len);
1569 
1570         qemu_put_be32(f, se->instance_id);
1571         qemu_put_be32(f, se->version_id);
1572 
1573         vmstate_save(f, se);
1574     }
1575 
1576     qemu_put_byte(f, QEMU_VM_EOF);
1577 
1578     if (qemu_file_has_error(f))
1579         return -EIO;
1580 
1581     return 0;
1582 }
1583 
qemu_savevm_state_cancel(Monitor * mon,QEMUFile * f)1584 void qemu_savevm_state_cancel(Monitor *mon, QEMUFile *f)
1585 {
1586     SaveStateEntry *se;
1587 
1588     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1589         if (se->save_live_state) {
1590             se->save_live_state(mon, f, -1, se->opaque);
1591         }
1592     }
1593 }
1594 
qemu_savevm_state(Monitor * mon,QEMUFile * f)1595 static int qemu_savevm_state(Monitor *mon, QEMUFile *f)
1596 {
1597     int saved_vm_running;
1598     int ret;
1599 
1600     saved_vm_running = vm_running;
1601     vm_stop(0);
1602 
1603     if (qemu_savevm_state_blocked(mon)) {
1604         ret = -EINVAL;
1605         goto out;
1606     }
1607 
1608     ret = qemu_savevm_state_begin(mon, f, 0, 0);
1609     if (ret < 0)
1610         goto out;
1611 
1612     do {
1613         ret = qemu_savevm_state_iterate(mon, f);
1614         if (ret < 0)
1615             goto out;
1616     } while (ret == 0);
1617 
1618     ret = qemu_savevm_state_complete(mon, f);
1619 
1620 out:
1621     if (qemu_file_has_error(f))
1622         ret = -EIO;
1623 
1624     if (!ret && saved_vm_running)
1625         vm_start();
1626 
1627     return ret;
1628 }
1629 
find_se(const char * idstr,int instance_id)1630 static SaveStateEntry *find_se(const char *idstr, int instance_id)
1631 {
1632     SaveStateEntry *se;
1633 
1634     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1635         if (!strcmp(se->idstr, idstr) &&
1636             (instance_id == se->instance_id ||
1637              instance_id == se->alias_id))
1638             return se;
1639         /* Migrating from an older version? */
1640         if (strstr(se->idstr, idstr) && se->compat) {
1641             if (!strcmp(se->compat->idstr, idstr) &&
1642                 (instance_id == se->compat->instance_id ||
1643                  instance_id == se->alias_id))
1644                 return se;
1645         }
1646     }
1647     return NULL;
1648 }
1649 
vmstate_get_subsection(const VMStateSubsection * sub,char * idstr)1650 static const VMStateDescription *vmstate_get_subsection(const VMStateSubsection *sub, char *idstr)
1651 {
1652     while(sub && sub->needed) {
1653         if (strcmp(idstr, sub->vmsd->name) == 0) {
1654             return sub->vmsd;
1655         }
1656         sub++;
1657     }
1658     return NULL;
1659 }
1660 
vmstate_subsection_load(QEMUFile * f,const VMStateDescription * vmsd,void * opaque)1661 static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
1662                                    void *opaque)
1663 {
1664     const VMStateSubsection *sub = vmsd->subsections;
1665 
1666     if (!sub || !sub->needed) {
1667         return 0;
1668     }
1669 
1670     while (qemu_peek_byte(f) == QEMU_VM_SUBSECTION) {
1671         char idstr[256];
1672         int ret;
1673         uint8_t version_id, len;
1674         const VMStateDescription *sub_vmsd;
1675 
1676         qemu_get_byte(f); /* subsection */
1677         len = qemu_get_byte(f);
1678         qemu_get_buffer(f, (uint8_t *)idstr, len);
1679         idstr[len] = 0;
1680         version_id = qemu_get_be32(f);
1681 
1682         sub_vmsd = vmstate_get_subsection(sub, idstr);
1683         if (sub_vmsd == NULL) {
1684             return -ENOENT;
1685         }
1686         assert(!sub_vmsd->subsections);
1687         ret = vmstate_load_state(f, sub_vmsd, opaque, version_id);
1688         if (ret) {
1689             return ret;
1690         }
1691     }
1692     return 0;
1693 }
1694 
vmstate_subsection_save(QEMUFile * f,const VMStateDescription * vmsd,void * opaque)1695 static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
1696                                     void *opaque)
1697 {
1698     const VMStateSubsection *sub = vmsd->subsections;
1699 
1700     while (sub && sub->needed) {
1701         if (sub->needed(opaque)) {
1702             const VMStateDescription *vmsd = sub->vmsd;
1703             uint8_t len;
1704 
1705             qemu_put_byte(f, QEMU_VM_SUBSECTION);
1706             len = strlen(vmsd->name);
1707             qemu_put_byte(f, len);
1708             qemu_put_buffer(f, (uint8_t *)vmsd->name, len);
1709             qemu_put_be32(f, vmsd->version_id);
1710             assert(!vmsd->subsections);
1711             vmstate_save_state(f, vmsd, opaque);
1712         }
1713         sub++;
1714     }
1715 }
1716 
1717 typedef struct LoadStateEntry {
1718     QLIST_ENTRY(LoadStateEntry) entry;
1719     SaveStateEntry *se;
1720     int section_id;
1721     int version_id;
1722 } LoadStateEntry;
1723 
qemu_loadvm_state(QEMUFile * f)1724 int qemu_loadvm_state(QEMUFile *f)
1725 {
1726     QLIST_HEAD(, LoadStateEntry) loadvm_handlers =
1727         QLIST_HEAD_INITIALIZER(loadvm_handlers);
1728     LoadStateEntry *le, *new_le;
1729     uint8_t section_type;
1730     unsigned int v;
1731     int ret;
1732 
1733     if (qemu_savevm_state_blocked(default_mon)) {
1734         return -EINVAL;
1735     }
1736 
1737     v = qemu_get_be32(f);
1738     if (v != QEMU_VM_FILE_MAGIC)
1739         return -EINVAL;
1740 
1741     v = qemu_get_be32(f);
1742     if (v == QEMU_VM_FILE_VERSION_COMPAT) {
1743         fprintf(stderr, "SaveVM v2 format is obsolete and don't work anymore\n");
1744         return -ENOTSUP;
1745     }
1746     if (v != QEMU_VM_FILE_VERSION)
1747         return -ENOTSUP;
1748 
1749     while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) {
1750         uint32_t instance_id, version_id, section_id;
1751         SaveStateEntry *se;
1752         char idstr[257];
1753         int len;
1754 
1755         switch (section_type) {
1756         case QEMU_VM_SECTION_START:
1757         case QEMU_VM_SECTION_FULL:
1758             /* Read section start */
1759             section_id = qemu_get_be32(f);
1760             len = qemu_get_byte(f);
1761             qemu_get_buffer(f, (uint8_t *)idstr, len);
1762             idstr[len] = 0;
1763             instance_id = qemu_get_be32(f);
1764             version_id = qemu_get_be32(f);
1765 
1766             /* Find savevm section */
1767             se = find_se(idstr, instance_id);
1768             if (se == NULL) {
1769                 fprintf(stderr, "Unknown savevm section or instance '%s' %d\n", idstr, instance_id);
1770                 ret = -EINVAL;
1771                 goto out;
1772             }
1773 
1774             /* Validate version */
1775             if (version_id > se->version_id) {
1776                 fprintf(stderr, "savevm: unsupported version %d for '%s' v%d\n",
1777                         version_id, idstr, se->version_id);
1778                 ret = -EINVAL;
1779                 goto out;
1780             }
1781 
1782             /* Add entry */
1783             le = qemu_mallocz(sizeof(*le));
1784 
1785             le->se = se;
1786             le->section_id = section_id;
1787             le->version_id = version_id;
1788             QLIST_INSERT_HEAD(&loadvm_handlers, le, entry);
1789 
1790             ret = vmstate_load(f, le->se, le->version_id);
1791             if (ret < 0) {
1792                 fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n",
1793                         instance_id, idstr);
1794                 goto out;
1795             }
1796             break;
1797         case QEMU_VM_SECTION_PART:
1798         case QEMU_VM_SECTION_END:
1799             section_id = qemu_get_be32(f);
1800 
1801             QLIST_FOREACH(le, &loadvm_handlers, entry) {
1802                 if (le->section_id == section_id) {
1803                     break;
1804                 }
1805             }
1806             if (le == NULL) {
1807                 fprintf(stderr, "Unknown savevm section %d\n", section_id);
1808                 ret = -EINVAL;
1809                 goto out;
1810             }
1811 
1812             ret = vmstate_load(f, le->se, le->version_id);
1813             if (ret < 0) {
1814                 fprintf(stderr, "qemu: warning: error while loading state section id %d\n",
1815                         section_id);
1816                 goto out;
1817             }
1818             break;
1819         default:
1820             fprintf(stderr, "Unknown savevm section type %d\n", section_type);
1821             ret = -EINVAL;
1822             goto out;
1823         }
1824     }
1825 
1826     cpu_synchronize_all_post_init();
1827 
1828     ret = 0;
1829 
1830 out:
1831     QLIST_FOREACH_SAFE(le, &loadvm_handlers, entry, new_le) {
1832         QLIST_REMOVE(le, entry);
1833         qemu_free(le);
1834     }
1835 
1836     if (qemu_file_has_error(f))
1837         ret = -EIO;
1838 
1839     return ret;
1840 }
1841 
bdrv_snapshot_find(BlockDriverState * bs,QEMUSnapshotInfo * sn_info,const char * name)1842 static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
1843                               const char *name)
1844 {
1845     QEMUSnapshotInfo *sn_tab, *sn;
1846     int nb_sns, i, ret;
1847 
1848     ret = -ENOENT;
1849     nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1850     if (nb_sns < 0)
1851         return ret;
1852     for(i = 0; i < nb_sns; i++) {
1853         sn = &sn_tab[i];
1854         if (!strcmp(sn->id_str, name) || !strcmp(sn->name, name)) {
1855             *sn_info = *sn;
1856             ret = 0;
1857             break;
1858         }
1859     }
1860     qemu_free(sn_tab);
1861     return ret;
1862 }
1863 
1864 /*
1865  * Deletes snapshots of a given name in all opened images.
1866  */
del_existing_snapshots(Monitor * mon,const char * name)1867 static int del_existing_snapshots(Monitor *mon, const char *name)
1868 {
1869     BlockDriverState *bs;
1870     QEMUSnapshotInfo sn1, *snapshot = &sn1;
1871     int ret;
1872 
1873     bs = NULL;
1874     while ((bs = bdrv_next(bs))) {
1875         if (bdrv_can_snapshot(bs) &&
1876             bdrv_snapshot_find(bs, snapshot, name) >= 0)
1877         {
1878             ret = bdrv_snapshot_delete(bs, name);
1879             if (ret < 0) {
1880                 monitor_printf(mon,
1881                                "Error while deleting snapshot on '%s'\n",
1882                                bdrv_get_device_name(bs));
1883                 return -1;
1884             }
1885         }
1886     }
1887 
1888     return 0;
1889 }
1890 
do_savevm(Monitor * mon,const QDict * qdict)1891 void do_savevm(Monitor *mon, const QDict *qdict)
1892 {
1893     BlockDriverState *bs, *bs1;
1894     QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
1895     int ret;
1896     QEMUFile *f;
1897     int saved_vm_running;
1898     uint32_t vm_state_size;
1899 #ifdef _WIN32
1900     struct _timeb tb;
1901     struct tm *ptm;
1902 #else
1903     struct timeval tv;
1904     struct tm tm;
1905 #endif
1906     const char *name = qdict_get_try_str(qdict, "name");
1907 
1908     /* Verify if there is a device that doesn't support snapshots and is writable */
1909     bs = NULL;
1910     while ((bs = bdrv_next(bs))) {
1911 
1912         if (bdrv_is_removable(bs) || bdrv_is_read_only(bs)) {
1913             continue;
1914         }
1915 
1916         if (!bdrv_can_snapshot(bs)) {
1917             monitor_printf(mon, "Device '%s' is writable but does not support snapshots.\n",
1918                                bdrv_get_device_name(bs));
1919             return;
1920         }
1921     }
1922 
1923     bs = bdrv_snapshots();
1924     if (!bs) {
1925         monitor_printf(mon, "No block device can accept snapshots\n");
1926         return;
1927     }
1928 
1929     saved_vm_running = vm_running;
1930     vm_stop(0);
1931 
1932     memset(sn, 0, sizeof(*sn));
1933 
1934     /* fill auxiliary fields */
1935 #ifdef _WIN32
1936     _ftime(&tb);
1937     sn->date_sec = tb.time;
1938     sn->date_nsec = tb.millitm * 1000000;
1939 #else
1940     gettimeofday(&tv, NULL);
1941     sn->date_sec = tv.tv_sec;
1942     sn->date_nsec = tv.tv_usec * 1000;
1943 #endif
1944     sn->vm_clock_nsec = qemu_get_clock(vm_clock);
1945 
1946     if (name) {
1947         ret = bdrv_snapshot_find(bs, old_sn, name);
1948         if (ret >= 0) {
1949             pstrcpy(sn->name, sizeof(sn->name), old_sn->name);
1950             pstrcpy(sn->id_str, sizeof(sn->id_str), old_sn->id_str);
1951         } else {
1952             pstrcpy(sn->name, sizeof(sn->name), name);
1953         }
1954     } else {
1955 #ifdef _WIN32
1956         ptm = localtime(&tb.time);
1957         strftime(sn->name, sizeof(sn->name), "vm-%Y%m%d%H%M%S", ptm);
1958 #else
1959         /* cast below needed for OpenBSD where tv_sec is still 'long' */
1960         localtime_r((const time_t *)&tv.tv_sec, &tm);
1961         strftime(sn->name, sizeof(sn->name), "vm-%Y%m%d%H%M%S", &tm);
1962 #endif
1963     }
1964 
1965     /* Delete old snapshots of the same name */
1966     if (name && del_existing_snapshots(mon, name) < 0) {
1967         goto the_end;
1968     }
1969 
1970     /* save the VM state */
1971     f = qemu_fopen_bdrv(bs, 1);
1972     if (!f) {
1973         monitor_printf(mon, "Could not open VM state file\n");
1974         goto the_end;
1975     }
1976     ret = qemu_savevm_state(mon, f);
1977     vm_state_size = qemu_ftell(f);
1978     qemu_fclose(f);
1979     if (ret < 0) {
1980         monitor_printf(mon, "Error %d while writing VM\n", ret);
1981         goto the_end;
1982     }
1983 
1984     /* create the snapshots */
1985 
1986     bs1 = NULL;
1987     while ((bs1 = bdrv_next(bs1))) {
1988         if (bdrv_can_snapshot(bs1)) {
1989             /* Write VM state size only to the image that contains the state */
1990             sn->vm_state_size = (bs == bs1 ? vm_state_size : 0);
1991             ret = bdrv_snapshot_create(bs1, sn);
1992             if (ret < 0) {
1993                 monitor_printf(mon, "Error while creating snapshot on '%s'\n",
1994                                bdrv_get_device_name(bs1));
1995             }
1996         }
1997     }
1998 
1999  the_end:
2000     if (saved_vm_running)
2001         vm_start();
2002 }
2003 
load_vmstate(const char * name)2004 int load_vmstate(const char *name)
2005 {
2006     BlockDriverState *bs, *bs_vm_state;
2007     QEMUSnapshotInfo sn;
2008     QEMUFile *f;
2009     int ret;
2010 
2011     bs_vm_state = bdrv_snapshots();
2012     if (!bs_vm_state) {
2013         error_report("No block device supports snapshots");
2014         return -ENOTSUP;
2015     }
2016 
2017     /* Don't even try to load empty VM states */
2018     ret = bdrv_snapshot_find(bs_vm_state, &sn, name);
2019     if (ret < 0) {
2020         return ret;
2021     } else if (sn.vm_state_size == 0) {
2022         return -EINVAL;
2023     }
2024 
2025     /* Verify if there is any device that doesn't support snapshots and is
2026     writable and check if the requested snapshot is available too. */
2027     bs = NULL;
2028     while ((bs = bdrv_next(bs))) {
2029 
2030         if (bdrv_is_removable(bs) || bdrv_is_read_only(bs)) {
2031             continue;
2032         }
2033 
2034         if (!bdrv_can_snapshot(bs)) {
2035             error_report("Device '%s' is writable but does not support snapshots.",
2036                                bdrv_get_device_name(bs));
2037             return -ENOTSUP;
2038         }
2039 
2040         ret = bdrv_snapshot_find(bs, &sn, name);
2041         if (ret < 0) {
2042             error_report("Device '%s' does not have the requested snapshot '%s'",
2043                            bdrv_get_device_name(bs), name);
2044             return ret;
2045         }
2046     }
2047 
2048     /* Flush all IO requests so they don't interfere with the new state.  */
2049     qemu_aio_flush();
2050 
2051     bs = NULL;
2052     while ((bs = bdrv_next(bs))) {
2053         if (bdrv_can_snapshot(bs)) {
2054             ret = bdrv_snapshot_goto(bs, name);
2055             if (ret < 0) {
2056                 error_report("Error %d while activating snapshot '%s' on '%s'",
2057                              ret, name, bdrv_get_device_name(bs));
2058                 return ret;
2059             }
2060         }
2061     }
2062 
2063     /* restore the VM state */
2064     f = qemu_fopen_bdrv(bs_vm_state, 0);
2065     if (!f) {
2066         error_report("Could not open VM state file");
2067         return -EINVAL;
2068     }
2069 
2070     ret = qemu_loadvm_state(f);
2071 
2072     qemu_fclose(f);
2073     if (ret < 0) {
2074         error_report("Error %d while loading VM state", ret);
2075         return ret;
2076     }
2077 
2078     return 0;
2079 }
2080 
do_delvm(Monitor * mon,const QDict * qdict)2081 void do_delvm(Monitor *mon, const QDict *qdict)
2082 {
2083     BlockDriverState *bs, *bs1;
2084     int ret;
2085     const char *name = qdict_get_str(qdict, "name");
2086 
2087     bs = bdrv_snapshots();
2088     if (!bs) {
2089         monitor_printf(mon, "No block device supports snapshots\n");
2090         return;
2091     }
2092 
2093     bs1 = NULL;
2094     while ((bs1 = bdrv_next(bs1))) {
2095         if (bdrv_can_snapshot(bs1)) {
2096             ret = bdrv_snapshot_delete(bs1, name);
2097             if (ret < 0) {
2098                 if (ret == -ENOTSUP)
2099                     monitor_printf(mon,
2100                                    "Snapshots not supported on device '%s'\n",
2101                                    bdrv_get_device_name(bs1));
2102                 else
2103                     monitor_printf(mon, "Error %d while deleting snapshot on "
2104                                    "'%s'\n", ret, bdrv_get_device_name(bs1));
2105             }
2106         }
2107     }
2108 }
2109 
do_info_snapshots(Monitor * mon)2110 void do_info_snapshots(Monitor *mon)
2111 {
2112     BlockDriverState *bs, *bs1;
2113     QEMUSnapshotInfo *sn_tab, *sn, s, *sn_info = &s;
2114     int nb_sns, i, ret, available;
2115     int total;
2116     int *available_snapshots;
2117     char buf[256];
2118 
2119     bs = bdrv_snapshots();
2120     if (!bs) {
2121         monitor_printf(mon, "No available block device supports snapshots\n");
2122         return;
2123     }
2124 
2125     nb_sns = bdrv_snapshot_list(bs, &sn_tab);
2126     if (nb_sns < 0) {
2127         monitor_printf(mon, "bdrv_snapshot_list: error %d\n", nb_sns);
2128         return;
2129     }
2130 
2131     if (nb_sns == 0) {
2132         monitor_printf(mon, "There is no snapshot available.\n");
2133         return;
2134     }
2135 
2136     available_snapshots = qemu_mallocz(sizeof(int) * nb_sns);
2137     total = 0;
2138     for (i = 0; i < nb_sns; i++) {
2139         sn = &sn_tab[i];
2140         available = 1;
2141         bs1 = NULL;
2142 
2143         while ((bs1 = bdrv_next(bs1))) {
2144             if (bdrv_can_snapshot(bs1) && bs1 != bs) {
2145                 ret = bdrv_snapshot_find(bs1, sn_info, sn->id_str);
2146                 if (ret < 0) {
2147                     available = 0;
2148                     break;
2149                 }
2150             }
2151         }
2152 
2153         if (available) {
2154             available_snapshots[total] = i;
2155             total++;
2156         }
2157     }
2158 
2159     if (total > 0) {
2160         monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
2161         for (i = 0; i < total; i++) {
2162             sn = &sn_tab[available_snapshots[i]];
2163             monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
2164         }
2165     } else {
2166         monitor_printf(mon, "There is no suitable snapshot available\n");
2167     }
2168 
2169     qemu_free(sn_tab);
2170     qemu_free(available_snapshots);
2171 
2172 }
2173