• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/net.h"
77 #include "monitor/monitor.h"
78 #include "sysemu/sysemu.h"
79 #include "sysemu/char.h"
80 #include "sysemu/blockdev.h"
81 #include "block/block.h"
82 #include "audio/audio.h"
83 #include "migration/migration.h"
84 #include "migration/qemu-file.h"
85 #include "migration/vmstate.h"
86 #include "qemu/bitmap.h"
87 #include "qemu/iov.h"
88 #include "qemu/sockets.h"
89 #include "qemu/timer.h"
90 #include "qemu/queue.h"
91 #include "android/snapshot.h"
92 
93 
94 #define SELF_ANNOUNCE_ROUNDS 5
95 
96 #ifndef ETH_P_RARP
97 #define ETH_P_RARP 0x8035
98 #endif
99 #define ARP_HTYPE_ETH 0x0001
100 #define ARP_PTYPE_IP 0x0800
101 #define ARP_OP_REQUEST_REV 0x3
102 
announce_self_create(uint8_t * buf,uint8_t * mac_addr)103 static int announce_self_create(uint8_t *buf,
104 				uint8_t *mac_addr)
105 {
106     /* Ethernet header. */
107     memset(buf, 0xff, 6);         /* destination MAC addr */
108     memcpy(buf + 6, mac_addr, 6); /* source MAC addr */
109     *(uint16_t *)(buf + 12) = htons(ETH_P_RARP); /* ethertype */
110 
111     /* RARP header. */
112     *(uint16_t *)(buf + 14) = htons(ARP_HTYPE_ETH); /* hardware addr space */
113     *(uint16_t *)(buf + 16) = htons(ARP_PTYPE_IP); /* protocol addr space */
114     *(buf + 18) = 6; /* hardware addr length (ethernet) */
115     *(buf + 19) = 4; /* protocol addr length (IPv4) */
116     *(uint16_t *)(buf + 20) = htons(ARP_OP_REQUEST_REV); /* opcode */
117     memcpy(buf + 22, mac_addr, 6); /* source hw addr */
118     memset(buf + 28, 0x00, 4);     /* source protocol addr */
119     memcpy(buf + 32, mac_addr, 6); /* target hw addr */
120     memset(buf + 38, 0x00, 4);     /* target protocol addr */
121 
122     /* Padding to get up to 60 bytes (ethernet min packet size, minus FCS). */
123     memset(buf + 42, 0x00, 18);
124 
125     return 60; /* len (FCS will be added by hardware) */
126 }
127 
qemu_announce_self_once(void * opaque)128 static void qemu_announce_self_once(void *opaque)
129 {
130     int i, len;
131     VLANState *vlan;
132     VLANClientState *vc;
133     uint8_t buf[256];
134     static int count = SELF_ANNOUNCE_ROUNDS;
135     QEMUTimer *timer = *(QEMUTimer **)opaque;
136 
137     for (i = 0; i < MAX_NICS; i++) {
138         if (!nd_table[i].used)
139             continue;
140         len = announce_self_create(buf, nd_table[i].macaddr);
141         vlan = nd_table[i].vlan;
142 	for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
143             vc->receive(vc, buf, len);
144         }
145     }
146     if (--count) {
147         /* delay 50ms, 150ms, 250ms, ... */
148         timer_mod(timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) +
149                        50 + (SELF_ANNOUNCE_ROUNDS - count - 1) * 100);
150     } else {
151 	    timer_del(timer);
152 	    timer_free(timer);
153     }
154 }
155 
qemu_announce_self(void)156 void qemu_announce_self(void)
157 {
158 	static QEMUTimer *timer;
159 	timer = timer_new_ms(QEMU_CLOCK_REALTIME, qemu_announce_self_once, &timer);
160 	qemu_announce_self_once(&timer);
161 }
162 
163 /***********************************************************/
164 /* savevm/loadvm support */
165 
166 void yield_until_fd_readable(int fd);
167 
168 #define IO_BUF_SIZE 32768
169 #define MAX_IOV_SIZE MIN(IOV_MAX, 64)
170 
171 struct QEMUFile {
172     const QEMUFileOps *ops;
173     void *opaque;
174 
175     int64_t bytes_xfer;
176     int64_t xfer_limit;
177 
178     int64_t pos; /* start of buffer when writing, end of buffer
179                     when reading */
180     int buf_index;
181     int buf_size; /* 0 when writing */
182     uint8_t buf[IO_BUF_SIZE];
183 
184     struct iovec iov[MAX_IOV_SIZE];
185     unsigned int iovcnt;
186 
187     int last_error;
188 };
189 
190 typedef struct QEMUFileStdio
191 {
192     FILE *stdio_file;
193     QEMUFile *file;
194 } QEMUFileStdio;
195 
196 typedef struct QEMUFileSocket
197 {
198     int fd;
199     QEMUFile *file;
200 } QEMUFileSocket;
201 
socket_writev_buffer(void * opaque,struct iovec * iov,int iovcnt,int64_t pos)202 static ssize_t socket_writev_buffer(void *opaque, struct iovec *iov, int iovcnt,
203                                     int64_t pos)
204 {
205     QEMUFileSocket *s = opaque;
206     ssize_t len;
207     ssize_t size = iov_size(iov, iovcnt);
208 
209     len = iov_send(s->fd, iov, iovcnt, 0, size);
210     if (len < size) {
211         len = -socket_error();
212     }
213     return len;
214 }
215 
socket_get_fd(void * opaque)216 static int socket_get_fd(void *opaque)
217 {
218     QEMUFileSocket *s = opaque;
219 
220     return s->fd;
221 }
222 
socket_get_buffer(void * opaque,uint8_t * buf,int64_t pos,int size)223 static int socket_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
224 {
225     QEMUFileSocket *s = opaque;
226     ssize_t len;
227 
228     for (;;) {
229         len = qemu_recv(s->fd, buf, size, 0);
230         if (len != -1) {
231             break;
232         }
233 #ifndef CONFIG_ANDROID
234         if (socket_error() == EAGAIN) {
235             yield_until_fd_readable(s->fd);
236         } else if (socket_error() != EINTR) {
237             break;
238         }
239 #else
240        if (socket_error() != EINTR)
241            break;
242 #endif
243     }
244 
245     if (len == -1) {
246         len = -socket_error();
247     }
248     return len;
249 }
250 
file_socket_close(void * opaque)251 static int file_socket_close(void *opaque)
252 {
253     QEMUFileSocket *s = opaque;
254     if (s->fd >= 0)
255         socket_close(s->fd);
256     g_free(s);
257     return 0;
258 }
259 
stdio_get_fd(void * opaque)260 static int stdio_get_fd(void *opaque)
261 {
262     QEMUFileStdio *s = opaque;
263 
264     return fileno(s->stdio_file);
265 }
266 
stdio_put_buffer(void * opaque,const uint8_t * buf,int64_t pos,int size)267 static int stdio_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size)
268 {
269     QEMUFileStdio *s = opaque;
270     return fwrite(buf, 1, size, s->stdio_file);
271 }
272 
stdio_get_buffer(void * opaque,uint8_t * buf,int64_t pos,int size)273 static int stdio_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
274 {
275     QEMUFileStdio *s = opaque;
276     FILE *fp = s->stdio_file;
277     int bytes;
278 
279     for (;;) {
280         clearerr(fp);
281         bytes = fread(buf, 1, size, fp);
282         if (bytes != 0 || !ferror(fp)) {
283             break;
284         }
285 #ifndef CONFIG_ANDROID
286         if (errno == EAGAIN) {
287             yield_until_fd_readable(fileno(fp));
288         } else if (errno != EINTR) {
289             break;
290         }
291 #else
292         if (errno != EINTR)
293             break;
294 #endif
295     }
296     return bytes;
297 }
298 
stdio_pclose(void * opaque)299 static int stdio_pclose(void *opaque)
300 {
301     QEMUFileStdio *s = opaque;
302     int ret;
303     ret = pclose(s->stdio_file);
304     if (ret == -1) {
305         ret = -errno;
306     } else if (!WIFEXITED(ret) || WEXITSTATUS(ret) != 0) {
307         /* close succeeded, but non-zero exit code: */
308         ret = -EIO; /* fake errno value */
309     }
310     g_free(s);
311     return ret;
312 }
313 
stdio_fclose(void * opaque)314 static int stdio_fclose(void *opaque)
315 {
316     QEMUFileStdio *s = opaque;
317     int ret = 0;
318 
319     if (s->file->ops->put_buffer || s->file->ops->writev_buffer) {
320         int fd = fileno(s->stdio_file);
321         struct stat st;
322 
323         ret = fstat(fd, &st);
324         if (ret == 0 && S_ISREG(st.st_mode)) {
325             /*
326              * If the file handle is a regular file make sure the
327              * data is flushed to disk before signaling success.
328              */
329             ret = fsync(fd);
330             if (ret != 0) {
331                 ret = -errno;
332                 return ret;
333             }
334         }
335     }
336     if (fclose(s->stdio_file) == EOF) {
337         ret = -errno;
338     }
339     g_free(s);
340     return ret;
341 }
342 
343 static const QEMUFileOps stdio_pipe_read_ops = {
344     .get_fd =     stdio_get_fd,
345     .get_buffer = stdio_get_buffer,
346     .close =      stdio_pclose
347 };
348 
349 static const QEMUFileOps stdio_pipe_write_ops = {
350     .get_fd =     stdio_get_fd,
351     .put_buffer = stdio_put_buffer,
352     .close =      stdio_pclose
353 };
354 
qemu_popen_cmd(const char * command,const char * mode)355 QEMUFile *qemu_popen_cmd(const char *command, const char *mode)
356 {
357     FILE *stdio_file;
358     QEMUFileStdio *s;
359 
360     if (mode == NULL || (mode[0] != 'r' && mode[0] != 'w') || mode[1] != 0) {
361         fprintf(stderr, "qemu_popen: Argument validity check failed\n");
362         return NULL;
363     }
364 
365     stdio_file = popen(command, mode);
366     if (stdio_file == NULL) {
367         return NULL;
368     }
369 
370     s = g_malloc0(sizeof(QEMUFileStdio));
371 
372     s->stdio_file = stdio_file;
373 
374     if(mode[0] == 'r') {
375         s->file = qemu_fopen_ops(s, &stdio_pipe_read_ops);
376     } else {
377         s->file = qemu_fopen_ops(s, &stdio_pipe_write_ops);
378     }
379     return s->file;
380 }
381 
382 static const QEMUFileOps stdio_file_read_ops = {
383     .get_fd =     stdio_get_fd,
384     .get_buffer = stdio_get_buffer,
385     .close =      stdio_fclose
386 };
387 
388 static const QEMUFileOps stdio_file_write_ops = {
389     .get_fd =     stdio_get_fd,
390     .put_buffer = stdio_put_buffer,
391     .close =      stdio_fclose
392 };
393 
unix_writev_buffer(void * opaque,struct iovec * iov,int iovcnt,int64_t pos)394 static ssize_t unix_writev_buffer(void *opaque, struct iovec *iov, int iovcnt,
395                                   int64_t pos)
396 {
397     QEMUFileSocket *s = opaque;
398     ssize_t len, offset;
399     ssize_t size = iov_size(iov, iovcnt);
400     ssize_t total = 0;
401 
402     assert(iovcnt > 0);
403     offset = 0;
404     while (size > 0) {
405         /* Find the next start position; skip all full-sized vector elements  */
406         while (offset >= iov[0].iov_len) {
407             offset -= iov[0].iov_len;
408             iov++, iovcnt--;
409         }
410 
411         /* skip `offset' bytes from the (now) first element, undo it on exit */
412         assert(iovcnt > 0);
413         iov[0].iov_base += offset;
414         iov[0].iov_len -= offset;
415 
416         do {
417             len = writev(s->fd, iov, iovcnt);
418         } while (len == -1 && errno == EINTR);
419         if (len == -1) {
420             return -errno;
421         }
422 
423         /* Undo the changes above */
424         iov[0].iov_base -= offset;
425         iov[0].iov_len += offset;
426 
427         /* Prepare for the next iteration */
428         offset += len;
429         total += len;
430         size -= len;
431     }
432 
433     return total;
434 }
435 
unix_get_buffer(void * opaque,uint8_t * buf,int64_t pos,int size)436 static int unix_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
437 {
438     QEMUFileSocket *s = opaque;
439     ssize_t len;
440 
441     for (;;) {
442         len = read(s->fd, buf, size);
443         if (len != -1) {
444             break;
445         }
446         if (errno == EAGAIN) {
447             yield_until_fd_readable(s->fd);
448         } else if (errno != EINTR) {
449             break;
450         }
451     }
452 
453     if (len == -1) {
454         len = -errno;
455     }
456     return len;
457 }
458 
unix_close(void * opaque)459 static int unix_close(void *opaque)
460 {
461     QEMUFileSocket *s = opaque;
462     close(s->fd);
463     g_free(s);
464     return 0;
465 }
466 
467 static const QEMUFileOps unix_read_ops = {
468     .get_fd =     socket_get_fd,
469     .get_buffer = unix_get_buffer,
470     .close =      unix_close
471 };
472 
473 static const QEMUFileOps unix_write_ops = {
474     .get_fd =     socket_get_fd,
475     .writev_buffer = unix_writev_buffer,
476     .close =      unix_close
477 };
478 
qemu_fdopen(int fd,const char * mode)479 QEMUFile *qemu_fdopen(int fd, const char *mode)
480 {
481     QEMUFileSocket *s;
482 
483     if (mode == NULL ||
484 	(mode[0] != 'r' && mode[0] != 'w') ||
485 	mode[1] != 'b' || mode[2] != 0) {
486         fprintf(stderr, "qemu_fdopen: Argument validity check failed\n");
487         return NULL;
488     }
489 
490     s = g_malloc0(sizeof(QEMUFileSocket));
491     s->fd = fd;
492 
493     if(mode[0] == 'r') {
494         s->file = qemu_fopen_ops(s, &unix_read_ops);
495     } else {
496         s->file = qemu_fopen_ops(s, &unix_write_ops);
497     }
498     return s->file;
499 }
500 
501 static const QEMUFileOps socket_read_ops = {
502     .get_fd =     socket_get_fd,
503     .get_buffer = socket_get_buffer,
504     .close = file_socket_close
505 };
506 
507 static const QEMUFileOps socket_write_ops = {
508     .get_fd =     socket_get_fd,
509     .writev_buffer = socket_writev_buffer,
510     .close = file_socket_close
511 };
512 
qemu_file_mode_is_not_valid(const char * mode)513 bool qemu_file_mode_is_not_valid(const char *mode)
514 {
515     if (mode == NULL ||
516         (mode[0] != 'r' && mode[0] != 'w') ||
517         mode[1] != 'b' || mode[2] != 0) {
518         fprintf(stderr, "qemu_fopen: Argument validity check failed\n");
519         return true;
520     }
521 
522     return false;
523 }
524 
qemu_fopen_socket(int fd,const char * mode)525 QEMUFile *qemu_fopen_socket(int fd, const char *mode)
526 {
527     QEMUFileSocket *s;
528 
529     if (qemu_file_mode_is_not_valid(mode)) {
530         return NULL;
531     }
532 
533     s = g_malloc0(sizeof(QEMUFileSocket));
534     s->fd = fd;
535     if (mode[0] == 'w') {
536         qemu_set_block(s->fd);
537         s->file = qemu_fopen_ops(s, &socket_write_ops);
538     } else {
539         s->file = qemu_fopen_ops(s, &socket_read_ops);
540     }
541     return s->file;
542 }
543 
qemu_fopen(const char * filename,const char * mode)544 QEMUFile *qemu_fopen(const char *filename, const char *mode)
545 {
546     QEMUFileStdio *s;
547 
548     if (qemu_file_mode_is_not_valid(mode)) {
549         return NULL;
550     }
551 
552     s = g_malloc0(sizeof(QEMUFileStdio));
553 
554     s->stdio_file = fopen(filename, mode);
555     if (!s->stdio_file)
556         goto fail;
557 
558     if(mode[0] == 'w') {
559         s->file = qemu_fopen_ops(s, &stdio_file_write_ops);
560     } else {
561         s->file = qemu_fopen_ops(s, &stdio_file_read_ops);
562     }
563     return s->file;
564 fail:
565     g_free(s);
566     return NULL;
567 }
568 
569 #ifndef CONFIG_ANDROID
570 // TODO(digit): Once bdrv_writev_vmstate() is implemented.
block_writev_buffer(void * opaque,struct iovec * iov,int iovcnt,int64_t pos)571 static ssize_t block_writev_buffer(void *opaque, struct iovec *iov, int iovcnt,
572                                    int64_t pos)
573 {
574     int ret;
575     QEMUIOVector qiov;
576 
577     qemu_iovec_init_external(&qiov, iov, iovcnt);
578     ret = bdrv_writev_vmstate(opaque, &qiov, pos);
579     if (ret < 0) {
580         return ret;
581     }
582 
583     return qiov.size;
584 }
585 #endif
586 
block_put_buffer(void * opaque,const uint8_t * buf,int64_t pos,int size)587 static int block_put_buffer(void *opaque, const uint8_t *buf,
588                            int64_t pos, int size)
589 {
590     bdrv_save_vmstate(opaque, buf, pos, size);
591     return size;
592 }
593 
block_get_buffer(void * opaque,uint8_t * buf,int64_t pos,int size)594 static int block_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
595 {
596     return bdrv_load_vmstate(opaque, buf, pos, size);
597 }
598 
bdrv_fclose(void * opaque)599 static int bdrv_fclose(void *opaque)
600 {
601     // TODO(digit): bdrv_flush() should return error code.
602     bdrv_flush(opaque);
603     return 0;
604 }
605 
606 static const QEMUFileOps bdrv_read_ops = {
607     .get_buffer = block_get_buffer,
608     .close =      bdrv_fclose
609 };
610 
611 static const QEMUFileOps bdrv_write_ops = {
612     .put_buffer     = block_put_buffer,
613     //.writev_buffer  = block_writev_buffer,
614     .close          = bdrv_fclose
615 };
616 
qemu_fopen_bdrv(BlockDriverState * bs,int is_writable)617 static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int is_writable)
618 {
619     if (is_writable)
620         return qemu_fopen_ops(bs, &bdrv_write_ops);
621     return qemu_fopen_ops(bs, &bdrv_read_ops);
622 }
623 
qemu_fopen_ops(void * opaque,const QEMUFileOps * ops)624 QEMUFile *qemu_fopen_ops(void *opaque, const QEMUFileOps *ops)
625 {
626     QEMUFile *f;
627 
628     f = g_malloc0(sizeof(QEMUFile));
629 
630     f->opaque = opaque;
631     f->ops = ops;
632     return f;
633 }
634 
635 /*
636  * Get last error for stream f
637  *
638  * Return negative error value if there has been an error on previous
639  * operations, return 0 if no error happened.
640  *
641  */
qemu_file_get_error(QEMUFile * f)642 int qemu_file_get_error(QEMUFile *f)
643 {
644     return f->last_error;
645 }
646 
qemu_file_set_error(QEMUFile * f,int ret)647 void qemu_file_set_error(QEMUFile *f, int ret)
648 {
649     if (f->last_error == 0) {
650         f->last_error = ret;
651     }
652 }
653 
qemu_file_is_writable(QEMUFile * f)654 static inline bool qemu_file_is_writable(QEMUFile *f)
655 {
656     return f->ops->writev_buffer || f->ops->put_buffer;
657 }
658 
659 /**
660  * Flushes QEMUFile buffer
661  *
662  * If there is writev_buffer QEMUFileOps it uses it otherwise uses
663  * put_buffer ops.
664  */
qemu_fflush(QEMUFile * f)665 void qemu_fflush(QEMUFile *f)
666 {
667     ssize_t ret = 0;
668 
669     if (!qemu_file_is_writable(f)) {
670         return;
671     }
672 
673     if (f->ops->writev_buffer) {
674         if (f->iovcnt > 0) {
675             ret = f->ops->writev_buffer(f->opaque, f->iov, f->iovcnt, f->pos);
676         }
677     } else {
678         if (f->buf_index > 0) {
679             ret = f->ops->put_buffer(f->opaque, f->buf, f->pos, f->buf_index);
680         }
681     }
682     if (ret >= 0) {
683         f->pos += ret;
684     }
685     f->buf_index = 0;
686     f->iovcnt = 0;
687     if (ret < 0) {
688         qemu_file_set_error(f, ret);
689     }
690 }
691 
692 #ifndef CONFIG_ANDROID
693 // TODO(digit).
ram_control_before_iterate(QEMUFile * f,uint64_t flags)694 void ram_control_before_iterate(QEMUFile *f, uint64_t flags)
695 {
696     int ret = 0;
697 
698     if (f->ops->before_ram_iterate) {
699         ret = f->ops->before_ram_iterate(f, f->opaque, flags);
700         if (ret < 0) {
701             qemu_file_set_error(f, ret);
702         }
703     }
704 }
705 
ram_control_after_iterate(QEMUFile * f,uint64_t flags)706 void ram_control_after_iterate(QEMUFile *f, uint64_t flags)
707 {
708     int ret = 0;
709 
710     if (f->ops->after_ram_iterate) {
711         ret = f->ops->after_ram_iterate(f, f->opaque, flags);
712         if (ret < 0) {
713             qemu_file_set_error(f, ret);
714         }
715     }
716 }
717 
ram_control_load_hook(QEMUFile * f,uint64_t flags)718 void ram_control_load_hook(QEMUFile *f, uint64_t flags)
719 {
720     int ret = -EINVAL;
721 
722     if (f->ops->hook_ram_load) {
723         ret = f->ops->hook_ram_load(f, f->opaque, flags);
724         if (ret < 0) {
725             qemu_file_set_error(f, ret);
726         }
727     } else {
728         qemu_file_set_error(f, ret);
729     }
730 }
731 
ram_control_save_page(QEMUFile * f,ram_addr_t block_offset,ram_addr_t offset,size_t size,int * bytes_sent)732 size_t ram_control_save_page(QEMUFile *f, ram_addr_t block_offset,
733                          ram_addr_t offset, size_t size, int *bytes_sent)
734 {
735     if (f->ops->save_page) {
736         int ret = f->ops->save_page(f, f->opaque, block_offset,
737                                     offset, size, bytes_sent);
738 
739         if (ret != RAM_SAVE_CONTROL_DELAYED) {
740             if (bytes_sent && *bytes_sent > 0) {
741                 qemu_update_position(f, *bytes_sent);
742             } else if (ret < 0) {
743                 qemu_file_set_error(f, ret);
744             }
745         }
746 
747         return ret;
748     }
749 
750     return RAM_SAVE_CONTROL_NOT_SUPP;
751 }
752 #endif  // !CONFIG_ANDROID
753 
qemu_fill_buffer(QEMUFile * f)754 static void qemu_fill_buffer(QEMUFile *f)
755 {
756     int len;
757     int pending;
758 
759     assert(!qemu_file_is_writable(f));
760 
761     pending = f->buf_size - f->buf_index;
762     if (pending > 0) {
763         memmove(f->buf, f->buf + f->buf_index, pending);
764     }
765     f->buf_index = 0;
766     f->buf_size = pending;
767 
768     len = f->ops->get_buffer(f->opaque, f->buf + pending, f->pos,
769                         IO_BUF_SIZE - pending);
770     if (len > 0) {
771         f->buf_size += len;
772         f->pos += len;
773     } else if (len == 0) {
774         qemu_file_set_error(f, -EIO);
775     } else if (len != -EAGAIN)
776         qemu_file_set_error(f, len);
777 }
778 
qemu_get_fd(QEMUFile * f)779 int qemu_get_fd(QEMUFile *f)
780 {
781     if (f->ops->get_fd) {
782         return f->ops->get_fd(f->opaque);
783     }
784     return -1;
785 }
786 
qemu_update_position(QEMUFile * f,size_t size)787 void qemu_update_position(QEMUFile *f, size_t size)
788 {
789     f->pos += size;
790 }
791 
792 /** Closes the file
793  *
794  * Returns negative error value if any error happened on previous operations or
795  * while closing the file. Returns 0 or positive number on success.
796  *
797  * The meaning of return value on success depends on the specific backend
798  * being used.
799  */
qemu_fclose(QEMUFile * f)800 int qemu_fclose(QEMUFile *f)
801 {
802     int ret;
803     qemu_fflush(f);
804     ret = qemu_file_get_error(f);
805 
806     if (f->ops->close) {
807         int ret2 = f->ops->close(f->opaque);
808         if (ret >= 0) {
809             ret = ret2;
810         }
811     }
812     /* If any error was spotted before closing, we should report it
813      * instead of the close() return value.
814      */
815     if (f->last_error) {
816         ret = f->last_error;
817     }
818     g_free(f);
819     return ret;
820 }
821 
add_to_iovec(QEMUFile * f,const uint8_t * buf,int size)822 static void add_to_iovec(QEMUFile *f, const uint8_t *buf, int size)
823 {
824     /* check for adjacent buffer and coalesce them */
825     if (f->iovcnt > 0 && buf == f->iov[f->iovcnt - 1].iov_base +
826         f->iov[f->iovcnt - 1].iov_len) {
827         f->iov[f->iovcnt - 1].iov_len += size;
828     } else {
829         f->iov[f->iovcnt].iov_base = (uint8_t *)buf;
830         f->iov[f->iovcnt++].iov_len = size;
831     }
832 
833     if (f->iovcnt >= MAX_IOV_SIZE) {
834         qemu_fflush(f);
835     }
836 }
837 
qemu_put_buffer_async(QEMUFile * f,const uint8_t * buf,int size)838 void qemu_put_buffer_async(QEMUFile *f, const uint8_t *buf, int size)
839 {
840     if (!f->ops->writev_buffer) {
841         qemu_put_buffer(f, buf, size);
842         return;
843     }
844 
845     if (f->last_error) {
846         return;
847     }
848 
849     f->bytes_xfer += size;
850     add_to_iovec(f, buf, size);
851 }
852 
qemu_put_buffer(QEMUFile * f,const uint8_t * buf,int size)853 void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
854 {
855     int l;
856 
857     if (f->last_error) {
858         return;
859     }
860 
861     while (size > 0) {
862         l = IO_BUF_SIZE - f->buf_index;
863         if (l > size)
864             l = size;
865         memcpy(f->buf + f->buf_index, buf, l);
866         f->bytes_xfer += l;
867         if (f->ops->writev_buffer) {
868             add_to_iovec(f, f->buf + f->buf_index, l);
869         }
870         f->buf_index += l;
871         if (f->buf_index == IO_BUF_SIZE) {
872             qemu_fflush(f);
873         }
874         if (qemu_file_get_error(f)) {
875             break;
876         }
877         buf += l;
878         size -= l;
879     }
880 }
881 
qemu_put_byte(QEMUFile * f,int v)882 void qemu_put_byte(QEMUFile *f, int v)
883 {
884     if (f->last_error) {
885         return;
886     }
887 
888     f->buf[f->buf_index] = v;
889     f->bytes_xfer++;
890     if (f->ops->writev_buffer) {
891         add_to_iovec(f, f->buf + f->buf_index, 1);
892     }
893     f->buf_index++;
894     if (f->buf_index == IO_BUF_SIZE) {
895         qemu_fflush(f);
896     }
897 }
898 
qemu_file_skip(QEMUFile * f,int size)899 static void qemu_file_skip(QEMUFile *f, int size)
900 {
901     if (f->buf_index + size <= f->buf_size) {
902         f->buf_index += size;
903     }
904 }
905 
qemu_peek_buffer(QEMUFile * f,uint8_t * buf,int size,size_t offset)906 static int qemu_peek_buffer(QEMUFile *f, uint8_t *buf, int size, size_t offset)
907 {
908     int pending;
909     int index;
910 
911     assert(!qemu_file_is_writable(f));
912 
913     index = f->buf_index + offset;
914     pending = f->buf_size - index;
915     if (pending < size) {
916         qemu_fill_buffer(f);
917         index = f->buf_index + offset;
918         pending = f->buf_size - index;
919     }
920 
921     if (pending <= 0) {
922         return 0;
923     }
924     if (size > pending) {
925         size = pending;
926     }
927 
928     memcpy(buf, f->buf + index, size);
929     return size;
930 }
931 
qemu_get_buffer(QEMUFile * f,uint8_t * buf,int size)932 int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size)
933 {
934     int pending = size;
935     int done = 0;
936 
937     while (pending > 0) {
938         int res;
939 
940         res = qemu_peek_buffer(f, buf, pending, 0);
941         if (res == 0) {
942             return done;
943         }
944         qemu_file_skip(f, res);
945         buf += res;
946         pending -= res;
947         done += res;
948     }
949     return done;
950 }
951 
qemu_peek_byte(QEMUFile * f,int offset)952 static int qemu_peek_byte(QEMUFile *f, int offset)
953 {
954     int index = f->buf_index + offset;
955 
956     assert(!qemu_file_is_writable(f));
957 
958     if (index >= f->buf_size) {
959         qemu_fill_buffer(f);
960         index = f->buf_index + offset;
961         if (index >= f->buf_size) {
962             return 0;
963         }
964     }
965     return f->buf[index];
966 }
967 
qemu_get_byte(QEMUFile * f)968 int qemu_get_byte(QEMUFile *f)
969 {
970     int result;
971 
972     result = qemu_peek_byte(f, 0);
973     qemu_file_skip(f, 1);
974     return result;
975 }
976 
977 #ifdef CONFIG_ANDROID
qemu_put_string(QEMUFile * f,const char * str)978 void qemu_put_string(QEMUFile *f, const char* str)
979 {
980     /* We will encode NULL and the empty string in the same way */
981     int  slen;
982     if (str == NULL) {
983         str = "";
984     }
985     slen = strlen(str);
986     qemu_put_be32(f, slen);
987     qemu_put_buffer(f, (const uint8_t*)str, slen);
988 }
989 
qemu_get_string(QEMUFile * f)990 char* qemu_get_string(QEMUFile *f)
991 {
992     int slen = qemu_get_be32(f);
993     char* str;
994     if (slen == 0)
995         return NULL;
996 
997     str = g_malloc(slen+1);
998     if (qemu_get_buffer(f, (uint8_t*)str, slen) != slen) {
999         g_free(str);
1000         return NULL;
1001     }
1002     str[slen] = '\0';
1003     return str;
1004 }
1005 #endif
1006 
1007 
qemu_ftell(QEMUFile * f)1008 int64_t qemu_ftell(QEMUFile *f)
1009 {
1010     qemu_fflush(f);
1011     return f->pos;
1012 }
1013 
qemu_file_rate_limit(QEMUFile * f)1014 int qemu_file_rate_limit(QEMUFile *f)
1015 {
1016     if (qemu_file_get_error(f)) {
1017         return 1;
1018     }
1019     if (f->xfer_limit > 0 && f->bytes_xfer > f->xfer_limit) {
1020         return 1;
1021     }
1022     return 0;
1023 }
1024 
qemu_file_get_rate_limit(QEMUFile * f)1025 int64_t qemu_file_get_rate_limit(QEMUFile *f)
1026 {
1027     return f->xfer_limit;
1028 }
1029 
qemu_file_set_rate_limit(QEMUFile * f,int64_t limit)1030 void qemu_file_set_rate_limit(QEMUFile *f, int64_t limit)
1031 {
1032     f->xfer_limit = limit;
1033 }
1034 
qemu_file_reset_rate_limit(QEMUFile * f)1035 void qemu_file_reset_rate_limit(QEMUFile *f)
1036 {
1037     f->bytes_xfer = 0;
1038 }
1039 
qemu_put_be16(QEMUFile * f,unsigned int v)1040 void qemu_put_be16(QEMUFile *f, unsigned int v)
1041 {
1042     qemu_put_byte(f, v >> 8);
1043     qemu_put_byte(f, v);
1044 }
1045 
qemu_put_be32(QEMUFile * f,unsigned int v)1046 void qemu_put_be32(QEMUFile *f, unsigned int v)
1047 {
1048     qemu_put_byte(f, v >> 24);
1049     qemu_put_byte(f, v >> 16);
1050     qemu_put_byte(f, v >> 8);
1051     qemu_put_byte(f, v);
1052 }
1053 
qemu_put_be64(QEMUFile * f,uint64_t v)1054 void qemu_put_be64(QEMUFile *f, uint64_t v)
1055 {
1056     qemu_put_be32(f, v >> 32);
1057     qemu_put_be32(f, v);
1058 }
1059 
qemu_get_be16(QEMUFile * f)1060 unsigned int qemu_get_be16(QEMUFile *f)
1061 {
1062     unsigned int v;
1063     v = qemu_get_byte(f) << 8;
1064     v |= qemu_get_byte(f);
1065     return v;
1066 }
1067 
qemu_get_be32(QEMUFile * f)1068 unsigned int qemu_get_be32(QEMUFile *f)
1069 {
1070     unsigned int v;
1071     v = qemu_get_byte(f) << 24;
1072     v |= qemu_get_byte(f) << 16;
1073     v |= qemu_get_byte(f) << 8;
1074     v |= qemu_get_byte(f);
1075     return v;
1076 }
1077 
qemu_get_be64(QEMUFile * f)1078 uint64_t qemu_get_be64(QEMUFile *f)
1079 {
1080     uint64_t v;
1081     v = (uint64_t)qemu_get_be32(f) << 32;
1082     v |= qemu_get_be32(f);
1083     return v;
1084 }
1085 
1086 
qemu_put_struct(QEMUFile * f,const QField * fields,const void * s)1087 void  qemu_put_struct(QEMUFile*  f, const QField*  fields, const void*  s)
1088 {
1089     const QField*  qf = fields;
1090 
1091     /* Iterate over struct fields */
1092     while (qf->type != Q_FIELD_END) {
1093         uint8_t*  p = (uint8_t*)s + qf->offset;
1094 
1095         switch (qf->type) {
1096             case Q_FIELD_BYTE:
1097                 qemu_put_byte(f, p[0]);
1098                 break;
1099             case Q_FIELD_INT16:
1100                 qemu_put_be16(f, ((uint16_t*)p)[0]);
1101                 break;
1102             case Q_FIELD_INT32:
1103                 qemu_put_be32(f, ((uint32_t*)p)[0]);
1104                 break;
1105             case Q_FIELD_INT64:
1106                 qemu_put_be64(f, ((uint64_t*)p)[0]);
1107                 break;
1108             case Q_FIELD_BUFFER:
1109                 if (qf[1].type != Q_FIELD_BUFFER_SIZE ||
1110                     qf[2].type != Q_FIELD_BUFFER_SIZE)
1111                 {
1112                     fprintf(stderr, "%s: invalid QFIELD_BUFFER item passed as argument. aborting\n",
1113                             __FUNCTION__ );
1114                     exit(1);
1115                 }
1116                 else
1117                 {
1118                     uint32_t  size = ((uint32_t)qf[1].offset << 16) | (uint32_t)qf[2].offset;
1119 
1120                     qemu_put_buffer(f, p, size);
1121                     qf += 2;
1122                 }
1123                 break;
1124             default:
1125                 fprintf(stderr, "%s: invalid fields list passed as argument. aborting\n", __FUNCTION__);
1126                 exit(1);
1127         }
1128         qf++;
1129     }
1130 }
1131 
qemu_get_struct(QEMUFile * f,const QField * fields,void * s)1132 int   qemu_get_struct(QEMUFile*  f, const QField*  fields, void*  s)
1133 {
1134     const QField*  qf = fields;
1135 
1136     /* Iterate over struct fields */
1137     while (qf->type != Q_FIELD_END) {
1138         uint8_t*  p = (uint8_t*)s + qf->offset;
1139 
1140         switch (qf->type) {
1141             case Q_FIELD_BYTE:
1142                 p[0] = qemu_get_byte(f);
1143                 break;
1144             case Q_FIELD_INT16:
1145                 ((uint16_t*)p)[0] = qemu_get_be16(f);
1146                 break;
1147             case Q_FIELD_INT32:
1148                 ((uint32_t*)p)[0] = qemu_get_be32(f);
1149                 break;
1150             case Q_FIELD_INT64:
1151                 ((uint64_t*)p)[0] = qemu_get_be64(f);
1152                 break;
1153             case Q_FIELD_BUFFER:
1154                 if (qf[1].type != Q_FIELD_BUFFER_SIZE ||
1155                         qf[2].type != Q_FIELD_BUFFER_SIZE)
1156                 {
1157                     fprintf(stderr, "%s: invalid QFIELD_BUFFER item passed as argument.\n",
1158                             __FUNCTION__ );
1159                     return -1;
1160                 }
1161                 else
1162                 {
1163                     uint32_t  size = ((uint32_t)qf[1].offset << 16) | (uint32_t)qf[2].offset;
1164                     int       ret  = qemu_get_buffer(f, p, size);
1165 
1166                     if (ret != size) {
1167                         fprintf(stderr, "%s: not enough bytes to load structure\n", __FUNCTION__);
1168                         return -1;
1169                     }
1170                     qf += 2;
1171                 }
1172                 break;
1173             default:
1174                 fprintf(stderr, "%s: invalid fields list passed as argument. aborting\n", __FUNCTION__);
1175                 exit(1);
1176         }
1177         qf++;
1178     }
1179     return 0;
1180 }
1181 
1182 /* write a float to file */
qemu_put_float(QEMUFile * f,float v)1183 void qemu_put_float(QEMUFile *f, float v)
1184 {
1185     uint8_t *bytes = (uint8_t*) &v;
1186     qemu_put_buffer(f, bytes, sizeof(float));
1187 }
1188 
1189 /* read a float from file */
qemu_get_float(QEMUFile * f)1190 float qemu_get_float(QEMUFile *f)
1191 {
1192     uint8_t bytes[sizeof(float)];
1193     qemu_get_buffer(f, bytes, sizeof(float));
1194 
1195     return *((float*) bytes);
1196 }
1197 
1198 /* timer */
1199 
timer_put(QEMUFile * f,QEMUTimer * ts)1200 void timer_put(QEMUFile *f, QEMUTimer *ts)
1201 {
1202     uint64_t expire_time;
1203 
1204     expire_time = timer_expire_time_ns(ts);
1205     qemu_put_be64(f, expire_time);
1206 }
1207 
timer_get(QEMUFile * f,QEMUTimer * ts)1208 void timer_get(QEMUFile *f, QEMUTimer *ts)
1209 {
1210     uint64_t expire_time;
1211 
1212     expire_time = qemu_get_be64(f);
1213     if (expire_time != -1) {
1214         timer_mod_ns(ts, expire_time);
1215     } else {
1216         timer_del(ts);
1217     }
1218 }
1219 
1220 
1221 /* bool */
1222 
get_bool(QEMUFile * f,void * pv,size_t size)1223 static int get_bool(QEMUFile *f, void *pv, size_t size)
1224 {
1225     bool *v = pv;
1226     *v = qemu_get_byte(f);
1227     return 0;
1228 }
1229 
put_bool(QEMUFile * f,void * pv,size_t size)1230 static void put_bool(QEMUFile *f, void *pv, size_t size)
1231 {
1232     bool *v = pv;
1233     qemu_put_byte(f, *v);
1234 }
1235 
1236 const VMStateInfo vmstate_info_bool = {
1237     .name = "bool",
1238     .get  = get_bool,
1239     .put  = put_bool,
1240 };
1241 
1242 /* 8 bit int */
1243 
get_int8(QEMUFile * f,void * pv,size_t size)1244 static int get_int8(QEMUFile *f, void *pv, size_t size)
1245 {
1246     int8_t *v = pv;
1247     qemu_get_s8s(f, v);
1248     return 0;
1249 }
1250 
put_int8(QEMUFile * f,void * pv,size_t size)1251 static void put_int8(QEMUFile *f, void *pv, size_t size)
1252 {
1253     int8_t *v = pv;
1254     qemu_put_s8s(f, v);
1255 }
1256 
1257 const VMStateInfo vmstate_info_int8 = {
1258     .name = "int8",
1259     .get  = get_int8,
1260     .put  = put_int8,
1261 };
1262 
1263 /* 16 bit int */
1264 
get_int16(QEMUFile * f,void * pv,size_t size)1265 static int get_int16(QEMUFile *f, void *pv, size_t size)
1266 {
1267     int16_t *v = pv;
1268     qemu_get_sbe16s(f, v);
1269     return 0;
1270 }
1271 
put_int16(QEMUFile * f,void * pv,size_t size)1272 static void put_int16(QEMUFile *f, void *pv, size_t size)
1273 {
1274     int16_t *v = pv;
1275     qemu_put_sbe16s(f, v);
1276 }
1277 
1278 const VMStateInfo vmstate_info_int16 = {
1279     .name = "int16",
1280     .get  = get_int16,
1281     .put  = put_int16,
1282 };
1283 
1284 /* 32 bit int */
1285 
get_int32(QEMUFile * f,void * pv,size_t size)1286 static int get_int32(QEMUFile *f, void *pv, size_t size)
1287 {
1288     int32_t *v = pv;
1289     qemu_get_sbe32s(f, v);
1290     return 0;
1291 }
1292 
put_int32(QEMUFile * f,void * pv,size_t size)1293 static void put_int32(QEMUFile *f, void *pv, size_t size)
1294 {
1295     int32_t *v = pv;
1296     qemu_put_sbe32s(f, v);
1297 }
1298 
1299 const VMStateInfo vmstate_info_int32 = {
1300     .name = "int32",
1301     .get  = get_int32,
1302     .put  = put_int32,
1303 };
1304 
1305 /* 32 bit int. See that the received value is the same than the one
1306    in the field */
1307 
get_int32_equal(QEMUFile * f,void * pv,size_t size)1308 static int get_int32_equal(QEMUFile *f, void *pv, size_t size)
1309 {
1310     int32_t *v = pv;
1311     int32_t v2;
1312     qemu_get_sbe32s(f, &v2);
1313 
1314     if (*v == v2)
1315         return 0;
1316     return -EINVAL;
1317 }
1318 
1319 const VMStateInfo vmstate_info_int32_equal = {
1320     .name = "int32 equal",
1321     .get  = get_int32_equal,
1322     .put  = put_int32,
1323 };
1324 
1325 /* 32 bit int. See that the received value is the less or the same
1326    than the one in the field */
1327 
get_int32_le(QEMUFile * f,void * pv,size_t size)1328 static int get_int32_le(QEMUFile *f, void *pv, size_t size)
1329 {
1330     int32_t *old = pv;
1331     int32_t new;
1332     qemu_get_sbe32s(f, &new);
1333 
1334     if (*old <= new)
1335         return 0;
1336     return -EINVAL;
1337 }
1338 
1339 const VMStateInfo vmstate_info_int32_le = {
1340     .name = "int32 equal",
1341     .get  = get_int32_le,
1342     .put  = put_int32,
1343 };
1344 
1345 /* 64 bit int */
1346 
get_int64(QEMUFile * f,void * pv,size_t size)1347 static int get_int64(QEMUFile *f, void *pv, size_t size)
1348 {
1349     int64_t *v = pv;
1350     qemu_get_sbe64s(f, v);
1351     return 0;
1352 }
1353 
put_int64(QEMUFile * f,void * pv,size_t size)1354 static void put_int64(QEMUFile *f, void *pv, size_t size)
1355 {
1356     int64_t *v = pv;
1357     qemu_put_sbe64s(f, v);
1358 }
1359 
1360 const VMStateInfo vmstate_info_int64 = {
1361     .name = "int64",
1362     .get  = get_int64,
1363     .put  = put_int64,
1364 };
1365 
1366 /* 8 bit unsigned int */
1367 
get_uint8(QEMUFile * f,void * pv,size_t size)1368 static int get_uint8(QEMUFile *f, void *pv, size_t size)
1369 {
1370     uint8_t *v = pv;
1371     qemu_get_8s(f, v);
1372     return 0;
1373 }
1374 
put_uint8(QEMUFile * f,void * pv,size_t size)1375 static void put_uint8(QEMUFile *f, void *pv, size_t size)
1376 {
1377     uint8_t *v = pv;
1378     qemu_put_8s(f, v);
1379 }
1380 
1381 const VMStateInfo vmstate_info_uint8 = {
1382     .name = "uint8",
1383     .get  = get_uint8,
1384     .put  = put_uint8,
1385 };
1386 
1387 /* 16 bit unsigned int */
1388 
get_uint16(QEMUFile * f,void * pv,size_t size)1389 static int get_uint16(QEMUFile *f, void *pv, size_t size)
1390 {
1391     uint16_t *v = pv;
1392     qemu_get_be16s(f, v);
1393     return 0;
1394 }
1395 
put_uint16(QEMUFile * f,void * pv,size_t size)1396 static void put_uint16(QEMUFile *f, void *pv, size_t size)
1397 {
1398     uint16_t *v = pv;
1399     qemu_put_be16s(f, v);
1400 }
1401 
1402 const VMStateInfo vmstate_info_uint16 = {
1403     .name = "uint16",
1404     .get  = get_uint16,
1405     .put  = put_uint16,
1406 };
1407 
1408 /* 32 bit unsigned int */
1409 
get_uint32(QEMUFile * f,void * pv,size_t size)1410 static int get_uint32(QEMUFile *f, void *pv, size_t size)
1411 {
1412     uint32_t *v = pv;
1413     qemu_get_be32s(f, v);
1414     return 0;
1415 }
1416 
put_uint32(QEMUFile * f,void * pv,size_t size)1417 static void put_uint32(QEMUFile *f, void *pv, size_t size)
1418 {
1419     uint32_t *v = pv;
1420     qemu_put_be32s(f, v);
1421 }
1422 
1423 const VMStateInfo vmstate_info_uint32 = {
1424     .name = "uint32",
1425     .get  = get_uint32,
1426     .put  = put_uint32,
1427 };
1428 
1429 /* 32 bit uint. See that the received value is the same than the one
1430    in the field */
1431 
get_uint32_equal(QEMUFile * f,void * pv,size_t size)1432 static int get_uint32_equal(QEMUFile *f, void *pv, size_t size)
1433 {
1434     uint32_t *v = pv;
1435     uint32_t v2;
1436     qemu_get_be32s(f, &v2);
1437 
1438     if (*v == v2) {
1439         return 0;
1440     }
1441     return -EINVAL;
1442 }
1443 
1444 const VMStateInfo vmstate_info_uint32_equal = {
1445     .name = "uint32 equal",
1446     .get  = get_uint32_equal,
1447     .put  = put_uint32,
1448 };
1449 
1450 /* 64 bit unsigned int */
1451 
get_uint64(QEMUFile * f,void * pv,size_t size)1452 static int get_uint64(QEMUFile *f, void *pv, size_t size)
1453 {
1454     uint64_t *v = pv;
1455     qemu_get_be64s(f, v);
1456     return 0;
1457 }
1458 
put_uint64(QEMUFile * f,void * pv,size_t size)1459 static void put_uint64(QEMUFile *f, void *pv, size_t size)
1460 {
1461     uint64_t *v = pv;
1462     qemu_put_be64s(f, v);
1463 }
1464 
1465 const VMStateInfo vmstate_info_uint64 = {
1466     .name = "uint64",
1467     .get  = get_uint64,
1468     .put  = put_uint64,
1469 };
1470 
1471 /* 64 bit unsigned int. See that the received value is the same than the one
1472    in the field */
1473 
get_uint64_equal(QEMUFile * f,void * pv,size_t size)1474 static int get_uint64_equal(QEMUFile *f, void *pv, size_t size)
1475 {
1476     uint64_t *v = pv;
1477     uint64_t v2;
1478     qemu_get_be64s(f, &v2);
1479 
1480     if (*v == v2) {
1481         return 0;
1482     }
1483     return -EINVAL;
1484 }
1485 
1486 const VMStateInfo vmstate_info_uint64_equal = {
1487     .name = "int64 equal",
1488     .get  = get_uint64_equal,
1489     .put  = put_uint64,
1490 };
1491 
1492 /* 8 bit int. See that the received value is the same than the one
1493    in the field */
1494 
get_uint8_equal(QEMUFile * f,void * pv,size_t size)1495 static int get_uint8_equal(QEMUFile *f, void *pv, size_t size)
1496 {
1497     uint8_t *v = pv;
1498     uint8_t v2;
1499     qemu_get_8s(f, &v2);
1500 
1501     if (*v == v2)
1502         return 0;
1503     return -EINVAL;
1504 }
1505 
1506 const VMStateInfo vmstate_info_uint8_equal = {
1507     .name = "uint8 equal",
1508     .get  = get_uint8_equal,
1509     .put  = put_uint8,
1510 };
1511 
1512 /* 16 bit unsigned int int. See that the received value is the same than the one
1513    in the field */
1514 
get_uint16_equal(QEMUFile * f,void * pv,size_t size)1515 static int get_uint16_equal(QEMUFile *f, void *pv, size_t size)
1516 {
1517     uint16_t *v = pv;
1518     uint16_t v2;
1519     qemu_get_be16s(f, &v2);
1520 
1521     if (*v == v2)
1522         return 0;
1523     return -EINVAL;
1524 }
1525 
1526 const VMStateInfo vmstate_info_uint16_equal = {
1527     .name = "uint16 equal",
1528     .get  = get_uint16_equal,
1529     .put  = put_uint16,
1530 };
1531 
1532 /* floating point */
1533 
get_float64(QEMUFile * f,void * pv,size_t size)1534 static int get_float64(QEMUFile *f, void *pv, size_t size)
1535 {
1536     float64 *v = pv;
1537 
1538     *v = make_float64(qemu_get_be64(f));
1539     return 0;
1540 }
1541 
put_float64(QEMUFile * f,void * pv,size_t size)1542 static void put_float64(QEMUFile *f, void *pv, size_t size)
1543 {
1544     uint64_t *v = pv;
1545 
1546     qemu_put_be64(f, float64_val(*v));
1547 }
1548 
1549 const VMStateInfo vmstate_info_float64 = {
1550     .name = "float64",
1551     .get  = get_float64,
1552     .put  = put_float64,
1553 };
1554 
1555 /* timers  */
1556 
get_timer(QEMUFile * f,void * pv,size_t size)1557 static int get_timer(QEMUFile *f, void *pv, size_t size)
1558 {
1559     QEMUTimer *v = pv;
1560     timer_get(f, v);
1561     return 0;
1562 }
1563 
put_timer(QEMUFile * f,void * pv,size_t size)1564 static void put_timer(QEMUFile *f, void *pv, size_t size)
1565 {
1566     QEMUTimer *v = pv;
1567     timer_put(f, v);
1568 }
1569 
1570 const VMStateInfo vmstate_info_timer = {
1571     .name = "timer",
1572     .get  = get_timer,
1573     .put  = put_timer,
1574 };
1575 
1576 /* uint8_t buffers */
1577 
get_buffer(QEMUFile * f,void * pv,size_t size)1578 static int get_buffer(QEMUFile *f, void *pv, size_t size)
1579 {
1580     uint8_t *v = pv;
1581     qemu_get_buffer(f, v, size);
1582     return 0;
1583 }
1584 
put_buffer(QEMUFile * f,void * pv,size_t size)1585 static void put_buffer(QEMUFile *f, void *pv, size_t size)
1586 {
1587     uint8_t *v = pv;
1588     qemu_put_buffer(f, v, size);
1589 }
1590 
1591 const VMStateInfo vmstate_info_buffer = {
1592     .name = "buffer",
1593     .get  = get_buffer,
1594     .put  = put_buffer,
1595 };
1596 
1597 /* unused buffers: space that was used for some fields that are
1598    not useful anymore */
1599 
get_unused_buffer(QEMUFile * f,void * pv,size_t size)1600 static int get_unused_buffer(QEMUFile *f, void *pv, size_t size)
1601 {
1602     uint8_t buf[1024];
1603     int block_len;
1604 
1605     while (size > 0) {
1606         block_len = MIN(sizeof(buf), size);
1607         size -= block_len;
1608         qemu_get_buffer(f, buf, block_len);
1609     }
1610    return 0;
1611 }
1612 
put_unused_buffer(QEMUFile * f,void * pv,size_t size)1613 static void put_unused_buffer(QEMUFile *f, void *pv, size_t size)
1614 {
1615     static const uint8_t buf[1024];
1616     int block_len;
1617 
1618     while (size > 0) {
1619         block_len = MIN(sizeof(buf), size);
1620         size -= block_len;
1621         qemu_put_buffer(f, buf, block_len);
1622     }
1623 }
1624 
1625 const VMStateInfo vmstate_info_unused_buffer = {
1626     .name = "unused_buffer",
1627     .get  = get_unused_buffer,
1628     .put  = put_unused_buffer,
1629 };
1630 
1631 /* bitmaps (as defined by bitmap.h). Note that size here is the size
1632  * of the bitmap in bits. The on-the-wire format of a bitmap is 64
1633  * bit words with the bits in big endian order. The in-memory format
1634  * is an array of 'unsigned long', which may be either 32 or 64 bits.
1635  */
1636 /* This is the number of 64 bit words sent over the wire */
1637 #define BITS_TO_U64S(nr) DIV_ROUND_UP(nr, 64)
get_bitmap(QEMUFile * f,void * pv,size_t size)1638 static int get_bitmap(QEMUFile *f, void *pv, size_t size)
1639 {
1640     unsigned long *bmp = pv;
1641     int i, idx = 0;
1642     for (i = 0; i < BITS_TO_U64S(size); i++) {
1643         uint64_t w = qemu_get_be64(f);
1644         bmp[idx++] = w;
1645         if (sizeof(unsigned long) == 4 && idx < BITS_TO_LONGS(size)) {
1646             bmp[idx++] = w >> 32;
1647         }
1648     }
1649     return 0;
1650 }
1651 
put_bitmap(QEMUFile * f,void * pv,size_t size)1652 static void put_bitmap(QEMUFile *f, void *pv, size_t size)
1653 {
1654     unsigned long *bmp = pv;
1655     int i, idx = 0;
1656     for (i = 0; i < BITS_TO_U64S(size); i++) {
1657         uint64_t w = bmp[idx++];
1658         if (sizeof(unsigned long) == 4 && idx < BITS_TO_LONGS(size)) {
1659             w |= ((uint64_t)bmp[idx++]) << 32;
1660         }
1661         qemu_put_be64(f, w);
1662     }
1663 }
1664 
1665 const VMStateInfo vmstate_info_bitmap = {
1666     .name = "bitmap",
1667     .get = get_bitmap,
1668     .put = put_bitmap,
1669 };
1670 
1671 typedef struct CompatEntry {
1672     char idstr[256];
1673     int instance_id;
1674 } CompatEntry;
1675 
1676 typedef struct SaveStateEntry {
1677     QTAILQ_ENTRY(SaveStateEntry) entry;
1678     char idstr[256];
1679     int instance_id;
1680     int alias_id;
1681     int version_id;
1682     int section_id;
1683     SaveVMHandlers *ops;
1684     const VMStateDescription *vmsd;
1685     void *opaque;
1686     CompatEntry *compat;
1687     int no_migrate;
1688     int is_ram;
1689 } SaveStateEntry;
1690 
1691 
1692 static QTAILQ_HEAD(savevm_handlers, SaveStateEntry) savevm_handlers =
1693     QTAILQ_HEAD_INITIALIZER(savevm_handlers);
1694 static int global_section_id;
1695 
calculate_new_instance_id(const char * idstr)1696 static int calculate_new_instance_id(const char *idstr)
1697 {
1698     SaveStateEntry *se;
1699     int instance_id = 0;
1700 
1701     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1702         if (strcmp(idstr, se->idstr) == 0
1703             && instance_id <= se->instance_id) {
1704             instance_id = se->instance_id + 1;
1705         }
1706     }
1707     return instance_id;
1708 }
1709 
calculate_compat_instance_id(const char * idstr)1710 static int calculate_compat_instance_id(const char *idstr)
1711 {
1712     SaveStateEntry *se;
1713     int instance_id = 0;
1714 
1715     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1716         if (!se->compat)
1717             continue;
1718 
1719         if (strcmp(idstr, se->compat->idstr) == 0
1720             && instance_id <= se->compat->instance_id) {
1721             instance_id = se->compat->instance_id + 1;
1722         }
1723     }
1724     return instance_id;
1725 }
1726 
1727 /* TODO: Individual devices generally have very little idea about the rest
1728    of the system, so instance_id should be removed/replaced.
1729    Meanwhile pass -1 as instance_id if you do not already have a clearly
1730    distinguishing id for all instances of your device class. */
register_savevm_live(DeviceState * dev,const char * idstr,int instance_id,int version_id,SaveVMHandlers * ops,void * opaque)1731 int register_savevm_live(DeviceState *dev,
1732                          const char *idstr,
1733                          int instance_id,
1734                          int version_id,
1735                          SaveVMHandlers *ops,
1736                          void *opaque)
1737 {
1738     SaveStateEntry *se;
1739 
1740     se = g_malloc0(sizeof(SaveStateEntry));
1741     se->version_id = version_id;
1742     se->section_id = global_section_id++;
1743     se->ops = ops;
1744     se->opaque = opaque;
1745     se->vmsd = NULL;
1746     se->no_migrate = 0;
1747     /* if this is a live_savem then set is_ram */
1748     if (ops->save_live_state != NULL) {
1749         se->is_ram = 1;
1750     }
1751 
1752     if (dev) {
1753         char *id = qdev_get_dev_path(dev);
1754         if (id) {
1755             pstrcpy(se->idstr, sizeof(se->idstr), id);
1756             pstrcat(se->idstr, sizeof(se->idstr), "/");
1757             g_free(id);
1758 
1759             se->compat = g_malloc0(sizeof(CompatEntry));
1760             pstrcpy(se->compat->idstr, sizeof(se->compat->idstr), idstr);
1761             se->compat->instance_id = instance_id == -1 ?
1762                          calculate_compat_instance_id(idstr) : instance_id;
1763             instance_id = -1;
1764         }
1765     }
1766     pstrcat(se->idstr, sizeof(se->idstr), idstr);
1767 
1768     if (instance_id == -1) {
1769         se->instance_id = calculate_new_instance_id(se->idstr);
1770     } else {
1771         se->instance_id = instance_id;
1772     }
1773     assert(!se->compat || se->instance_id == 0);
1774     /* add at the end of list */
1775     QTAILQ_INSERT_TAIL(&savevm_handlers, se, entry);
1776     return 0;
1777 }
1778 
register_savevm(DeviceState * dev,const char * idstr,int instance_id,int version_id,SaveStateHandler * save_state,LoadStateHandler * load_state,void * opaque)1779 int register_savevm(DeviceState *dev,
1780                     const char *idstr,
1781                     int instance_id,
1782                     int version_id,
1783                     SaveStateHandler *save_state,
1784                     LoadStateHandler *load_state,
1785                     void *opaque)
1786 {
1787     SaveVMHandlers *ops = g_malloc0(sizeof(SaveVMHandlers));
1788     ops->save_state = save_state;
1789     ops->load_state = load_state;
1790     return register_savevm_live(dev, idstr, instance_id, version_id,
1791                                 ops, opaque);
1792 }
1793 
unregister_savevm(DeviceState * dev,const char * idstr,void * opaque)1794 void unregister_savevm(DeviceState *dev, const char *idstr, void *opaque)
1795 {
1796     SaveStateEntry *se, *new_se;
1797     char id[256] = "";
1798 
1799     if (dev) {
1800         char *path = qdev_get_dev_path(dev);
1801         if (path) {
1802             pstrcpy(id, sizeof(id), path);
1803             pstrcat(id, sizeof(id), "/");
1804             g_free(path);
1805         }
1806     }
1807     pstrcat(id, sizeof(id), idstr);
1808 
1809     QTAILQ_FOREACH_SAFE(se, &savevm_handlers, entry, new_se) {
1810         if (strcmp(se->idstr, id) == 0 && se->opaque == opaque) {
1811             QTAILQ_REMOVE(&savevm_handlers, se, entry);
1812             if (se->compat) {
1813                 g_free(se->compat);
1814             }
1815             g_free(se->ops);
1816             g_free(se);
1817         }
1818     }
1819 }
1820 
vmstate_register_with_alias_id(DeviceState * dev,int instance_id,const VMStateDescription * vmsd,void * opaque,int alias_id,int required_for_version)1821 int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
1822                                    const VMStateDescription *vmsd,
1823                                    void *opaque, int alias_id,
1824                                    int required_for_version)
1825 {
1826     SaveStateEntry *se;
1827 
1828     /* If this triggers, alias support can be dropped for the vmsd. */
1829     assert(alias_id == -1 || required_for_version >= vmsd->minimum_version_id);
1830 
1831     se = g_malloc0(sizeof(SaveStateEntry));
1832     se->version_id = vmsd->version_id;
1833     se->section_id = global_section_id++;
1834     se->opaque = opaque;
1835     se->vmsd = vmsd;
1836     se->alias_id = alias_id;
1837     se->no_migrate = vmsd->unmigratable;
1838 
1839     if (dev) {
1840         char *id = qdev_get_dev_path(dev);
1841         if (id) {
1842             pstrcpy(se->idstr, sizeof(se->idstr), id);
1843             pstrcat(se->idstr, sizeof(se->idstr), "/");
1844             g_free(id);
1845 
1846             se->compat = g_malloc0(sizeof(CompatEntry));
1847             pstrcpy(se->compat->idstr, sizeof(se->compat->idstr), vmsd->name);
1848             se->compat->instance_id = instance_id == -1 ?
1849                          calculate_compat_instance_id(vmsd->name) : instance_id;
1850             instance_id = -1;
1851         }
1852     }
1853     pstrcat(se->idstr, sizeof(se->idstr), vmsd->name);
1854 
1855     if (instance_id == -1) {
1856         se->instance_id = calculate_new_instance_id(se->idstr);
1857     } else {
1858         se->instance_id = instance_id;
1859     }
1860     assert(!se->compat || se->instance_id == 0);
1861     /* add at the end of list */
1862     QTAILQ_INSERT_TAIL(&savevm_handlers, se, entry);
1863     return 0;
1864 }
1865 
vmstate_unregister(DeviceState * dev,const VMStateDescription * vmsd,void * opaque)1866 void vmstate_unregister(DeviceState *dev, const VMStateDescription *vmsd,
1867                         void *opaque)
1868 {
1869     SaveStateEntry *se, *new_se;
1870 
1871     QTAILQ_FOREACH_SAFE(se, &savevm_handlers, entry, new_se) {
1872         if (se->vmsd == vmsd && se->opaque == opaque) {
1873             QTAILQ_REMOVE(&savevm_handlers, se, entry);
1874             if (se->compat) {
1875                 g_free(se->compat);
1876             }
1877             g_free(se);
1878         }
1879     }
1880 }
1881 
1882 static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
1883                                     void *opaque);
1884 static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
1885                                    void *opaque);
1886 
vmstate_load_state(QEMUFile * f,const VMStateDescription * vmsd,void * opaque,int version_id)1887 int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
1888                        void *opaque, int version_id)
1889 {
1890     VMStateField *field = vmsd->fields;
1891     int ret;
1892 
1893     if (version_id > vmsd->version_id) {
1894         return -EINVAL;
1895     }
1896     if (version_id < vmsd->minimum_version_id_old) {
1897         return -EINVAL;
1898     }
1899     if  (version_id < vmsd->minimum_version_id) {
1900         return vmsd->load_state_old(f, opaque, version_id);
1901     }
1902     if (vmsd->pre_load) {
1903         int ret = vmsd->pre_load(opaque);
1904         if (ret)
1905             return ret;
1906     }
1907     while(field->name) {
1908         if ((field->field_exists &&
1909              field->field_exists(opaque, version_id)) ||
1910             (!field->field_exists &&
1911              field->version_id <= version_id)) {
1912             void *base_addr = opaque + field->offset;
1913             int i, n_elems = 1;
1914             int size = field->size;
1915 
1916             if (field->flags & VMS_VBUFFER) {
1917                 size = *(int32_t *)(opaque+field->size_offset);
1918                 if (field->flags & VMS_MULTIPLY) {
1919                     size *= field->size;
1920                 }
1921             }
1922             if (field->flags & VMS_ARRAY) {
1923                 n_elems = field->num;
1924             } else if (field->flags & VMS_VARRAY_INT32) {
1925                 n_elems = *(int32_t *)(opaque+field->num_offset);
1926             } else if (field->flags & VMS_VARRAY_UINT32) {
1927                 n_elems = *(uint32_t *)(opaque+field->num_offset);
1928             } else if (field->flags & VMS_VARRAY_UINT16) {
1929                 n_elems = *(uint16_t *)(opaque+field->num_offset);
1930             } else if (field->flags & VMS_VARRAY_UINT8) {
1931                 n_elems = *(uint8_t *)(opaque+field->num_offset);
1932             }
1933             if (field->flags & VMS_POINTER) {
1934                 base_addr = *(void **)base_addr + field->start;
1935             }
1936             for (i = 0; i < n_elems; i++) {
1937                 void *addr = base_addr + size * i;
1938 
1939                 if (field->flags & VMS_ARRAY_OF_POINTER) {
1940                     addr = *(void **)addr;
1941                 }
1942                 if (field->flags & VMS_STRUCT) {
1943                     ret = vmstate_load_state(f, field->vmsd, addr, field->vmsd->version_id);
1944                 } else {
1945                     ret = field->info->get(f, addr, size);
1946 
1947                 }
1948                 if (ret < 0) {
1949                     return ret;
1950                 }
1951             }
1952         }
1953         field++;
1954     }
1955     ret = vmstate_subsection_load(f, vmsd, opaque);
1956     if (ret != 0) {
1957         return ret;
1958     }
1959     if (vmsd->post_load) {
1960         return vmsd->post_load(opaque, version_id);
1961     }
1962     return 0;
1963 }
1964 
vmstate_save_state(QEMUFile * f,const VMStateDescription * vmsd,void * opaque)1965 void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
1966                         void *opaque)
1967 {
1968     VMStateField *field = vmsd->fields;
1969 
1970     if (vmsd->pre_save) {
1971         vmsd->pre_save(opaque);
1972     }
1973     while(field->name) {
1974         if (!field->field_exists ||
1975             field->field_exists(opaque, vmsd->version_id)) {
1976             void *base_addr = opaque + field->offset;
1977             int i, n_elems = 1;
1978             int size = field->size;
1979 
1980             if (field->flags & VMS_VBUFFER) {
1981                 size = *(int32_t *)(opaque+field->size_offset);
1982                 if (field->flags & VMS_MULTIPLY) {
1983                     size *= field->size;
1984                 }
1985             }
1986             if (field->flags & VMS_ARRAY) {
1987                 n_elems = field->num;
1988             } else if (field->flags & VMS_VARRAY_INT32) {
1989                 n_elems = *(int32_t *)(opaque+field->num_offset);
1990             } else if (field->flags & VMS_VARRAY_UINT32) {
1991                 n_elems = *(uint32_t *)(opaque+field->num_offset);
1992             } else if (field->flags & VMS_VARRAY_UINT16) {
1993                 n_elems = *(uint16_t *)(opaque+field->num_offset);
1994             } else if (field->flags & VMS_VARRAY_UINT8) {
1995                 n_elems = *(uint8_t *)(opaque+field->num_offset);
1996             }
1997             if (field->flags & VMS_POINTER) {
1998                 base_addr = *(void **)base_addr + field->start;
1999             }
2000             for (i = 0; i < n_elems; i++) {
2001                 void *addr = base_addr + size * i;
2002 
2003                 if (field->flags & VMS_ARRAY_OF_POINTER) {
2004                     addr = *(void **)addr;
2005                 }
2006                 if (field->flags & VMS_STRUCT) {
2007                     vmstate_save_state(f, field->vmsd, addr);
2008                 } else {
2009                     field->info->put(f, addr, size);
2010                 }
2011             }
2012         }
2013         field++;
2014     }
2015     vmstate_subsection_save(f, vmsd, opaque);
2016 }
2017 
vmstate_load(QEMUFile * f,SaveStateEntry * se,int version_id)2018 static int vmstate_load(QEMUFile *f, SaveStateEntry *se, int version_id)
2019 {
2020     if (!se->vmsd) {         /* Old style */
2021         return se->ops->load_state(f, se->opaque, version_id);
2022     }
2023     return vmstate_load_state(f, se->vmsd, se->opaque, version_id);
2024 }
2025 
vmstate_save(QEMUFile * f,SaveStateEntry * se)2026 static void vmstate_save(QEMUFile *f, SaveStateEntry *se)
2027 {
2028     if (!se->vmsd) {         /* Old style */
2029         se->ops->save_state(f, se->opaque);
2030         return;
2031     }
2032     vmstate_save_state(f,se->vmsd, se->opaque);
2033 }
2034 
2035 #define QEMU_VM_FILE_MAGIC           0x5145564d
2036 #define QEMU_VM_FILE_VERSION_COMPAT  0x00000002
2037 #define QEMU_VM_FILE_VERSION         0x00000004
2038 
2039 #define QEMU_VM_EOF                  0x00
2040 #define QEMU_VM_SECTION_START        0x01
2041 #define QEMU_VM_SECTION_PART         0x02
2042 #define QEMU_VM_SECTION_END          0x03
2043 #define QEMU_VM_SECTION_FULL         0x04
2044 #define QEMU_VM_SUBSECTION           0x05
2045 
qemu_savevm_state_blocked(Error ** errp)2046 bool qemu_savevm_state_blocked(Error **errp)
2047 {
2048     SaveStateEntry *se;
2049 
2050     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
2051         if (se->no_migrate) {
2052             error_set(errp, QERR_MIGRATION_NOT_SUPPORTED, se->idstr);
2053             return true;
2054         }
2055     }
2056     return false;
2057 }
2058 
qemu_savevm_state_begin(QEMUFile * f)2059 int qemu_savevm_state_begin(QEMUFile *f)
2060 {
2061     SaveStateEntry *se;
2062 
2063     qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
2064     qemu_put_be32(f, QEMU_VM_FILE_VERSION);
2065 
2066     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
2067         int len;
2068 
2069         if (!se->ops || !se->ops->save_live_state) {
2070             continue;
2071         }
2072 #if 0
2073         if (se->ops && se->ops->is_active) {
2074             if (!se->ops->is_active(se->opaque)) {
2075                 continue;
2076             }
2077         }
2078 #endif
2079         /* Section type */
2080         qemu_put_byte(f, QEMU_VM_SECTION_START);
2081         qemu_put_be32(f, se->section_id);
2082 
2083         /* ID string */
2084         len = strlen(se->idstr);
2085         qemu_put_byte(f, len);
2086         qemu_put_buffer(f, (uint8_t *)se->idstr, len);
2087 
2088         qemu_put_be32(f, se->instance_id);
2089         qemu_put_be32(f, se->version_id);
2090 
2091         se->ops->save_live_state(f, QEMU_VM_SECTION_START, se->opaque);
2092     }
2093 
2094     return qemu_file_get_error(f);
2095 }
2096 
qemu_savevm_state_iterate(QEMUFile * f)2097 int qemu_savevm_state_iterate(QEMUFile *f)
2098 {
2099     SaveStateEntry *se;
2100     int ret = 1;
2101 
2102     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
2103         if (!se->ops || !se->ops->save_live_state) {
2104             continue;
2105         }
2106 #if 0
2107         if (se->ops && se->ops->is_active) {
2108             if (!se->ops->is_active(se->opaque)) {
2109                 continue;
2110             }
2111         }
2112 #endif
2113         if (qemu_file_rate_limit(f)) {
2114             return 0;
2115         }
2116         //trace_savevm_section_start();
2117         /* Section type */
2118         qemu_put_byte(f, QEMU_VM_SECTION_PART);
2119         qemu_put_be32(f, se->section_id);
2120 
2121         ret &= !!se->ops->save_live_state(f, QEMU_VM_SECTION_PART, se->opaque);
2122     }
2123 
2124     if (ret)
2125         return 1;
2126 
2127     return qemu_file_get_error(f);
2128 }
2129 
qemu_savevm_state_complete(QEMUFile * f)2130 int qemu_savevm_state_complete(QEMUFile *f)
2131 {
2132     SaveStateEntry *se;
2133 
2134     // cpu_synchronize_all_states();
2135 
2136     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
2137         if (!se->ops || se->ops->save_live_state == NULL) {
2138             continue;
2139         }
2140 #if 0
2141         if (se->ops && se->ops->is_active) {
2142             if (!se->ops->is_active(se->opaque)) {
2143                 continue;
2144             }
2145         }
2146 #endif
2147         //trace_savevm_section_start();
2148         /* Section type */
2149         qemu_put_byte(f, QEMU_VM_SECTION_END);
2150         qemu_put_be32(f, se->section_id);
2151 
2152         se->ops->save_live_state(f, QEMU_VM_SECTION_END, se->opaque);
2153     }
2154 
2155     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
2156         int len;
2157 
2158         if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
2159             continue;
2160         }
2161 
2162         /* Section type */
2163         qemu_put_byte(f, QEMU_VM_SECTION_FULL);
2164         qemu_put_be32(f, se->section_id);
2165 
2166         /* ID string */
2167         len = strlen(se->idstr);
2168         qemu_put_byte(f, len);
2169         qemu_put_buffer(f, (uint8_t *)se->idstr, len);
2170 
2171         qemu_put_be32(f, se->instance_id);
2172         qemu_put_be32(f, se->version_id);
2173 
2174         vmstate_save(f, se);
2175     }
2176 
2177     qemu_put_byte(f, QEMU_VM_EOF);
2178     qemu_fflush(f);
2179 
2180     return qemu_file_get_error(f);
2181 }
2182 
qemu_savevm_state(QEMUFile * f)2183 int qemu_savevm_state(QEMUFile *f)
2184 {
2185     int saved_vm_running;
2186     int ret;
2187 
2188     if (qemu_savevm_state_blocked(NULL)) {
2189         return -EINVAL;
2190     }
2191 
2192     saved_vm_running = vm_running;
2193     vm_stop(0);
2194 
2195     bdrv_flush_all();
2196 
2197     ret = qemu_savevm_state_begin(f);
2198     if (ret < 0)
2199         goto out;
2200 
2201     do {
2202         ret = qemu_savevm_state_iterate(f);
2203         if (ret < 0)
2204             goto out;
2205     } while (ret == 0);
2206 
2207     ret = qemu_savevm_state_complete(f);
2208 
2209 out:
2210     ret = qemu_file_get_error(f);
2211 
2212     if (!ret && saved_vm_running)
2213         vm_start();
2214 
2215     return ret;
2216 }
2217 
find_se(const char * idstr,int instance_id)2218 static SaveStateEntry *find_se(const char *idstr, int instance_id)
2219 {
2220     SaveStateEntry *se;
2221 
2222     QTAILQ_FOREACH(se, &savevm_handlers, entry) {
2223         if (!strcmp(se->idstr, idstr) &&
2224             (instance_id == se->instance_id ||
2225              instance_id == se->alias_id))
2226             return se;
2227         /* Migrating from an older version? */
2228         if (strstr(se->idstr, idstr) && se->compat) {
2229             if (!strcmp(se->compat->idstr, idstr) &&
2230                 (instance_id == se->compat->instance_id ||
2231                  instance_id == se->alias_id))
2232                 return se;
2233         }
2234     }
2235     return NULL;
2236 }
2237 
vmstate_get_subsection(const VMStateSubsection * sub,char * idstr)2238 static const VMStateDescription *vmstate_get_subsection(const VMStateSubsection *sub, char *idstr)
2239 {
2240     while(sub && sub->needed) {
2241         if (strcmp(idstr, sub->vmsd->name) == 0) {
2242             return sub->vmsd;
2243         }
2244         sub++;
2245     }
2246     return NULL;
2247 }
2248 
vmstate_subsection_load(QEMUFile * f,const VMStateDescription * vmsd,void * opaque)2249 static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
2250                                    void *opaque)
2251 {
2252     while (qemu_peek_byte(f, 0) == QEMU_VM_SUBSECTION) {
2253         char idstr[256];
2254         int ret;
2255         uint8_t version_id, len, size;
2256         const VMStateDescription *sub_vmsd;
2257 
2258         len = qemu_peek_byte(f, 1);
2259         if (len < strlen(vmsd->name) + 1) {
2260             /* subsection name has be be "section_name/a" */
2261             return 0;
2262         }
2263         size = qemu_peek_buffer(f, (uint8_t *)idstr, len, 2);
2264         if (size != len) {
2265             return 0;
2266         }
2267         idstr[size] = 0;
2268 
2269         if (strncmp(vmsd->name, idstr, strlen(vmsd->name)) != 0) {
2270             /* it don't have a valid subsection name */
2271             return 0;
2272         }
2273         sub_vmsd = vmstate_get_subsection(vmsd->subsections, idstr);
2274         if (sub_vmsd == NULL) {
2275             return -ENOENT;
2276         }
2277         qemu_file_skip(f, 1); /* subsection */
2278         qemu_file_skip(f, 1); /* len */
2279         qemu_file_skip(f, len); /* idstr */
2280         version_id = qemu_get_be32(f);
2281 
2282         ret = vmstate_load_state(f, sub_vmsd, opaque, version_id);
2283         if (ret) {
2284             return ret;
2285         }
2286     }
2287     return 0;
2288 }
2289 
vmstate_subsection_save(QEMUFile * f,const VMStateDescription * vmsd,void * opaque)2290 static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
2291                                     void *opaque)
2292 {
2293     const VMStateSubsection *sub = vmsd->subsections;
2294 
2295     while (sub && sub->needed) {
2296         if (sub->needed(opaque)) {
2297             const VMStateDescription *vmsd = sub->vmsd;
2298             uint8_t len;
2299 
2300             qemu_put_byte(f, QEMU_VM_SUBSECTION);
2301             len = strlen(vmsd->name);
2302             qemu_put_byte(f, len);
2303             qemu_put_buffer(f, (uint8_t *)vmsd->name, len);
2304             qemu_put_be32(f, vmsd->version_id);
2305             vmstate_save_state(f, vmsd, opaque);
2306         }
2307         sub++;
2308     }
2309 }
2310 
2311 typedef struct LoadStateEntry {
2312     QLIST_ENTRY(LoadStateEntry) entry;
2313     SaveStateEntry *se;
2314     int section_id;
2315     int version_id;
2316 } LoadStateEntry;
2317 
qemu_loadvm_state(QEMUFile * f)2318 int qemu_loadvm_state(QEMUFile *f)
2319 {
2320     QLIST_HEAD(, LoadStateEntry) loadvm_handlers =
2321         QLIST_HEAD_INITIALIZER(loadvm_handlers);
2322     LoadStateEntry *le, *new_le;
2323     uint8_t section_type;
2324     unsigned int v;
2325     int ret;
2326 
2327     if (qemu_savevm_state_blocked(NULL)) {
2328         return -EINVAL;
2329     }
2330 
2331     v = qemu_get_be32(f);
2332     if (v != QEMU_VM_FILE_MAGIC)
2333         return -EINVAL;
2334 
2335     v = qemu_get_be32(f);
2336     if (v < QEMU_VM_FILE_VERSION) {
2337         fprintf(stderr, "Snapshot format %d is too old for this version of the emulator, please create a new one.\n", v);
2338         return -ENOTSUP;
2339     } else if (v > QEMU_VM_FILE_VERSION) {
2340         fprintf(stderr, "Snapshot format %d is more recent than the emulator, please update your Android SDK Tools.\n", v);
2341         return -ENOTSUP;
2342     }
2343 
2344     while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) {
2345         uint32_t instance_id, version_id, section_id;
2346         SaveStateEntry *se;
2347         char idstr[257];
2348         int len;
2349 
2350         switch (section_type) {
2351         case QEMU_VM_SECTION_START:
2352         case QEMU_VM_SECTION_FULL:
2353             /* Read section start */
2354             section_id = qemu_get_be32(f);
2355             len = qemu_get_byte(f);
2356             qemu_get_buffer(f, (uint8_t *)idstr, len);
2357             idstr[len] = 0;
2358             instance_id = qemu_get_be32(f);
2359             version_id = qemu_get_be32(f);
2360 
2361             /* Find savevm section */
2362             se = find_se(idstr, instance_id);
2363             if (se == NULL) {
2364                 fprintf(stderr, "Unknown savevm section or instance '%s' %d\n", idstr, instance_id);
2365                 ret = -EINVAL;
2366                 goto out;
2367             }
2368 
2369             /* Validate version */
2370             if (version_id > se->version_id) {
2371                 fprintf(stderr, "savevm: unsupported version %d for '%s' v%d\n",
2372                         version_id, idstr, se->version_id);
2373                 ret = -EINVAL;
2374                 goto out;
2375             }
2376 
2377             /* Add entry */
2378             le = g_malloc0(sizeof(*le));
2379 
2380             le->se = se;
2381             le->section_id = section_id;
2382             le->version_id = version_id;
2383             QLIST_INSERT_HEAD(&loadvm_handlers, le, entry);
2384 
2385             ret = vmstate_load(f, le->se, le->version_id);
2386             if (ret < 0) {
2387                 fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n",
2388                         instance_id, idstr);
2389                 goto out;
2390             }
2391             break;
2392         case QEMU_VM_SECTION_PART:
2393         case QEMU_VM_SECTION_END:
2394             section_id = qemu_get_be32(f);
2395 
2396             QLIST_FOREACH(le, &loadvm_handlers, entry) {
2397                 if (le->section_id == section_id) {
2398                     break;
2399                 }
2400             }
2401             if (le == NULL) {
2402                 fprintf(stderr, "Unknown savevm section %d\n", section_id);
2403                 ret = -EINVAL;
2404                 goto out;
2405             }
2406 
2407             ret = vmstate_load(f, le->se, le->version_id);
2408             if (ret < 0) {
2409                 fprintf(stderr, "qemu: warning: error while loading state section id %d\n",
2410                         section_id);
2411                 goto out;
2412             }
2413             break;
2414         default:
2415             fprintf(stderr, "Unknown savevm section type %d\n", section_type);
2416             ret = -EINVAL;
2417             goto out;
2418         }
2419     }
2420 
2421     //cpu_synchronize_all_post_init();
2422 
2423     ret = 0;
2424 
2425 out:
2426     QLIST_FOREACH_SAFE(le, &loadvm_handlers, entry, new_le) {
2427         QLIST_REMOVE(le, entry);
2428         g_free(le);
2429     }
2430 
2431     if (ret == 0) {
2432         ret = qemu_file_get_error(f);
2433     }
2434 
2435     return ret;
2436 }
2437 #if 0
2438 static BlockDriverState *get_bs_snapshots(void)
2439 {
2440     BlockDriverState *bs;
2441     int i;
2442 
2443     if (bs_snapshots)
2444         return bs_snapshots;
2445     for(i = 0; i <= nb_drives; i++) {
2446         bs = drives_table[i].bdrv;
2447         if (bdrv_can_snapshot(bs))
2448             goto ok;
2449     }
2450     return NULL;
2451  ok:
2452     bs_snapshots = bs;
2453     return bs;
2454 }
2455 #endif
bdrv_snapshot_find(BlockDriverState * bs,QEMUSnapshotInfo * sn_info,const char * name)2456 static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
2457                               const char *name)
2458 {
2459     QEMUSnapshotInfo *sn_tab, *sn;
2460     int nb_sns, i, ret;
2461 
2462     ret = -ENOENT;
2463     nb_sns = bdrv_snapshot_list(bs, &sn_tab);
2464     if (nb_sns < 0)
2465         return ret;
2466     for(i = 0; i < nb_sns; i++) {
2467         sn = &sn_tab[i];
2468         if (!strcmp(sn->id_str, name) || !strcmp(sn->name, name)) {
2469             *sn_info = *sn;
2470             ret = 0;
2471             break;
2472         }
2473     }
2474     g_free(sn_tab);
2475     return ret;
2476 }
2477 
do_savevm(Monitor * err,const char * name)2478 void do_savevm(Monitor *err, const char *name)
2479 {
2480     BlockDriverState *bs, *bs1;
2481     QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
2482     int must_delete, ret;
2483     BlockDriverInfo bdi1, *bdi = &bdi1;
2484     QEMUFile *f;
2485     int saved_vm_running;
2486     uint32_t vm_state_size;
2487 #ifdef _WIN32
2488     struct _timeb tb;
2489 #else
2490     struct timeval tv;
2491 #endif
2492 
2493     bs = bdrv_snapshots();
2494     if (!bs) {
2495         monitor_printf(err, "No block device can accept snapshots\n");
2496         return;
2497     }
2498 
2499     /* ??? Should this occur after vm_stop?  */
2500     qemu_aio_flush();
2501 
2502     saved_vm_running = vm_running;
2503     vm_stop(0);
2504 
2505     must_delete = 0;
2506     if (name) {
2507         ret = bdrv_snapshot_find(bs, old_sn, name);
2508         if (ret >= 0) {
2509             must_delete = 1;
2510         }
2511     }
2512     memset(sn, 0, sizeof(*sn));
2513     if (must_delete) {
2514         pstrcpy(sn->name, sizeof(sn->name), old_sn->name);
2515         pstrcpy(sn->id_str, sizeof(sn->id_str), old_sn->id_str);
2516     } else {
2517         if (name)
2518             pstrcpy(sn->name, sizeof(sn->name), name);
2519     }
2520 
2521     /* fill auxiliary fields */
2522 #ifdef _WIN32
2523     _ftime(&tb);
2524     sn->date_sec = tb.time;
2525     sn->date_nsec = tb.millitm * 1000000;
2526 #else
2527     gettimeofday(&tv, NULL);
2528     sn->date_sec = tv.tv_sec;
2529     sn->date_nsec = tv.tv_usec * 1000;
2530 #endif
2531     sn->vm_clock_nsec = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
2532 
2533     if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) {
2534         monitor_printf(err, "Device %s does not support VM state snapshots\n",
2535                               bdrv_get_device_name(bs));
2536         goto the_end;
2537     }
2538 
2539     /* save the VM state */
2540     f = qemu_fopen_bdrv(bs, 1);
2541     if (!f) {
2542         monitor_printf(err, "Could not open VM state file\n");
2543         goto the_end;
2544     }
2545     ret = qemu_savevm_state(f);
2546     vm_state_size = qemu_ftell(f);
2547     qemu_fclose(f);
2548     if (ret < 0) {
2549         monitor_printf(err, "Error %d while writing VM\n", ret);
2550         goto the_end;
2551     }
2552 
2553     /* create the snapshots */
2554 
2555     bs1 = NULL;
2556     while ((bs1 = bdrv_next(bs1))) {
2557         if (bdrv_can_snapshot(bs1)) {
2558             if (must_delete) {
2559                 ret = bdrv_snapshot_delete(bs1, old_sn->id_str);
2560                 if (ret < 0) {
2561                     monitor_printf(err,
2562                                           "Error while deleting snapshot on '%s'\n",
2563                                           bdrv_get_device_name(bs1));
2564                 }
2565             }
2566             /* Write VM state size only to the image that contains the state */
2567             sn->vm_state_size = (bs == bs1 ? vm_state_size : 0);
2568             ret = bdrv_snapshot_create(bs1, sn);
2569             if (ret < 0) {
2570                 monitor_printf(err, "Error while creating snapshot on '%s'\n",
2571                                       bdrv_get_device_name(bs1));
2572             }
2573         }
2574     }
2575 
2576  the_end:
2577     if (saved_vm_running)
2578         vm_start();
2579 }
2580 
do_loadvm(Monitor * err,const char * name)2581 void do_loadvm(Monitor *err, const char *name)
2582 {
2583     BlockDriverState *bs, *bs1;
2584     BlockDriverInfo bdi1, *bdi = &bdi1;
2585     QEMUSnapshotInfo sn;
2586     QEMUFile *f;
2587     int ret;
2588     int saved_vm_running;
2589 
2590     bs = bdrv_snapshots();
2591     if (!bs) {
2592         monitor_printf(err, "No block device supports snapshots\n");
2593         return;
2594     }
2595 
2596     /* Flush all IO requests so they don't interfere with the new state.  */
2597     qemu_aio_flush();
2598 
2599     saved_vm_running = vm_running;
2600     vm_stop(0);
2601 
2602     bs1 = bs;
2603     do {
2604         if (bdrv_can_snapshot(bs1)) {
2605             ret = bdrv_snapshot_goto(bs1, name);
2606             if (ret < 0) {
2607                 if (bs != bs1)
2608                     monitor_printf(err, "Warning: ");
2609                 switch(ret) {
2610                 case -ENOTSUP:
2611                     monitor_printf(err,
2612                                    "Snapshots not supported on device '%s'\n",
2613                                    bdrv_get_device_name(bs1));
2614                     break;
2615                 case -ENOENT:
2616                     monitor_printf(err, "Could not find snapshot '%s' on "
2617                                    "device '%s'\n",
2618                                    name, bdrv_get_device_name(bs1));
2619                     break;
2620                 default:
2621                     monitor_printf(err, "Error %d while activating snapshot on"
2622                                    " '%s'\n", ret, bdrv_get_device_name(bs1));
2623                     break;
2624                 }
2625                 /* fatal on snapshot block device */
2626                 if (bs == bs1)
2627                     goto the_end;
2628             }
2629         }
2630     } while ((bs1 = bdrv_next(bs)));
2631 
2632     if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) {
2633         monitor_printf(err, "Device %s does not support VM state snapshots\n",
2634                        bdrv_get_device_name(bs));
2635         return;
2636     }
2637 
2638     /* Don't even try to load empty VM states */
2639     ret = bdrv_snapshot_find(bs, &sn, name);
2640     if ((ret >= 0) && (sn.vm_state_size == 0))
2641         goto the_end;
2642 
2643     /* restore the VM state */
2644     f = qemu_fopen_bdrv(bs, 0);
2645     if (!f) {
2646         monitor_printf(err, "Could not open VM state file\n");
2647         goto the_end;
2648     }
2649     ret = qemu_loadvm_state(f);
2650     qemu_fclose(f);
2651     if (ret < 0) {
2652         monitor_printf(err, "Error %d while loading VM state\n", ret);
2653     }
2654  the_end:
2655     if (saved_vm_running)
2656         vm_start();
2657 }
2658 
do_delvm(Monitor * err,const char * name)2659 void do_delvm(Monitor *err, const char *name)
2660 {
2661     BlockDriverState *bs, *bs1;
2662     int ret;
2663 
2664     bs = bdrv_snapshots();
2665     if (!bs) {
2666         monitor_printf(err, "No block device supports snapshots\n");
2667         return;
2668     }
2669 
2670     bs1 = NULL;
2671     while ((bs1 = bdrv_next(bs1))) {
2672         if (bdrv_can_snapshot(bs1)) {
2673             ret = bdrv_snapshot_delete(bs1, name);
2674             if (ret < 0) {
2675                 if (ret == -ENOTSUP)
2676                     monitor_printf(err,
2677                                           "Snapshots not supported on device '%s'\n",
2678                                           bdrv_get_device_name(bs1));
2679                 else
2680                     monitor_printf(err, "Error %d while deleting snapshot on "
2681                                           "'%s'\n", ret, bdrv_get_device_name(bs1));
2682             }
2683         }
2684     }
2685 }
2686 
do_info_snapshots(Monitor * out,Monitor * err)2687 void do_info_snapshots(Monitor* out, Monitor* err)
2688 {
2689     BlockDriverState *bs, *bs1;
2690     QEMUSnapshotInfo *sn_tab, *sn;
2691     int nb_sns, i;
2692     char buf[256];
2693 
2694     bs = bdrv_snapshots();
2695     if (!bs) {
2696         monitor_printf(err, "No available block device supports snapshots\n");
2697         return;
2698     }
2699     monitor_printf(out, "Snapshot devices:");
2700     bs1 = NULL;
2701     while ((bs1 = bdrv_next(bs1))) {
2702         if (bdrv_can_snapshot(bs1)) {
2703             if (bs == bs1)
2704                 monitor_printf(out, " %s", bdrv_get_device_name(bs1));
2705         }
2706     }
2707     monitor_printf(out, "\n");
2708 
2709     nb_sns = bdrv_snapshot_list(bs, &sn_tab);
2710     if (nb_sns < 0) {
2711         monitor_printf(err, "bdrv_snapshot_list: error %d\n", nb_sns);
2712         return;
2713     }
2714     monitor_printf(out, "Snapshot list (from %s):\n",
2715                    bdrv_get_device_name(bs));
2716     monitor_printf(out, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
2717     for(i = 0; i < nb_sns; i++) {
2718         sn = &sn_tab[i];
2719         monitor_printf(out, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
2720     }
2721     g_free(sn_tab);
2722 }
2723