Home | History | Annotate | Download | only in qemu
      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 "net.h"
     76 #include "monitor.h"
     77 #include "sysemu.h"
     78 #include "qemu-timer.h"
     79 #include "qemu-char.h"
     80 #include "blockdev.h"
     81 #include "block.h"
     82 #include "audio/audio.h"
     83 #include "migration.h"
     84 #include "qemu_socket.h"
     85 #include "qemu-queue.h"
     86 #include "qemu_file.h"
     87 #include "android/snapshot.h"
     88 
     89 
     90 #define SELF_ANNOUNCE_ROUNDS 5
     91 
     92 #ifndef ETH_P_RARP
     93 #define ETH_P_RARP 0x8035
     94 #endif
     95 #define ARP_HTYPE_ETH 0x0001
     96 #define ARP_PTYPE_IP 0x0800
     97 #define ARP_OP_REQUEST_REV 0x3
     98 
     99 static int announce_self_create(uint8_t *buf,
    100 				uint8_t *mac_addr)
    101 {
    102     /* Ethernet header. */
    103     memset(buf, 0xff, 6);         /* destination MAC addr */
    104     memcpy(buf + 6, mac_addr, 6); /* source MAC addr */
    105     *(uint16_t *)(buf + 12) = htons(ETH_P_RARP); /* ethertype */
    106 
    107     /* RARP header. */
    108     *(uint16_t *)(buf + 14) = htons(ARP_HTYPE_ETH); /* hardware addr space */
    109     *(uint16_t *)(buf + 16) = htons(ARP_PTYPE_IP); /* protocol addr space */
    110     *(buf + 18) = 6; /* hardware addr length (ethernet) */
    111     *(buf + 19) = 4; /* protocol addr length (IPv4) */
    112     *(uint16_t *)(buf + 20) = htons(ARP_OP_REQUEST_REV); /* opcode */
    113     memcpy(buf + 22, mac_addr, 6); /* source hw addr */
    114     memset(buf + 28, 0x00, 4);     /* source protocol addr */
    115     memcpy(buf + 32, mac_addr, 6); /* target hw addr */
    116     memset(buf + 38, 0x00, 4);     /* target protocol addr */
    117 
    118     /* Padding to get up to 60 bytes (ethernet min packet size, minus FCS). */
    119     memset(buf + 42, 0x00, 18);
    120 
    121     return 60; /* len (FCS will be added by hardware) */
    122 }
    123 
    124 static void qemu_announce_self_once(void *opaque)
    125 {
    126     int i, len;
    127     VLANState *vlan;
    128     VLANClientState *vc;
    129     uint8_t buf[256];
    130     static int count = SELF_ANNOUNCE_ROUNDS;
    131     QEMUTimer *timer = *(QEMUTimer **)opaque;
    132 
    133     for (i = 0; i < MAX_NICS; i++) {
    134         if (!nd_table[i].used)
    135             continue;
    136         len = announce_self_create(buf, nd_table[i].macaddr);
    137         vlan = nd_table[i].vlan;
    138 	for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
    139             vc->receive(vc, buf, len);
    140         }
    141     }
    142     if (--count) {
    143         /* delay 50ms, 150ms, 250ms, ... */
    144         qemu_mod_timer(timer, qemu_get_clock_ms(rt_clock) +
    145                        50 + (SELF_ANNOUNCE_ROUNDS - count - 1) * 100);
    146     } else {
    147 	    qemu_del_timer(timer);
    148 	    qemu_free_timer(timer);
    149     }
    150 }
    151 
    152 void qemu_announce_self(void)
    153 {
    154 	static QEMUTimer *timer;
    155 	timer = qemu_new_timer_ms(rt_clock, qemu_announce_self_once, &timer);
    156 	qemu_announce_self_once(&timer);
    157 }
    158 
    159 /***********************************************************/
    160 /* savevm/loadvm support */
    161 
    162 #define IO_BUF_SIZE 32768
    163 
    164 struct QEMUFile {
    165     QEMUFilePutBufferFunc *put_buffer;
    166     QEMUFileGetBufferFunc *get_buffer;
    167     QEMUFileCloseFunc *close;
    168     QEMUFileRateLimit *rate_limit;
    169     QEMUFileSetRateLimit *set_rate_limit;
    170     QEMUFileGetRateLimit *get_rate_limit;
    171     void *opaque;
    172     int is_write;
    173 
    174     int64_t buf_offset; /* start of buffer when writing, end of buffer
    175                            when reading */
    176     int buf_index;
    177     int buf_size; /* 0 when writing */
    178     uint8_t buf[IO_BUF_SIZE];
    179 
    180     int has_error;
    181 };
    182 
    183 typedef struct QEMUFileStdio
    184 {
    185     FILE *stdio_file;
    186     QEMUFile *file;
    187 } QEMUFileStdio;
    188 
    189 typedef struct QEMUFileSocket
    190 {
    191     int fd;
    192     QEMUFile *file;
    193 } QEMUFileSocket;
    194 
    195 static int socket_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
    196 {
    197     QEMUFileSocket *s = opaque;
    198     ssize_t len;
    199 
    200     do {
    201         len = recv(s->fd, (void *)buf, size, 0);
    202     } while (len == -1 && socket_error() == EINTR);
    203 
    204     if (len == -1)
    205         len = -socket_error();
    206 
    207     return len;
    208 }
    209 
    210 static int file_socket_close(void *opaque)
    211 {
    212     QEMUFileSocket *s = opaque;
    213     qemu_free(s);
    214     return 0;
    215 }
    216 
    217 static int stdio_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size)
    218 {
    219     QEMUFileStdio *s = opaque;
    220     return fwrite(buf, 1, size, s->stdio_file);
    221 }
    222 
    223 static int stdio_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
    224 {
    225     QEMUFileStdio *s = opaque;
    226     FILE *fp = s->stdio_file;
    227     int bytes;
    228 
    229     do {
    230         clearerr(fp);
    231         bytes = fread(buf, 1, size, fp);
    232     } while ((bytes == 0) && ferror(fp) && (errno == EINTR));
    233     return bytes;
    234 }
    235 
    236 static int stdio_pclose(void *opaque)
    237 {
    238     QEMUFileStdio *s = opaque;
    239     int ret;
    240     ret = pclose(s->stdio_file);
    241     qemu_free(s);
    242     return ret;
    243 }
    244 
    245 static int stdio_fclose(void *opaque)
    246 {
    247     QEMUFileStdio *s = opaque;
    248     fclose(s->stdio_file);
    249     qemu_free(s);
    250     return 0;
    251 }
    252 
    253 QEMUFile *qemu_popen(FILE *stdio_file, const char *mode)
    254 {
    255     QEMUFileStdio *s;
    256 
    257     if (stdio_file == NULL || mode == NULL || (mode[0] != 'r' && mode[0] != 'w') || mode[1] != 0) {
    258         fprintf(stderr, "qemu_popen: Argument validity check failed\n");
    259         return NULL;
    260     }
    261 
    262     s = qemu_mallocz(sizeof(QEMUFileStdio));
    263 
    264     s->stdio_file = stdio_file;
    265 
    266     if(mode[0] == 'r') {
    267         s->file = qemu_fopen_ops(s, NULL, stdio_get_buffer, stdio_pclose,
    268 				 NULL, NULL, NULL);
    269     } else {
    270         s->file = qemu_fopen_ops(s, stdio_put_buffer, NULL, stdio_pclose,
    271 				 NULL, NULL, NULL);
    272     }
    273     return s->file;
    274 }
    275 
    276 QEMUFile *qemu_popen_cmd(const char *command, const char *mode)
    277 {
    278     FILE *popen_file;
    279 
    280     popen_file = popen(command, mode);
    281     if(popen_file == NULL) {
    282         return NULL;
    283     }
    284 
    285     return qemu_popen(popen_file, mode);
    286 }
    287 
    288 int qemu_stdio_fd(QEMUFile *f)
    289 {
    290     QEMUFileStdio *p;
    291     int fd;
    292 
    293     p = (QEMUFileStdio *)f->opaque;
    294     fd = fileno(p->stdio_file);
    295 
    296     return fd;
    297 }
    298 
    299 QEMUFile *qemu_fdopen(int fd, const char *mode)
    300 {
    301     QEMUFileStdio *s;
    302 
    303     if (mode == NULL ||
    304 	(mode[0] != 'r' && mode[0] != 'w') ||
    305 	mode[1] != 'b' || mode[2] != 0) {
    306         fprintf(stderr, "qemu_fdopen: Argument validity check failed\n");
    307         return NULL;
    308     }
    309 
    310     s = qemu_mallocz(sizeof(QEMUFileStdio));
    311     s->stdio_file = fdopen(fd, mode);
    312     if (!s->stdio_file)
    313         goto fail;
    314 
    315     if(mode[0] == 'r') {
    316         s->file = qemu_fopen_ops(s, NULL, stdio_get_buffer, stdio_fclose,
    317 				 NULL, NULL, NULL);
    318     } else {
    319         s->file = qemu_fopen_ops(s, stdio_put_buffer, NULL, stdio_fclose,
    320 				 NULL, NULL, NULL);
    321     }
    322     return s->file;
    323 
    324 fail:
    325     qemu_free(s);
    326     return NULL;
    327 }
    328 
    329 QEMUFile *qemu_fopen_socket(int fd)
    330 {
    331     QEMUFileSocket *s = qemu_mallocz(sizeof(QEMUFileSocket));
    332 
    333     s->fd = fd;
    334     s->file = qemu_fopen_ops(s, NULL, socket_get_buffer, file_socket_close,
    335 			     NULL, NULL, NULL);
    336     return s->file;
    337 }
    338 
    339 static int file_put_buffer(void *opaque, const uint8_t *buf,
    340                             int64_t pos, int size)
    341 {
    342     QEMUFileStdio *s = opaque;
    343     fseek(s->stdio_file, pos, SEEK_SET);
    344     return fwrite(buf, 1, size, s->stdio_file);
    345 }
    346 
    347 static int file_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
    348 {
    349     QEMUFileStdio *s = opaque;
    350     fseek(s->stdio_file, pos, SEEK_SET);
    351     return fread(buf, 1, size, s->stdio_file);
    352 }
    353 
    354 QEMUFile *qemu_fopen(const char *filename, const char *mode)
    355 {
    356     QEMUFileStdio *s;
    357 
    358     if (mode == NULL ||
    359 	(mode[0] != 'r' && mode[0] != 'w') ||
    360 	mode[1] != 'b' || mode[2] != 0) {
    361         fprintf(stderr, "qemu_fopen: Argument validity check failed\n");
    362         return NULL;
    363     }
    364 
    365     s = qemu_mallocz(sizeof(QEMUFileStdio));
    366 
    367     s->stdio_file = fopen(filename, mode);
    368     if (!s->stdio_file)
    369         goto fail;
    370 
    371     if(mode[0] == 'w') {
    372         s->file = qemu_fopen_ops(s, file_put_buffer, NULL, stdio_fclose,
    373 				 NULL, NULL, NULL);
    374     } else {
    375         s->file = qemu_fopen_ops(s, NULL, file_get_buffer, stdio_fclose,
    376 			       NULL, NULL, NULL);
    377     }
    378     return s->file;
    379 fail:
    380     qemu_free(s);
    381     return NULL;
    382 }
    383 
    384 static int block_put_buffer(void *opaque, const uint8_t *buf,
    385                            int64_t pos, int size)
    386 {
    387     bdrv_save_vmstate(opaque, buf, pos, size);
    388     return size;
    389 }
    390 
    391 static int block_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
    392 {
    393     return bdrv_load_vmstate(opaque, buf, pos, size);
    394 }
    395 
    396 static int bdrv_fclose(void *opaque)
    397 {
    398     return 0;
    399 }
    400 
    401 static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int is_writable)
    402 {
    403     if (is_writable)
    404         return qemu_fopen_ops(bs, block_put_buffer, NULL, bdrv_fclose,
    405 			      NULL, NULL, NULL);
    406     return qemu_fopen_ops(bs, NULL, block_get_buffer, bdrv_fclose, NULL, NULL, NULL);
    407 }
    408 
    409 QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer,
    410                          QEMUFileGetBufferFunc *get_buffer,
    411                          QEMUFileCloseFunc *close,
    412                          QEMUFileRateLimit *rate_limit,
    413                          QEMUFileSetRateLimit *set_rate_limit,
    414                          QEMUFileGetRateLimit *get_rate_limit)
    415 {
    416     QEMUFile *f;
    417 
    418     f = qemu_mallocz(sizeof(QEMUFile));
    419 
    420     f->opaque = opaque;
    421     f->put_buffer = put_buffer;
    422     f->get_buffer = get_buffer;
    423     f->close = close;
    424     f->rate_limit = rate_limit;
    425     f->set_rate_limit = set_rate_limit;
    426     f->get_rate_limit = get_rate_limit;
    427     f->is_write = 0;
    428 
    429     return f;
    430 }
    431 
    432 int qemu_file_has_error(QEMUFile *f)
    433 {
    434     return f->has_error;
    435 }
    436 
    437 void qemu_file_set_error(QEMUFile *f)
    438 {
    439     f->has_error = 1;
    440 }
    441 
    442 void qemu_fflush(QEMUFile *f)
    443 {
    444     if (!f->put_buffer)
    445         return;
    446 
    447     if (f->is_write && f->buf_index > 0) {
    448         int len;
    449 
    450         len = f->put_buffer(f->opaque, f->buf, f->buf_offset, f->buf_index);
    451         if (len > 0)
    452             f->buf_offset += f->buf_index;
    453         else
    454             f->has_error = 1;
    455         f->buf_index = 0;
    456     }
    457 }
    458 
    459 static void qemu_fill_buffer(QEMUFile *f)
    460 {
    461     int len;
    462 
    463     if (!f->get_buffer)
    464         return;
    465 
    466     if (f->is_write)
    467         abort();
    468 
    469     len = f->get_buffer(f->opaque, f->buf, f->buf_offset, IO_BUF_SIZE);
    470     if (len > 0) {
    471         f->buf_index = 0;
    472         f->buf_size = len;
    473         f->buf_offset += len;
    474     } else if (len != -EAGAIN)
    475         f->has_error = 1;
    476 }
    477 
    478 int qemu_fclose(QEMUFile *f)
    479 {
    480     int ret = 0;
    481     qemu_fflush(f);
    482     if (f->close)
    483         ret = f->close(f->opaque);
    484     qemu_free(f);
    485     return ret;
    486 }
    487 
    488 void qemu_file_put_notify(QEMUFile *f)
    489 {
    490     f->put_buffer(f->opaque, NULL, 0, 0);
    491 }
    492 
    493 void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
    494 {
    495     int l;
    496 
    497     if (!f->has_error && f->is_write == 0 && f->buf_index > 0) {
    498         fprintf(stderr,
    499                 "Attempted to write to buffer while read buffer is not empty\n");
    500         abort();
    501     }
    502 
    503     while (!f->has_error && size > 0) {
    504         l = IO_BUF_SIZE - f->buf_index;
    505         if (l > size)
    506             l = size;
    507         memcpy(f->buf + f->buf_index, buf, l);
    508         f->is_write = 1;
    509         f->buf_index += l;
    510         buf += l;
    511         size -= l;
    512         if (f->buf_index >= IO_BUF_SIZE)
    513             qemu_fflush(f);
    514     }
    515 }
    516 
    517 void qemu_put_byte(QEMUFile *f, int v)
    518 {
    519     if (!f->has_error && f->is_write == 0 && f->buf_index > 0) {
    520         fprintf(stderr,
    521                 "Attempted to write to buffer while read buffer is not empty\n");
    522         abort();
    523     }
    524 
    525     f->buf[f->buf_index++] = v;
    526     f->is_write = 1;
    527     if (f->buf_index >= IO_BUF_SIZE)
    528         qemu_fflush(f);
    529 }
    530 
    531 int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size1)
    532 {
    533     int size, l;
    534 
    535     if (f->is_write)
    536         abort();
    537 
    538     size = size1;
    539     while (size > 0) {
    540         l = f->buf_size - f->buf_index;
    541         if (l == 0) {
    542             qemu_fill_buffer(f);
    543             l = f->buf_size - f->buf_index;
    544             if (l == 0)
    545                 break;
    546         }
    547         if (l > size)
    548             l = size;
    549         memcpy(buf, f->buf + f->buf_index, l);
    550         f->buf_index += l;
    551         buf += l;
    552         size -= l;
    553     }
    554     return size1 - size;
    555 }
    556 
    557 int qemu_get_byte(QEMUFile *f)
    558 {
    559     if (f->is_write)
    560         abort();
    561 
    562     if (f->buf_index >= f->buf_size) {
    563         qemu_fill_buffer(f);
    564         if (f->buf_index >= f->buf_size)
    565             return 0;
    566     }
    567     return f->buf[f->buf_index++];
    568 }
    569 
    570 int64_t qemu_ftell(QEMUFile *f)
    571 {
    572     return f->buf_offset - f->buf_size + f->buf_index;
    573 }
    574 
    575 int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence)
    576 {
    577     if (whence == SEEK_SET) {
    578         /* nothing to do */
    579     } else if (whence == SEEK_CUR) {
    580         pos += qemu_ftell(f);
    581     } else {
    582         /* SEEK_END not supported */
    583         return -1;
    584     }
    585     if (f->put_buffer) {
    586         qemu_fflush(f);
    587         f->buf_offset = pos;
    588     } else {
    589         f->buf_offset = pos;
    590         f->buf_index = 0;
    591         f->buf_size = 0;
    592     }
    593     return pos;
    594 }
    595 
    596 int qemu_file_rate_limit(QEMUFile *f)
    597 {
    598     if (f->rate_limit)
    599         return f->rate_limit(f->opaque);
    600 
    601     return 0;
    602 }
    603 
    604 int64_t qemu_file_get_rate_limit(QEMUFile *f)
    605 {
    606     if (f->get_rate_limit)
    607         return f->get_rate_limit(f->opaque);
    608 
    609     return 0;
    610 }
    611 
    612 int64_t qemu_file_set_rate_limit(QEMUFile *f, int64_t new_rate)
    613 {
    614     /* any failed or completed migration keeps its state to allow probing of
    615      * migration data, but has no associated file anymore */
    616     if (f && f->set_rate_limit)
    617         return f->set_rate_limit(f->opaque, new_rate);
    618 
    619     return 0;
    620 }
    621 
    622 void qemu_put_be16(QEMUFile *f, unsigned int v)
    623 {
    624     qemu_put_byte(f, v >> 8);
    625     qemu_put_byte(f, v);
    626 }
    627 
    628 void qemu_put_be32(QEMUFile *f, unsigned int v)
    629 {
    630     qemu_put_byte(f, v >> 24);
    631     qemu_put_byte(f, v >> 16);
    632     qemu_put_byte(f, v >> 8);
    633     qemu_put_byte(f, v);
    634 }
    635 
    636 void qemu_put_be64(QEMUFile *f, uint64_t v)
    637 {
    638     qemu_put_be32(f, v >> 32);
    639     qemu_put_be32(f, v);
    640 }
    641 
    642 unsigned int qemu_get_be16(QEMUFile *f)
    643 {
    644     unsigned int v;
    645     v = qemu_get_byte(f) << 8;
    646     v |= qemu_get_byte(f);
    647     return v;
    648 }
    649 
    650 unsigned int qemu_get_be32(QEMUFile *f)
    651 {
    652     unsigned int v;
    653     v = qemu_get_byte(f) << 24;
    654     v |= qemu_get_byte(f) << 16;
    655     v |= qemu_get_byte(f) << 8;
    656     v |= qemu_get_byte(f);
    657     return v;
    658 }
    659 
    660 uint64_t qemu_get_be64(QEMUFile *f)
    661 {
    662     uint64_t v;
    663     v = (uint64_t)qemu_get_be32(f) << 32;
    664     v |= qemu_get_be32(f);
    665     return v;
    666 }
    667 
    668 void  qemu_put_struct(QEMUFile*  f, const QField*  fields, const void*  s)
    669 {
    670     const QField*  qf = fields;
    671 
    672     /* Iterate over struct fields */
    673     while (qf->type != Q_FIELD_END) {
    674         uint8_t*  p = (uint8_t*)s + qf->offset;
    675 
    676         switch (qf->type) {
    677             case Q_FIELD_BYTE:
    678                 qemu_put_byte(f, p[0]);
    679                 break;
    680             case Q_FIELD_INT16:
    681                 qemu_put_be16(f, ((uint16_t*)p)[0]);
    682                 break;
    683             case Q_FIELD_INT32:
    684                 qemu_put_be32(f, ((uint32_t*)p)[0]);
    685                 break;
    686             case Q_FIELD_INT64:
    687                 qemu_put_be64(f, ((uint64_t*)p)[0]);
    688                 break;
    689             case Q_FIELD_BUFFER:
    690                 if (qf[1].type != Q_FIELD_BUFFER_SIZE ||
    691                     qf[2].type != Q_FIELD_BUFFER_SIZE)
    692                 {
    693                     fprintf(stderr, "%s: invalid QFIELD_BUFFER item passed as argument. aborting\n",
    694                             __FUNCTION__ );
    695                     exit(1);
    696                 }
    697                 else
    698                 {
    699                     uint32_t  size = ((uint32_t)qf[1].offset << 16) | (uint32_t)qf[2].offset;
    700 
    701                     qemu_put_buffer(f, p, size);
    702                     qf += 2;
    703                 }
    704                 break;
    705             default:
    706                 fprintf(stderr, "%s: invalid fields list passed as argument. aborting\n", __FUNCTION__);
    707                 exit(1);
    708         }
    709         qf++;
    710     }
    711 }
    712 
    713 int   qemu_get_struct(QEMUFile*  f, const QField*  fields, void*  s)
    714 {
    715     const QField*  qf = fields;
    716 
    717     /* Iterate over struct fields */
    718     while (qf->type != Q_FIELD_END) {
    719         uint8_t*  p = (uint8_t*)s + qf->offset;
    720 
    721         switch (qf->type) {
    722             case Q_FIELD_BYTE:
    723                 p[0] = qemu_get_byte(f);
    724                 break;
    725             case Q_FIELD_INT16:
    726                 ((uint16_t*)p)[0] = qemu_get_be16(f);
    727                 break;
    728             case Q_FIELD_INT32:
    729                 ((uint32_t*)p)[0] = qemu_get_be32(f);
    730                 break;
    731             case Q_FIELD_INT64:
    732                 ((uint64_t*)p)[0] = qemu_get_be64(f);
    733                 break;
    734             case Q_FIELD_BUFFER:
    735                 if (qf[1].type != Q_FIELD_BUFFER_SIZE ||
    736                         qf[2].type != Q_FIELD_BUFFER_SIZE)
    737                 {
    738                     fprintf(stderr, "%s: invalid QFIELD_BUFFER item passed as argument.\n",
    739                             __FUNCTION__ );
    740                     return -1;
    741                 }
    742                 else
    743                 {
    744                     uint32_t  size = ((uint32_t)qf[1].offset << 16) | (uint32_t)qf[2].offset;
    745                     int       ret  = qemu_get_buffer(f, p, size);
    746 
    747                     if (ret != size) {
    748                         fprintf(stderr, "%s: not enough bytes to load structure\n", __FUNCTION__);
    749                         return -1;
    750                     }
    751                     qf += 2;
    752                 }
    753                 break;
    754             default:
    755                 fprintf(stderr, "%s: invalid fields list passed as argument. aborting\n", __FUNCTION__);
    756                 exit(1);
    757         }
    758         qf++;
    759     }
    760     return 0;
    761 }
    762 
    763 /* write a float to file */
    764 void qemu_put_float(QEMUFile *f, float v)
    765 {
    766     uint8_t *bytes = (uint8_t*) &v;
    767     qemu_put_buffer(f, bytes, sizeof(float));
    768 }
    769 
    770 /* read a float from file */
    771 float qemu_get_float(QEMUFile *f)
    772 {
    773     uint8_t bytes[sizeof(float)];
    774     qemu_get_buffer(f, bytes, sizeof(float));
    775 
    776     return *((float*) bytes);
    777 }
    778 
    779 typedef struct SaveStateEntry {
    780     char idstr[256];
    781     int instance_id;
    782     int version_id;
    783     int section_id;
    784     SaveLiveStateHandler *save_live_state;
    785     SaveStateHandler *save_state;
    786     LoadStateHandler *load_state;
    787     void *opaque;
    788     struct SaveStateEntry *next;
    789 } SaveStateEntry;
    790 
    791 static SaveStateEntry *first_se;
    792 
    793 /* TODO: Individual devices generally have very little idea about the rest
    794    of the system, so instance_id should be removed/replaced.
    795    Meanwhile pass -1 as instance_id if you do not already have a clearly
    796    distinguishing id for all instances of your device class. */
    797 int register_savevm_live(const char *idstr,
    798                          int instance_id,
    799                          int version_id,
    800                          SaveLiveStateHandler *save_live_state,
    801                          SaveStateHandler *save_state,
    802                          LoadStateHandler *load_state,
    803                          void *opaque)
    804 {
    805     SaveStateEntry *se, **pse;
    806     static int global_section_id;
    807 
    808     se = qemu_malloc(sizeof(SaveStateEntry));
    809     pstrcpy(se->idstr, sizeof(se->idstr), idstr);
    810     se->instance_id = (instance_id == -1) ? 0 : instance_id;
    811     se->version_id = version_id;
    812     se->section_id = global_section_id++;
    813     se->save_live_state = save_live_state;
    814     se->save_state = save_state;
    815     se->load_state = load_state;
    816     se->opaque = opaque;
    817     se->next = NULL;
    818 
    819     /* add at the end of list */
    820     pse = &first_se;
    821     while (*pse != NULL) {
    822         if (instance_id == -1
    823                 && strcmp(se->idstr, (*pse)->idstr) == 0
    824                 && se->instance_id <= (*pse)->instance_id)
    825             se->instance_id = (*pse)->instance_id + 1;
    826         pse = &(*pse)->next;
    827     }
    828     *pse = se;
    829     return 0;
    830 }
    831 
    832 int register_savevm(const char *idstr,
    833                     int instance_id,
    834                     int version_id,
    835                     SaveStateHandler *save_state,
    836                     LoadStateHandler *load_state,
    837                     void *opaque)
    838 {
    839     return register_savevm_live(idstr, instance_id, version_id,
    840                                 NULL, save_state, load_state, opaque);
    841 }
    842 
    843 void unregister_savevm(const char *idstr, void *opaque)
    844 {
    845     SaveStateEntry **pse;
    846 
    847     pse = &first_se;
    848     while (*pse != NULL) {
    849         if (strcmp((*pse)->idstr, idstr) == 0 && (*pse)->opaque == opaque) {
    850             SaveStateEntry *next = (*pse)->next;
    851             qemu_free(*pse);
    852             *pse = next;
    853             continue;
    854         }
    855         pse = &(*pse)->next;
    856     }
    857 }
    858 
    859 #define QEMU_VM_FILE_MAGIC           0x5145564d
    860 #define QEMU_VM_FILE_VERSION_COMPAT  0x00000002
    861 #define QEMU_VM_FILE_VERSION         0x00000003
    862 
    863 #define QEMU_VM_EOF                  0x00
    864 #define QEMU_VM_SECTION_START        0x01
    865 #define QEMU_VM_SECTION_PART         0x02
    866 #define QEMU_VM_SECTION_END          0x03
    867 #define QEMU_VM_SECTION_FULL         0x04
    868 
    869 int qemu_savevm_state_begin(QEMUFile *f)
    870 {
    871     SaveStateEntry *se;
    872 
    873     qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
    874     qemu_put_be32(f, QEMU_VM_FILE_VERSION);
    875 
    876     for (se = first_se; se != NULL; se = se->next) {
    877         int len;
    878 
    879         if (se->save_live_state == NULL)
    880             continue;
    881 
    882         /* Section type */
    883         qemu_put_byte(f, QEMU_VM_SECTION_START);
    884         qemu_put_be32(f, se->section_id);
    885 
    886         /* ID string */
    887         len = strlen(se->idstr);
    888         qemu_put_byte(f, len);
    889         qemu_put_buffer(f, (uint8_t *)se->idstr, len);
    890 
    891         qemu_put_be32(f, se->instance_id);
    892         qemu_put_be32(f, se->version_id);
    893 
    894         se->save_live_state(f, QEMU_VM_SECTION_START, se->opaque);
    895     }
    896 
    897     if (qemu_file_has_error(f))
    898         return -EIO;
    899 
    900     return 0;
    901 }
    902 
    903 int qemu_savevm_state_iterate(QEMUFile *f)
    904 {
    905     SaveStateEntry *se;
    906     int ret = 1;
    907 
    908     for (se = first_se; se != NULL; se = se->next) {
    909         if (se->save_live_state == NULL)
    910             continue;
    911 
    912         /* Section type */
    913         qemu_put_byte(f, QEMU_VM_SECTION_PART);
    914         qemu_put_be32(f, se->section_id);
    915 
    916         ret &= !!se->save_live_state(f, QEMU_VM_SECTION_PART, se->opaque);
    917     }
    918 
    919     if (ret)
    920         return 1;
    921 
    922     if (qemu_file_has_error(f))
    923         return -EIO;
    924 
    925     return 0;
    926 }
    927 
    928 int qemu_savevm_state_complete(QEMUFile *f)
    929 {
    930     SaveStateEntry *se;
    931 
    932     for (se = first_se; se != NULL; se = se->next) {
    933         if (se->save_live_state == NULL)
    934             continue;
    935 
    936         /* Section type */
    937         qemu_put_byte(f, QEMU_VM_SECTION_END);
    938         qemu_put_be32(f, se->section_id);
    939 
    940         se->save_live_state(f, QEMU_VM_SECTION_END, se->opaque);
    941     }
    942 
    943     for(se = first_se; se != NULL; se = se->next) {
    944         int len;
    945 
    946         if (se->save_state == NULL)
    947             continue;
    948 
    949         /* Section type */
    950         qemu_put_byte(f, QEMU_VM_SECTION_FULL);
    951         qemu_put_be32(f, se->section_id);
    952 
    953         /* ID string */
    954         len = strlen(se->idstr);
    955         qemu_put_byte(f, len);
    956         qemu_put_buffer(f, (uint8_t *)se->idstr, len);
    957 
    958         qemu_put_be32(f, se->instance_id);
    959         qemu_put_be32(f, se->version_id);
    960 
    961         se->save_state(f, se->opaque);
    962     }
    963 
    964     qemu_put_byte(f, QEMU_VM_EOF);
    965 
    966     if (qemu_file_has_error(f))
    967         return -EIO;
    968 
    969     return 0;
    970 }
    971 
    972 int qemu_savevm_state(QEMUFile *f)
    973 {
    974     int saved_vm_running;
    975     int ret;
    976 
    977     saved_vm_running = vm_running;
    978     vm_stop(0);
    979 
    980     bdrv_flush_all();
    981 
    982     ret = qemu_savevm_state_begin(f);
    983     if (ret < 0)
    984         goto out;
    985 
    986     do {
    987         ret = qemu_savevm_state_iterate(f);
    988         if (ret < 0)
    989             goto out;
    990     } while (ret == 0);
    991 
    992     ret = qemu_savevm_state_complete(f);
    993 
    994 out:
    995     if (qemu_file_has_error(f))
    996         ret = -EIO;
    997 
    998     if (!ret && saved_vm_running)
    999         vm_start();
   1000 
   1001     return ret;
   1002 }
   1003 
   1004 static SaveStateEntry *find_se(const char *idstr, int instance_id)
   1005 {
   1006     SaveStateEntry *se;
   1007 
   1008     for(se = first_se; se != NULL; se = se->next) {
   1009         if (!strcmp(se->idstr, idstr) &&
   1010             instance_id == se->instance_id)
   1011             return se;
   1012     }
   1013     return NULL;
   1014 }
   1015 
   1016 typedef struct LoadStateEntry {
   1017     SaveStateEntry *se;
   1018     int section_id;
   1019     int version_id;
   1020     struct LoadStateEntry *next;
   1021 } LoadStateEntry;
   1022 
   1023 static int qemu_loadvm_state_v2(QEMUFile *f)
   1024 {
   1025     SaveStateEntry *se;
   1026     int len, ret, instance_id, record_len, version_id;
   1027     int64_t total_len, end_pos, cur_pos;
   1028     char idstr[256];
   1029 
   1030     total_len = qemu_get_be64(f);
   1031     end_pos = total_len + qemu_ftell(f);
   1032     for(;;) {
   1033         if (qemu_ftell(f) >= end_pos)
   1034             break;
   1035         len = qemu_get_byte(f);
   1036         qemu_get_buffer(f, (uint8_t *)idstr, len);
   1037         idstr[len] = '\0';
   1038         instance_id = qemu_get_be32(f);
   1039         version_id = qemu_get_be32(f);
   1040         record_len = qemu_get_be32(f);
   1041         cur_pos = qemu_ftell(f);
   1042         se = find_se(idstr, instance_id);
   1043         if (!se) {
   1044             fprintf(stderr, "qemu: warning: instance 0x%x of device '%s' not present in current VM\n",
   1045                     instance_id, idstr);
   1046         } else {
   1047             ret = se->load_state(f, se->opaque, version_id);
   1048             if (ret < 0) {
   1049                 fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n",
   1050                         instance_id, idstr);
   1051                 return ret;
   1052             }
   1053         }
   1054         /* always seek to exact end of record */
   1055         qemu_fseek(f, cur_pos + record_len, SEEK_SET);
   1056     }
   1057 
   1058     if (qemu_file_has_error(f))
   1059         return -EIO;
   1060 
   1061     return 0;
   1062 }
   1063 
   1064 int qemu_loadvm_state(QEMUFile *f)
   1065 {
   1066     LoadStateEntry *first_le = NULL;
   1067     uint8_t section_type;
   1068     unsigned int v;
   1069     int ret;
   1070 
   1071     v = qemu_get_be32(f);
   1072     if (v != QEMU_VM_FILE_MAGIC)
   1073         return -EINVAL;
   1074 
   1075     v = qemu_get_be32(f);
   1076     if (v == QEMU_VM_FILE_VERSION_COMPAT)
   1077         return qemu_loadvm_state_v2(f);
   1078     if (v != QEMU_VM_FILE_VERSION)
   1079         return -ENOTSUP;
   1080 
   1081     while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) {
   1082         uint32_t instance_id, version_id, section_id;
   1083         LoadStateEntry *le;
   1084         SaveStateEntry *se;
   1085         char idstr[257];
   1086         int len;
   1087 
   1088         switch (section_type) {
   1089         case QEMU_VM_SECTION_START:
   1090         case QEMU_VM_SECTION_FULL:
   1091             /* Read section start */
   1092             section_id = qemu_get_be32(f);
   1093             len = qemu_get_byte(f);
   1094             qemu_get_buffer(f, (uint8_t *)idstr, len);
   1095             idstr[len] = 0;
   1096             instance_id = qemu_get_be32(f);
   1097             version_id = qemu_get_be32(f);
   1098 
   1099             /* Find savevm section */
   1100             se = find_se(idstr, instance_id);
   1101             if (se == NULL) {
   1102                 fprintf(stderr, "Unknown savevm section or instance '%s' %d\n", idstr, instance_id);
   1103                 ret = -EINVAL;
   1104                 goto out;
   1105             }
   1106 
   1107             /* Validate version */
   1108             if (version_id > se->version_id) {
   1109                 fprintf(stderr, "savevm: unsupported version %d for '%s' v%d\n",
   1110                         version_id, idstr, se->version_id);
   1111                 ret = -EINVAL;
   1112                 goto out;
   1113             }
   1114 
   1115             /* Add entry */
   1116             le = qemu_mallocz(sizeof(*le));
   1117 
   1118             le->se = se;
   1119             le->section_id = section_id;
   1120             le->version_id = version_id;
   1121             le->next = first_le;
   1122             first_le = le;
   1123 
   1124             if (le->se->load_state(f, le->se->opaque, le->version_id)) {
   1125                 fprintf(stderr, "savevm: unable to load section %s\n", idstr);
   1126                 ret = -EINVAL;
   1127                 goto out;
   1128             }
   1129             break;
   1130         case QEMU_VM_SECTION_PART:
   1131         case QEMU_VM_SECTION_END:
   1132             section_id = qemu_get_be32(f);
   1133 
   1134             for (le = first_le; le && le->section_id != section_id; le = le->next);
   1135             if (le == NULL) {
   1136                 fprintf(stderr, "Unknown savevm section %d\n", section_id);
   1137                 ret = -EINVAL;
   1138                 goto out;
   1139             }
   1140 
   1141             le->se->load_state(f, le->se->opaque, le->version_id);
   1142             break;
   1143         default:
   1144             fprintf(stderr, "Unknown savevm section type %d\n", section_type);
   1145             ret = -EINVAL;
   1146             goto out;
   1147         }
   1148     }
   1149 
   1150     ret = 0;
   1151 
   1152 out:
   1153     while (first_le) {
   1154         LoadStateEntry *le = first_le;
   1155         first_le = first_le->next;
   1156         qemu_free(le);
   1157     }
   1158 
   1159     if (qemu_file_has_error(f))
   1160         ret = -EIO;
   1161 
   1162     return ret;
   1163 }
   1164 #if 0
   1165 static BlockDriverState *get_bs_snapshots(void)
   1166 {
   1167     BlockDriverState *bs;
   1168     int i;
   1169 
   1170     if (bs_snapshots)
   1171         return bs_snapshots;
   1172     for(i = 0; i <= nb_drives; i++) {
   1173         bs = drives_table[i].bdrv;
   1174         if (bdrv_can_snapshot(bs))
   1175             goto ok;
   1176     }
   1177     return NULL;
   1178  ok:
   1179     bs_snapshots = bs;
   1180     return bs;
   1181 }
   1182 #endif
   1183 static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
   1184                               const char *name)
   1185 {
   1186     QEMUSnapshotInfo *sn_tab, *sn;
   1187     int nb_sns, i, ret;
   1188 
   1189     ret = -ENOENT;
   1190     nb_sns = bdrv_snapshot_list(bs, &sn_tab);
   1191     if (nb_sns < 0)
   1192         return ret;
   1193     for(i = 0; i < nb_sns; i++) {
   1194         sn = &sn_tab[i];
   1195         if (!strcmp(sn->id_str, name) || !strcmp(sn->name, name)) {
   1196             *sn_info = *sn;
   1197             ret = 0;
   1198             break;
   1199         }
   1200     }
   1201     qemu_free(sn_tab);
   1202     return ret;
   1203 }
   1204 
   1205 void do_savevm(Monitor *err, const char *name)
   1206 {
   1207     BlockDriverState *bs, *bs1;
   1208     QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
   1209     int must_delete, ret;
   1210     BlockDriverInfo bdi1, *bdi = &bdi1;
   1211     QEMUFile *f;
   1212     int saved_vm_running;
   1213     uint32_t vm_state_size;
   1214 #ifdef _WIN32
   1215     struct _timeb tb;
   1216 #else
   1217     struct timeval tv;
   1218 #endif
   1219 
   1220     bs = bdrv_snapshots();
   1221     if (!bs) {
   1222         monitor_printf(err, "No block device can accept snapshots\n");
   1223         return;
   1224     }
   1225 
   1226     /* ??? Should this occur after vm_stop?  */
   1227     qemu_aio_flush();
   1228 
   1229     saved_vm_running = vm_running;
   1230     vm_stop(0);
   1231 
   1232     must_delete = 0;
   1233     if (name) {
   1234         ret = bdrv_snapshot_find(bs, old_sn, name);
   1235         if (ret >= 0) {
   1236             must_delete = 1;
   1237         }
   1238     }
   1239     memset(sn, 0, sizeof(*sn));
   1240     if (must_delete) {
   1241         pstrcpy(sn->name, sizeof(sn->name), old_sn->name);
   1242         pstrcpy(sn->id_str, sizeof(sn->id_str), old_sn->id_str);
   1243     } else {
   1244         if (name)
   1245             pstrcpy(sn->name, sizeof(sn->name), name);
   1246     }
   1247 
   1248     /* fill auxiliary fields */
   1249 #ifdef _WIN32
   1250     _ftime(&tb);
   1251     sn->date_sec = tb.time;
   1252     sn->date_nsec = tb.millitm * 1000000;
   1253 #else
   1254     gettimeofday(&tv, NULL);
   1255     sn->date_sec = tv.tv_sec;
   1256     sn->date_nsec = tv.tv_usec * 1000;
   1257 #endif
   1258     sn->vm_clock_nsec = qemu_get_clock_ns(vm_clock);
   1259 
   1260     if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) {
   1261         monitor_printf(err, "Device %s does not support VM state snapshots\n",
   1262                               bdrv_get_device_name(bs));
   1263         goto the_end;
   1264     }
   1265 
   1266     /* save the VM state */
   1267     f = qemu_fopen_bdrv(bs, 1);
   1268     if (!f) {
   1269         monitor_printf(err, "Could not open VM state file\n");
   1270         goto the_end;
   1271     }
   1272     ret = qemu_savevm_state(f);
   1273     vm_state_size = qemu_ftell(f);
   1274     qemu_fclose(f);
   1275     if (ret < 0) {
   1276         monitor_printf(err, "Error %d while writing VM\n", ret);
   1277         goto the_end;
   1278     }
   1279 
   1280     /* create the snapshots */
   1281 
   1282     bs1 = NULL;
   1283     while ((bs1 = bdrv_next(bs1))) {
   1284         if (bdrv_can_snapshot(bs1)) {
   1285             if (must_delete) {
   1286                 ret = bdrv_snapshot_delete(bs1, old_sn->id_str);
   1287                 if (ret < 0) {
   1288                     monitor_printf(err,
   1289                                           "Error while deleting snapshot on '%s'\n",
   1290                                           bdrv_get_device_name(bs1));
   1291                 }
   1292             }
   1293             /* Write VM state size only to the image that contains the state */
   1294             sn->vm_state_size = (bs == bs1 ? vm_state_size : 0);
   1295             ret = bdrv_snapshot_create(bs1, sn);
   1296             if (ret < 0) {
   1297                 monitor_printf(err, "Error while creating snapshot on '%s'\n",
   1298                                       bdrv_get_device_name(bs1));
   1299             }
   1300         }
   1301     }
   1302 
   1303  the_end:
   1304     if (saved_vm_running)
   1305         vm_start();
   1306 }
   1307 
   1308 void do_loadvm(Monitor *err, const char *name)
   1309 {
   1310     BlockDriverState *bs, *bs1;
   1311     BlockDriverInfo bdi1, *bdi = &bdi1;
   1312     QEMUSnapshotInfo sn;
   1313     QEMUFile *f;
   1314     int ret;
   1315     int saved_vm_running;
   1316 
   1317     bs = bdrv_snapshots();
   1318     if (!bs) {
   1319         monitor_printf(err, "No block device supports snapshots\n");
   1320         return;
   1321     }
   1322 
   1323     /* Flush all IO requests so they don't interfere with the new state.  */
   1324     qemu_aio_flush();
   1325 
   1326     saved_vm_running = vm_running;
   1327     vm_stop(0);
   1328 
   1329     bs1 = NULL;
   1330     while ((bs1 = bdrv_next(bs))) {
   1331         if (bdrv_can_snapshot(bs1)) {
   1332             ret = bdrv_snapshot_goto(bs1, name);
   1333             if (ret < 0) {
   1334                 if (bs != bs1)
   1335                     monitor_printf(err, "Warning: ");
   1336                 switch(ret) {
   1337                 case -ENOTSUP:
   1338                     monitor_printf(err,
   1339                                    "Snapshots not supported on device '%s'\n",
   1340                                    bdrv_get_device_name(bs1));
   1341                     break;
   1342                 case -ENOENT:
   1343                     monitor_printf(err, "Could not find snapshot '%s' on "
   1344                                    "device '%s'\n",
   1345                                    name, bdrv_get_device_name(bs1));
   1346                     break;
   1347                 default:
   1348                     monitor_printf(err, "Error %d while activating snapshot on"
   1349                                    " '%s'\n", ret, bdrv_get_device_name(bs1));
   1350                     break;
   1351                 }
   1352                 /* fatal on snapshot block device */
   1353                 if (bs == bs1)
   1354                     goto the_end;
   1355             }
   1356         }
   1357     }
   1358 
   1359     if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) {
   1360         monitor_printf(err, "Device %s does not support VM state snapshots\n",
   1361                        bdrv_get_device_name(bs));
   1362         return;
   1363     }
   1364 
   1365     /* Don't even try to load empty VM states */
   1366     ret = bdrv_snapshot_find(bs, &sn, name);
   1367     if ((ret >= 0) && (sn.vm_state_size == 0))
   1368         goto the_end;
   1369 
   1370     /* restore the VM state */
   1371     f = qemu_fopen_bdrv(bs, 0);
   1372     if (!f) {
   1373         monitor_printf(err, "Could not open VM state file\n");
   1374         goto the_end;
   1375     }
   1376     ret = qemu_loadvm_state(f);
   1377     qemu_fclose(f);
   1378     if (ret < 0) {
   1379         monitor_printf(err, "Error %d while loading VM state\n", ret);
   1380     }
   1381  the_end:
   1382     if (saved_vm_running)
   1383         vm_start();
   1384 }
   1385 
   1386 void do_delvm(Monitor *err, const char *name)
   1387 {
   1388     BlockDriverState *bs, *bs1;
   1389     int ret;
   1390 
   1391     bs = bdrv_snapshots();
   1392     if (!bs) {
   1393         monitor_printf(err, "No block device supports snapshots\n");
   1394         return;
   1395     }
   1396 
   1397     bs1 = NULL;
   1398     while ((bs1 = bdrv_next(bs1))) {
   1399         if (bdrv_can_snapshot(bs1)) {
   1400             ret = bdrv_snapshot_delete(bs1, name);
   1401             if (ret < 0) {
   1402                 if (ret == -ENOTSUP)
   1403                     monitor_printf(err,
   1404                                           "Snapshots not supported on device '%s'\n",
   1405                                           bdrv_get_device_name(bs1));
   1406                 else
   1407                     monitor_printf(err, "Error %d while deleting snapshot on "
   1408                                           "'%s'\n", ret, bdrv_get_device_name(bs1));
   1409             }
   1410         }
   1411     }
   1412 }
   1413 
   1414 void do_info_snapshots(Monitor* out, Monitor* err)
   1415 {
   1416     BlockDriverState *bs, *bs1;
   1417     QEMUSnapshotInfo *sn_tab, *sn;
   1418     int nb_sns, i;
   1419     char buf[256];
   1420 
   1421     bs = bdrv_snapshots();
   1422     if (!bs) {
   1423         monitor_printf(err, "No available block device supports snapshots\n");
   1424         return;
   1425     }
   1426     monitor_printf(out, "Snapshot devices:");
   1427     bs1 = NULL;
   1428     while ((bs1 = bdrv_next(bs1))) {
   1429         if (bdrv_can_snapshot(bs1)) {
   1430             if (bs == bs1)
   1431                 monitor_printf(out, " %s", bdrv_get_device_name(bs1));
   1432         }
   1433     }
   1434     monitor_printf(out, "\n");
   1435 
   1436     nb_sns = bdrv_snapshot_list(bs, &sn_tab);
   1437     if (nb_sns < 0) {
   1438         monitor_printf(err, "bdrv_snapshot_list: error %d\n", nb_sns);
   1439         return;
   1440     }
   1441     monitor_printf(out, "Snapshot list (from %s):\n",
   1442                    bdrv_get_device_name(bs));
   1443     monitor_printf(out, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
   1444     for(i = 0; i < nb_sns; i++) {
   1445         sn = &sn_tab[i];
   1446         monitor_printf(out, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
   1447     }
   1448     qemu_free(sn_tab);
   1449 }
   1450