Statistics
| Branch: | Revision:

root / savevm.c @ dde0463b

History | View | Annotate | Download (39.1 kB)

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
#if defined(__NetBSD__)
46
#include <net/if_tap.h>
47
#endif
48
#ifdef __linux__
49
#include <linux/if_tun.h>
50
#endif
51
#include <arpa/inet.h>
52
#include <dirent.h>
53
#include <netdb.h>
54
#include <sys/select.h>
55
#ifdef CONFIG_BSD
56
#include <sys/stat.h>
57
#if defined(__FreeBSD__) || defined(__DragonFly__)
58
#include <libutil.h>
59
#else
60
#include <util.h>
61
#endif
62
#elif defined (__GLIBC__) && defined (__FreeBSD_kernel__)
63
#include <freebsd/stdlib.h>
64
#else
65
#ifdef __linux__
66
#include <pty.h>
67
#include <malloc.h>
68
#include <linux/rtc.h>
69
#endif
70
#endif
71
#endif
72

    
73
#ifdef _WIN32
74
#include <windows.h>
75
#include <malloc.h>
76
#include <sys/timeb.h>
77
#include <mmsystem.h>
78
#define getopt_long_only getopt_long
79
#define memalign(align, size) malloc(size)
80
#endif
81

    
82
#include "qemu-common.h"
83
#include "hw/hw.h"
84
#include "net.h"
85
#include "monitor.h"
86
#include "sysemu.h"
87
#include "qemu-timer.h"
88
#include "qemu-char.h"
89
#include "block.h"
90
#include "audio/audio.h"
91
#include "migration.h"
92
#include "qemu_socket.h"
93

    
94
/* point to the block driver where the snapshots are managed */
95
static BlockDriverState *bs_snapshots;
96

    
97
#define SELF_ANNOUNCE_ROUNDS 5
98
#define ETH_P_EXPERIMENTAL 0x01F1 /* just a number */
99
//#define ETH_P_EXPERIMENTAL 0x0012 /* make it the size of the packet */
100
#define EXPERIMENTAL_MAGIC 0xf1f23f4f
101

    
102
static int announce_self_create(uint8_t *buf, 
103
                                uint8_t *mac_addr)
104
{
105
    uint32_t magic = EXPERIMENTAL_MAGIC;
106
    uint16_t proto = htons(ETH_P_EXPERIMENTAL);
107

    
108
    /* FIXME: should we send a different packet (arp/rarp/ping)? */
109

    
110
    memset(buf, 0, 64);
111
    memset(buf, 0xff, 6);         /* h_dst */
112
    memcpy(buf + 6, mac_addr, 6); /* h_src */
113
    memcpy(buf + 12, &proto, 2);  /* h_proto */
114
    memcpy(buf + 14, &magic, 4);  /* magic */
115

    
116
    return 64; /* len */
117
}
118

    
119
static void qemu_announce_self_once(void *opaque)
120
{
121
    int i, len;
122
    VLANState *vlan;
123
    VLANClientState *vc;
124
    uint8_t buf[256];
125
    static int count = SELF_ANNOUNCE_ROUNDS;
126
    QEMUTimer *timer = *(QEMUTimer **)opaque;
127

    
128
    for (i = 0; i < MAX_NICS; i++) {
129
        if (!nd_table[i].used)
130
            continue;
131
        len = announce_self_create(buf, nd_table[i].macaddr);
132
        vlan = nd_table[i].vlan;
133
        for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
134
            vc->receive(vc, buf, len);
135
        }
136
    }
137
    if (count--) {
138
            qemu_mod_timer(timer, qemu_get_clock(rt_clock) + 100);
139
    } else {
140
            qemu_del_timer(timer);
141
            qemu_free_timer(timer);
142
    }
143
}
144

    
145
void qemu_announce_self(void)
146
{
147
        static QEMUTimer *timer;
148
        timer = qemu_new_timer(rt_clock, qemu_announce_self_once, &timer);
149
        qemu_announce_self_once(&timer);
150
}
151

    
152
/***********************************************************/
153
/* savevm/loadvm support */
154

    
155
#define IO_BUF_SIZE 32768
156

    
157
struct QEMUFile {
158
    QEMUFilePutBufferFunc *put_buffer;
159
    QEMUFileGetBufferFunc *get_buffer;
160
    QEMUFileCloseFunc *close;
161
    QEMUFileRateLimit *rate_limit;
162
    QEMUFileSetRateLimit *set_rate_limit;
163
    void *opaque;
164
    int is_write;
165

    
166
    int64_t buf_offset; /* start of buffer when writing, end of buffer
167
                           when reading */
168
    int buf_index;
169
    int buf_size; /* 0 when writing */
170
    uint8_t buf[IO_BUF_SIZE];
171

    
172
    int has_error;
173
};
174

    
175
typedef struct QEMUFileStdio
176
{
177
    FILE *stdio_file;
178
    QEMUFile *file;
179
} QEMUFileStdio;
180

    
181
typedef struct QEMUFileSocket
182
{
183
    int fd;
184
    QEMUFile *file;
185
} QEMUFileSocket;
186

    
187
static int socket_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
188
{
189
    QEMUFileSocket *s = opaque;
190
    ssize_t len;
191

    
192
    do {
193
        len = recv(s->fd, (void *)buf, size, 0);
194
    } while (len == -1 && socket_error() == EINTR);
195

    
196
    if (len == -1)
197
        len = -socket_error();
198

    
199
    return len;
200
}
201

    
202
static int socket_close(void *opaque)
203
{
204
    QEMUFileSocket *s = opaque;
205
    qemu_free(s);
206
    return 0;
207
}
208

    
209
static int stdio_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size)
210
{
211
    QEMUFileStdio *s = opaque;
212
    return fwrite(buf, 1, size, s->stdio_file);
213
}
214

    
215
static int stdio_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
216
{
217
    QEMUFileStdio *s = opaque;
218
    FILE *fp = s->stdio_file;
219
    int bytes;
220

    
221
    do {
222
        clearerr(fp);
223
        bytes = fread(buf, 1, size, fp);
224
    } while ((bytes == 0) && ferror(fp) && (errno == EINTR));
225
    return bytes;
226
}
227

    
228
static int stdio_pclose(void *opaque)
229
{
230
    QEMUFileStdio *s = opaque;
231
    pclose(s->stdio_file);
232
    qemu_free(s);
233
    return 0;
234
}
235

    
236
static int stdio_fclose(void *opaque)
237
{
238
    QEMUFileStdio *s = opaque;
239
    fclose(s->stdio_file);
240
    qemu_free(s);
241
    return 0;
242
}
243

    
244
QEMUFile *qemu_popen(FILE *stdio_file, const char *mode)
245
{
246
    QEMUFileStdio *s;
247

    
248
    if (stdio_file == NULL || mode == NULL || (mode[0] != 'r' && mode[0] != 'w') || mode[1] != 0) {
249
        fprintf(stderr, "qemu_popen: Argument validity check failed\n");
250
        return NULL;
251
    }
252

    
253
    s = qemu_mallocz(sizeof(QEMUFileStdio));
254

    
255
    s->stdio_file = stdio_file;
256

    
257
    if(mode[0] == 'r') {
258
        s->file = qemu_fopen_ops(s, NULL, stdio_get_buffer, stdio_pclose, NULL, NULL);
259
    } else {
260
        s->file = qemu_fopen_ops(s, stdio_put_buffer, NULL, stdio_pclose, NULL, NULL);
261
    }
262
    return s->file;
263
}
264

    
265
QEMUFile *qemu_popen_cmd(const char *command, const char *mode)
266
{
267
    FILE *popen_file;
268

    
269
    popen_file = popen(command, mode);
270
    if(popen_file == NULL) {
271
        return NULL;
272
    }
273

    
274
    return qemu_popen(popen_file, mode);
275
}
276

    
277
int qemu_stdio_fd(QEMUFile *f)
278
{
279
    QEMUFileStdio *p;
280
    int fd;
281

    
282
    p = (QEMUFileStdio *)f->opaque;
283
    fd = fileno(p->stdio_file);
284

    
285
    return fd;
286
}
287

    
288
QEMUFile *qemu_fdopen(int fd, const char *mode)
289
{
290
    QEMUFileStdio *s;
291

    
292
    if (mode == NULL ||
293
        (mode[0] != 'r' && mode[0] != 'w') ||
294
        mode[1] != 'b' || mode[2] != 0) {
295
        fprintf(stderr, "qemu_fdopen: Argument validity check failed\n");
296
        return NULL;
297
    }
298

    
299
    s = qemu_mallocz(sizeof(QEMUFileStdio));
300
    s->stdio_file = fdopen(fd, mode);
301
    if (!s->stdio_file)
302
        goto fail;
303

    
304
    if(mode[0] == 'r') {
305
        s->file = qemu_fopen_ops(s, NULL, stdio_get_buffer, stdio_fclose, NULL, NULL);
306
    } else {
307
        s->file = qemu_fopen_ops(s, stdio_put_buffer, NULL, stdio_fclose, NULL, NULL);
308
    }
309
    return s->file;
310

    
311
fail:
312
    qemu_free(s);
313
    return NULL;
314
}
315

    
316
QEMUFile *qemu_fopen_socket(int fd)
317
{
318
    QEMUFileSocket *s = qemu_mallocz(sizeof(QEMUFileSocket));
319

    
320
    s->fd = fd;
321
    s->file = qemu_fopen_ops(s, NULL, socket_get_buffer, socket_close, NULL, NULL);
322
    return s->file;
323
}
324

    
325
static int file_put_buffer(void *opaque, const uint8_t *buf,
326
                            int64_t pos, int size)
327
{
328
    QEMUFileStdio *s = opaque;
329
    fseek(s->stdio_file, pos, SEEK_SET);
330
    fwrite(buf, 1, size, s->stdio_file);
331
    return size;
332
}
333

    
334
static int file_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
335
{
336
    QEMUFileStdio *s = opaque;
337
    fseek(s->stdio_file, pos, SEEK_SET);
338
    return fread(buf, 1, size, s->stdio_file);
339
}
340

    
341
QEMUFile *qemu_fopen(const char *filename, const char *mode)
342
{
343
    QEMUFileStdio *s;
344

    
345
    if (mode == NULL ||
346
        (mode[0] != 'r' && mode[0] != 'w') ||
347
        mode[1] != 'b' || mode[2] != 0) {
348
        fprintf(stderr, "qemu_fdopen: Argument validity check failed\n");
349
        return NULL;
350
    }
351

    
352
    s = qemu_mallocz(sizeof(QEMUFileStdio));
353

    
354
    s->stdio_file = fopen(filename, mode);
355
    if (!s->stdio_file)
356
        goto fail;
357

    
358
    if(mode[0] == 'w') {
359
        s->file = qemu_fopen_ops(s, file_put_buffer, NULL, stdio_fclose, NULL, NULL);
360
    } else {
361
        s->file = qemu_fopen_ops(s, NULL, file_get_buffer, stdio_fclose, NULL, NULL);
362
    }
363
    return s->file;
364
fail:
365
    qemu_free(s);
366
    return NULL;
367
}
368

    
369
static int block_put_buffer(void *opaque, const uint8_t *buf,
370
                           int64_t pos, int size)
371
{
372
    bdrv_save_vmstate(opaque, buf, pos, size);
373
    return size;
374
}
375

    
376
static int block_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
377
{
378
    return bdrv_load_vmstate(opaque, buf, pos, size);
379
}
380

    
381
static int bdrv_fclose(void *opaque)
382
{
383
    return 0;
384
}
385

    
386
static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int is_writable)
387
{
388
    if (is_writable)
389
        return qemu_fopen_ops(bs, block_put_buffer, NULL, bdrv_fclose, NULL, NULL);
390
    return qemu_fopen_ops(bs, NULL, block_get_buffer, bdrv_fclose, NULL, NULL);
391
}
392

    
393
QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer,
394
                         QEMUFileGetBufferFunc *get_buffer,
395
                         QEMUFileCloseFunc *close,
396
                         QEMUFileRateLimit *rate_limit,
397
                         QEMUFileSetRateLimit *set_rate_limit)
398
{
399
    QEMUFile *f;
400

    
401
    f = qemu_mallocz(sizeof(QEMUFile));
402

    
403
    f->opaque = opaque;
404
    f->put_buffer = put_buffer;
405
    f->get_buffer = get_buffer;
406
    f->close = close;
407
    f->rate_limit = rate_limit;
408
    f->set_rate_limit = set_rate_limit;
409
    f->is_write = 0;
410

    
411
    return f;
412
}
413

    
414
int qemu_file_has_error(QEMUFile *f)
415
{
416
    return f->has_error;
417
}
418

    
419
void qemu_file_set_error(QEMUFile *f)
420
{
421
    f->has_error = 1;
422
}
423

    
424
void qemu_fflush(QEMUFile *f)
425
{
426
    if (!f->put_buffer)
427
        return;
428

    
429
    if (f->is_write && f->buf_index > 0) {
430
        int len;
431

    
432
        len = f->put_buffer(f->opaque, f->buf, f->buf_offset, f->buf_index);
433
        if (len > 0)
434
            f->buf_offset += f->buf_index;
435
        else
436
            f->has_error = 1;
437
        f->buf_index = 0;
438
    }
439
}
440

    
441
static void qemu_fill_buffer(QEMUFile *f)
442
{
443
    int len;
444

    
445
    if (!f->get_buffer)
446
        return;
447

    
448
    if (f->is_write)
449
        abort();
450

    
451
    len = f->get_buffer(f->opaque, f->buf, f->buf_offset, IO_BUF_SIZE);
452
    if (len > 0) {
453
        f->buf_index = 0;
454
        f->buf_size = len;
455
        f->buf_offset += len;
456
    } else if (len != -EAGAIN)
457
        f->has_error = 1;
458
}
459

    
460
int qemu_fclose(QEMUFile *f)
461
{
462
    int ret = 0;
463
    qemu_fflush(f);
464
    if (f->close)
465
        ret = f->close(f->opaque);
466
    qemu_free(f);
467
    return ret;
468
}
469

    
470
void qemu_file_put_notify(QEMUFile *f)
471
{
472
    f->put_buffer(f->opaque, NULL, 0, 0);
473
}
474

    
475
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
476
{
477
    int l;
478

    
479
    if (!f->has_error && f->is_write == 0 && f->buf_index > 0) {
480
        fprintf(stderr,
481
                "Attempted to write to buffer while read buffer is not empty\n");
482
        abort();
483
    }
484

    
485
    while (!f->has_error && size > 0) {
486
        l = IO_BUF_SIZE - f->buf_index;
487
        if (l > size)
488
            l = size;
489
        memcpy(f->buf + f->buf_index, buf, l);
490
        f->is_write = 1;
491
        f->buf_index += l;
492
        buf += l;
493
        size -= l;
494
        if (f->buf_index >= IO_BUF_SIZE)
495
            qemu_fflush(f);
496
    }
497
}
498

    
499
void qemu_put_byte(QEMUFile *f, int v)
500
{
501
    if (!f->has_error && f->is_write == 0 && f->buf_index > 0) {
502
        fprintf(stderr,
503
                "Attempted to write to buffer while read buffer is not empty\n");
504
        abort();
505
    }
506

    
507
    f->buf[f->buf_index++] = v;
508
    f->is_write = 1;
509
    if (f->buf_index >= IO_BUF_SIZE)
510
        qemu_fflush(f);
511
}
512

    
513
int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size1)
514
{
515
    int size, l;
516

    
517
    if (f->is_write)
518
        abort();
519

    
520
    size = size1;
521
    while (size > 0) {
522
        l = f->buf_size - f->buf_index;
523
        if (l == 0) {
524
            qemu_fill_buffer(f);
525
            l = f->buf_size - f->buf_index;
526
            if (l == 0)
527
                break;
528
        }
529
        if (l > size)
530
            l = size;
531
        memcpy(buf, f->buf + f->buf_index, l);
532
        f->buf_index += l;
533
        buf += l;
534
        size -= l;
535
    }
536
    return size1 - size;
537
}
538

    
539
int qemu_get_byte(QEMUFile *f)
540
{
541
    if (f->is_write)
542
        abort();
543

    
544
    if (f->buf_index >= f->buf_size) {
545
        qemu_fill_buffer(f);
546
        if (f->buf_index >= f->buf_size)
547
            return 0;
548
    }
549
    return f->buf[f->buf_index++];
550
}
551

    
552
int64_t qemu_ftell(QEMUFile *f)
553
{
554
    return f->buf_offset - f->buf_size + f->buf_index;
555
}
556

    
557
int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence)
558
{
559
    if (whence == SEEK_SET) {
560
        /* nothing to do */
561
    } else if (whence == SEEK_CUR) {
562
        pos += qemu_ftell(f);
563
    } else {
564
        /* SEEK_END not supported */
565
        return -1;
566
    }
567
    if (f->put_buffer) {
568
        qemu_fflush(f);
569
        f->buf_offset = pos;
570
    } else {
571
        f->buf_offset = pos;
572
        f->buf_index = 0;
573
        f->buf_size = 0;
574
    }
575
    return pos;
576
}
577

    
578
int qemu_file_rate_limit(QEMUFile *f)
579
{
580
    if (f->rate_limit)
581
        return f->rate_limit(f->opaque);
582

    
583
    return 0;
584
}
585

    
586
size_t qemu_file_set_rate_limit(QEMUFile *f, size_t new_rate)
587
{
588
    /* any failed or completed migration keeps its state to allow probing of
589
     * migration data, but has no associated file anymore */
590
    if (f && f->set_rate_limit)
591
        return f->set_rate_limit(f->opaque, new_rate);
592

    
593
    return 0;
594
}
595

    
596
void qemu_put_be16(QEMUFile *f, unsigned int v)
597
{
598
    qemu_put_byte(f, v >> 8);
599
    qemu_put_byte(f, v);
600
}
601

    
602
void qemu_put_be32(QEMUFile *f, unsigned int v)
603
{
604
    qemu_put_byte(f, v >> 24);
605
    qemu_put_byte(f, v >> 16);
606
    qemu_put_byte(f, v >> 8);
607
    qemu_put_byte(f, v);
608
}
609

    
610
void qemu_put_be64(QEMUFile *f, uint64_t v)
611
{
612
    qemu_put_be32(f, v >> 32);
613
    qemu_put_be32(f, v);
614
}
615

    
616
unsigned int qemu_get_be16(QEMUFile *f)
617
{
618
    unsigned int v;
619
    v = qemu_get_byte(f) << 8;
620
    v |= qemu_get_byte(f);
621
    return v;
622
}
623

    
624
unsigned int qemu_get_be32(QEMUFile *f)
625
{
626
    unsigned int v;
627
    v = qemu_get_byte(f) << 24;
628
    v |= qemu_get_byte(f) << 16;
629
    v |= qemu_get_byte(f) << 8;
630
    v |= qemu_get_byte(f);
631
    return v;
632
}
633

    
634
uint64_t qemu_get_be64(QEMUFile *f)
635
{
636
    uint64_t v;
637
    v = (uint64_t)qemu_get_be32(f) << 32;
638
    v |= qemu_get_be32(f);
639
    return v;
640
}
641

    
642
/* 8 bit int */
643

    
644
static int get_int8(QEMUFile *f, void *pv, size_t size)
645
{
646
    int8_t *v = pv;
647
    qemu_get_s8s(f, v);
648
    return 0;
649
}
650

    
651
static void put_int8(QEMUFile *f, const void *pv, size_t size)
652
{
653
    const int8_t *v = pv;
654
    qemu_put_s8s(f, v);
655
}
656

    
657
const VMStateInfo vmstate_info_int8 = {
658
    .name = "int8",
659
    .get  = get_int8,
660
    .put  = put_int8,
661
};
662

    
663
/* 16 bit int */
664

    
665
static int get_int16(QEMUFile *f, void *pv, size_t size)
666
{
667
    int16_t *v = pv;
668
    qemu_get_sbe16s(f, v);
669
    return 0;
670
}
671

    
672
static void put_int16(QEMUFile *f, const void *pv, size_t size)
673
{
674
    const int16_t *v = pv;
675
    qemu_put_sbe16s(f, v);
676
}
677

    
678
const VMStateInfo vmstate_info_int16 = {
679
    .name = "int16",
680
    .get  = get_int16,
681
    .put  = put_int16,
682
};
683

    
684
/* 32 bit int */
685

    
686
static int get_int32(QEMUFile *f, void *pv, size_t size)
687
{
688
    int32_t *v = pv;
689
    qemu_get_sbe32s(f, v);
690
    return 0;
691
}
692

    
693
static void put_int32(QEMUFile *f, const void *pv, size_t size)
694
{
695
    const int32_t *v = pv;
696
    qemu_put_sbe32s(f, v);
697
}
698

    
699
const VMStateInfo vmstate_info_int32 = {
700
    .name = "int32",
701
    .get  = get_int32,
702
    .put  = put_int32,
703
};
704

    
705
/* 64 bit int */
706

    
707
static int get_int64(QEMUFile *f, void *pv, size_t size)
708
{
709
    int64_t *v = pv;
710
    qemu_get_sbe64s(f, v);
711
    return 0;
712
}
713

    
714
static void put_int64(QEMUFile *f, const void *pv, size_t size)
715
{
716
    const int64_t *v = pv;
717
    qemu_put_sbe64s(f, v);
718
}
719

    
720
const VMStateInfo vmstate_info_int64 = {
721
    .name = "int64",
722
    .get  = get_int64,
723
    .put  = put_int64,
724
};
725

    
726
/* 8 bit unsigned int */
727

    
728
static int get_uint8(QEMUFile *f, void *pv, size_t size)
729
{
730
    uint8_t *v = pv;
731
    qemu_get_8s(f, v);
732
    return 0;
733
}
734

    
735
static void put_uint8(QEMUFile *f, const void *pv, size_t size)
736
{
737
    const uint8_t *v = pv;
738
    qemu_put_8s(f, v);
739
}
740

    
741
const VMStateInfo vmstate_info_uint8 = {
742
    .name = "uint8",
743
    .get  = get_uint8,
744
    .put  = put_uint8,
745
};
746

    
747
/* 16 bit unsigned int */
748

    
749
static int get_uint16(QEMUFile *f, void *pv, size_t size)
750
{
751
    uint16_t *v = pv;
752
    qemu_get_be16s(f, v);
753
    return 0;
754
}
755

    
756
static void put_uint16(QEMUFile *f, const void *pv, size_t size)
757
{
758
    const uint16_t *v = pv;
759
    qemu_put_be16s(f, v);
760
}
761

    
762
const VMStateInfo vmstate_info_uint16 = {
763
    .name = "uint16",
764
    .get  = get_uint16,
765
    .put  = put_uint16,
766
};
767

    
768
/* 32 bit unsigned int */
769

    
770
static int get_uint32(QEMUFile *f, void *pv, size_t size)
771
{
772
    uint32_t *v = pv;
773
    qemu_get_be32s(f, v);
774
    return 0;
775
}
776

    
777
static void put_uint32(QEMUFile *f, const void *pv, size_t size)
778
{
779
    const uint32_t *v = pv;
780
    qemu_put_be32s(f, v);
781
}
782

    
783
const VMStateInfo vmstate_info_uint32 = {
784
    .name = "uint32",
785
    .get  = get_uint32,
786
    .put  = put_uint32,
787
};
788

    
789
/* 64 bit unsigned int */
790

    
791
static int get_uint64(QEMUFile *f, void *pv, size_t size)
792
{
793
    uint64_t *v = pv;
794
    qemu_get_be64s(f, v);
795
    return 0;
796
}
797

    
798
static void put_uint64(QEMUFile *f, const void *pv, size_t size)
799
{
800
    const uint64_t *v = pv;
801
    qemu_put_be64s(f, v);
802
}
803

    
804
const VMStateInfo vmstate_info_uint64 = {
805
    .name = "uint64",
806
    .get  = get_uint64,
807
    .put  = put_uint64,
808
};
809

    
810
/* timers  */
811

    
812
static int get_timer(QEMUFile *f, void *pv, size_t size)
813
{
814
    QEMUTimer *v = pv;
815
    qemu_get_timer(f, v);
816
    return 0;
817
}
818

    
819
static void put_timer(QEMUFile *f, const void *pv, size_t size)
820
{
821
    QEMUTimer *v = (void *)pv;
822
    qemu_put_timer(f, v);
823
}
824

    
825
const VMStateInfo vmstate_info_timer = {
826
    .name = "timer",
827
    .get  = get_timer,
828
    .put  = put_timer,
829
};
830

    
831
typedef struct SaveStateEntry {
832
    char idstr[256];
833
    int instance_id;
834
    int version_id;
835
    int section_id;
836
    SaveLiveStateHandler *save_live_state;
837
    SaveStateHandler *save_state;
838
    LoadStateHandler *load_state;
839
    const VMStateDescription *vmsd;
840
    void *opaque;
841
    struct SaveStateEntry *next;
842
} SaveStateEntry;
843

    
844
static SaveStateEntry *first_se;
845
static int global_section_id;
846

    
847
/* TODO: Individual devices generally have very little idea about the rest
848
   of the system, so instance_id should be removed/replaced.
849
   Meanwhile pass -1 as instance_id if you do not already have a clearly
850
   distinguishing id for all instances of your device class. */
851
int register_savevm_live(const char *idstr,
852
                         int instance_id,
853
                         int version_id,
854
                         SaveLiveStateHandler *save_live_state,
855
                         SaveStateHandler *save_state,
856
                         LoadStateHandler *load_state,
857
                         void *opaque)
858
{
859
    SaveStateEntry *se, **pse;
860

    
861
    se = qemu_malloc(sizeof(SaveStateEntry));
862
    pstrcpy(se->idstr, sizeof(se->idstr), idstr);
863
    se->instance_id = (instance_id == -1) ? 0 : instance_id;
864
    se->version_id = version_id;
865
    se->section_id = global_section_id++;
866
    se->save_live_state = save_live_state;
867
    se->save_state = save_state;
868
    se->load_state = load_state;
869
    se->opaque = opaque;
870
    se->vmsd = NULL;
871
    se->next = NULL;
872

    
873
    /* add at the end of list */
874
    pse = &first_se;
875
    while (*pse != NULL) {
876
        if (instance_id == -1
877
                && strcmp(se->idstr, (*pse)->idstr) == 0
878
                && se->instance_id <= (*pse)->instance_id)
879
            se->instance_id = (*pse)->instance_id + 1;
880
        pse = &(*pse)->next;
881
    }
882
    *pse = se;
883
    return 0;
884
}
885

    
886
int register_savevm(const char *idstr,
887
                    int instance_id,
888
                    int version_id,
889
                    SaveStateHandler *save_state,
890
                    LoadStateHandler *load_state,
891
                    void *opaque)
892
{
893
    return register_savevm_live(idstr, instance_id, version_id,
894
                                NULL, save_state, load_state, opaque);
895
}
896

    
897
void unregister_savevm(const char *idstr, void *opaque)
898
{
899
    SaveStateEntry **pse;
900

    
901
    pse = &first_se;
902
    while (*pse != NULL) {
903
        if (strcmp((*pse)->idstr, idstr) == 0 && (*pse)->opaque == opaque) {
904
            SaveStateEntry *next = (*pse)->next;
905
            qemu_free(*pse);
906
            *pse = next;
907
            continue;
908
        }
909
        pse = &(*pse)->next;
910
    }
911
}
912

    
913
int vmstate_register(int instance_id, const VMStateDescription *vmsd,
914
                     void *opaque)
915
{
916
    SaveStateEntry *se, **pse;
917

    
918
    se = qemu_malloc(sizeof(SaveStateEntry));
919
    pstrcpy(se->idstr, sizeof(se->idstr), vmsd->name);
920
    se->instance_id = (instance_id == -1) ? 0 : instance_id;
921
    se->version_id = vmsd->version_id;
922
    se->section_id = global_section_id++;
923
    se->save_live_state = NULL;
924
    se->save_state = NULL;
925
    se->load_state = NULL;
926
    se->opaque = opaque;
927
    se->vmsd = vmsd;
928
    se->next = NULL;
929

    
930
    /* add at the end of list */
931
    pse = &first_se;
932
    while (*pse != NULL) {
933
        if (instance_id == -1
934
                && strcmp(se->idstr, (*pse)->idstr) == 0
935
                && se->instance_id <= (*pse)->instance_id)
936
            se->instance_id = (*pse)->instance_id + 1;
937
        pse = &(*pse)->next;
938
    }
939
    *pse = se;
940
    return 0;
941
}
942

    
943
void vmstate_unregister(const char *idstr,  void *opaque)
944
{
945
    SaveStateEntry **pse;
946

    
947
    pse = &first_se;
948
    while (*pse != NULL) {
949
        if (strcmp((*pse)->idstr, idstr) == 0 && (*pse)->opaque == opaque) {
950
            SaveStateEntry *next = (*pse)->next;
951
            qemu_free(*pse);
952
            *pse = next;
953
            continue;
954
        }
955
        pse = &(*pse)->next;
956
    }
957
}
958

    
959
int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
960
                       void *opaque, int version_id)
961
{
962
    VMStateField *field = vmsd->fields;
963

    
964
    if (version_id > vmsd->version_id) {
965
        return -EINVAL;
966
    }
967
    if (version_id < vmsd->minimum_version_id_old) {
968
        return -EINVAL;
969
    }
970
    if  (version_id < vmsd->minimum_version_id) {
971
        return vmsd->load_state_old(f, opaque, version_id);
972
    }
973
    while(field->name) {
974
        if (field->version_id <= version_id) {
975
            void *addr = opaque + field->offset;
976
            int ret;
977

    
978
            if (field->flags & VMS_POINTER) {
979
                addr = *(void **)addr;
980
            }
981
            ret = field->info->get(f, addr, field->size);
982
            if (ret < 0) {
983
                return ret;
984
            }
985
        }
986
        field++;
987
    }
988
    return 0;
989
}
990

    
991
void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
992
                        const void *opaque)
993
{
994
    VMStateField *field = vmsd->fields;
995

    
996
    while(field->name) {
997
        const void *addr = opaque + field->offset;
998

    
999
        if (field->flags & VMS_POINTER) {
1000
            addr = *(void **)addr;
1001
        }
1002
        field->info->put(f, addr, field->size);
1003
        field++;
1004
    }
1005
}
1006

    
1007
static int vmstate_load(QEMUFile *f, SaveStateEntry *se, int version_id)
1008
{
1009
    if (!se->vmsd) {         /* Old style */
1010
        return se->load_state(f, se->opaque, version_id);
1011
    }
1012
    return vmstate_load_state(f, se->vmsd, se->opaque, version_id);
1013
}
1014

    
1015
static void vmstate_save(QEMUFile *f, SaveStateEntry *se)
1016
{
1017
    if (!se->vmsd) {         /* Old style */
1018
        se->save_state(f, se->opaque);
1019
        return;
1020
    }
1021
    vmstate_save_state(f,se->vmsd, se->opaque);
1022
}
1023

    
1024
#define QEMU_VM_FILE_MAGIC           0x5145564d
1025
#define QEMU_VM_FILE_VERSION_COMPAT  0x00000002
1026
#define QEMU_VM_FILE_VERSION         0x00000003
1027

    
1028
#define QEMU_VM_EOF                  0x00
1029
#define QEMU_VM_SECTION_START        0x01
1030
#define QEMU_VM_SECTION_PART         0x02
1031
#define QEMU_VM_SECTION_END          0x03
1032
#define QEMU_VM_SECTION_FULL         0x04
1033

    
1034
int qemu_savevm_state_begin(QEMUFile *f)
1035
{
1036
    SaveStateEntry *se;
1037

    
1038
    qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
1039
    qemu_put_be32(f, QEMU_VM_FILE_VERSION);
1040

    
1041
    for (se = first_se; se != NULL; se = se->next) {
1042
        int len;
1043

    
1044
        if (se->save_live_state == NULL)
1045
            continue;
1046

    
1047
        /* Section type */
1048
        qemu_put_byte(f, QEMU_VM_SECTION_START);
1049
        qemu_put_be32(f, se->section_id);
1050

    
1051
        /* ID string */
1052
        len = strlen(se->idstr);
1053
        qemu_put_byte(f, len);
1054
        qemu_put_buffer(f, (uint8_t *)se->idstr, len);
1055

    
1056
        qemu_put_be32(f, se->instance_id);
1057
        qemu_put_be32(f, se->version_id);
1058

    
1059
        se->save_live_state(f, QEMU_VM_SECTION_START, se->opaque);
1060
    }
1061

    
1062
    if (qemu_file_has_error(f))
1063
        return -EIO;
1064

    
1065
    return 0;
1066
}
1067

    
1068
int qemu_savevm_state_iterate(QEMUFile *f)
1069
{
1070
    SaveStateEntry *se;
1071
    int ret = 1;
1072

    
1073
    for (se = first_se; se != NULL; se = se->next) {
1074
        if (se->save_live_state == NULL)
1075
            continue;
1076

    
1077
        /* Section type */
1078
        qemu_put_byte(f, QEMU_VM_SECTION_PART);
1079
        qemu_put_be32(f, se->section_id);
1080

    
1081
        ret &= !!se->save_live_state(f, QEMU_VM_SECTION_PART, se->opaque);
1082
    }
1083

    
1084
    if (ret)
1085
        return 1;
1086

    
1087
    if (qemu_file_has_error(f))
1088
        return -EIO;
1089

    
1090
    return 0;
1091
}
1092

    
1093
int qemu_savevm_state_complete(QEMUFile *f)
1094
{
1095
    SaveStateEntry *se;
1096

    
1097
    for (se = first_se; se != NULL; se = se->next) {
1098
        if (se->save_live_state == NULL)
1099
            continue;
1100

    
1101
        /* Section type */
1102
        qemu_put_byte(f, QEMU_VM_SECTION_END);
1103
        qemu_put_be32(f, se->section_id);
1104

    
1105
        se->save_live_state(f, QEMU_VM_SECTION_END, se->opaque);
1106
    }
1107

    
1108
    for(se = first_se; se != NULL; se = se->next) {
1109
        int len;
1110

    
1111
        if (se->save_state == NULL && se->vmsd == NULL)
1112
            continue;
1113

    
1114
        /* Section type */
1115
        qemu_put_byte(f, QEMU_VM_SECTION_FULL);
1116
        qemu_put_be32(f, se->section_id);
1117

    
1118
        /* ID string */
1119
        len = strlen(se->idstr);
1120
        qemu_put_byte(f, len);
1121
        qemu_put_buffer(f, (uint8_t *)se->idstr, len);
1122

    
1123
        qemu_put_be32(f, se->instance_id);
1124
        qemu_put_be32(f, se->version_id);
1125

    
1126
        vmstate_save(f, se);
1127
    }
1128

    
1129
    qemu_put_byte(f, QEMU_VM_EOF);
1130

    
1131
    if (qemu_file_has_error(f))
1132
        return -EIO;
1133

    
1134
    return 0;
1135
}
1136

    
1137
int qemu_savevm_state(QEMUFile *f)
1138
{
1139
    int saved_vm_running;
1140
    int ret;
1141

    
1142
    saved_vm_running = vm_running;
1143
    vm_stop(0);
1144

    
1145
    bdrv_flush_all();
1146

    
1147
    ret = qemu_savevm_state_begin(f);
1148
    if (ret < 0)
1149
        goto out;
1150

    
1151
    do {
1152
        ret = qemu_savevm_state_iterate(f);
1153
        if (ret < 0)
1154
            goto out;
1155
    } while (ret == 0);
1156

    
1157
    ret = qemu_savevm_state_complete(f);
1158

    
1159
out:
1160
    if (qemu_file_has_error(f))
1161
        ret = -EIO;
1162

    
1163
    if (!ret && saved_vm_running)
1164
        vm_start();
1165

    
1166
    return ret;
1167
}
1168

    
1169
static SaveStateEntry *find_se(const char *idstr, int instance_id)
1170
{
1171
    SaveStateEntry *se;
1172

    
1173
    for(se = first_se; se != NULL; se = se->next) {
1174
        if (!strcmp(se->idstr, idstr) &&
1175
            instance_id == se->instance_id)
1176
            return se;
1177
    }
1178
    return NULL;
1179
}
1180

    
1181
typedef struct LoadStateEntry {
1182
    SaveStateEntry *se;
1183
    int section_id;
1184
    int version_id;
1185
    struct LoadStateEntry *next;
1186
} LoadStateEntry;
1187

    
1188
static int qemu_loadvm_state_v2(QEMUFile *f)
1189
{
1190
    SaveStateEntry *se;
1191
    int len, ret, instance_id, record_len, version_id;
1192
    int64_t total_len, end_pos, cur_pos;
1193
    char idstr[256];
1194

    
1195
    total_len = qemu_get_be64(f);
1196
    end_pos = total_len + qemu_ftell(f);
1197
    for(;;) {
1198
        if (qemu_ftell(f) >= end_pos)
1199
            break;
1200
        len = qemu_get_byte(f);
1201
        qemu_get_buffer(f, (uint8_t *)idstr, len);
1202
        idstr[len] = '\0';
1203
        instance_id = qemu_get_be32(f);
1204
        version_id = qemu_get_be32(f);
1205
        record_len = qemu_get_be32(f);
1206
        cur_pos = qemu_ftell(f);
1207
        se = find_se(idstr, instance_id);
1208
        if (!se) {
1209
            fprintf(stderr, "qemu: warning: instance 0x%x of device '%s' not present in current VM\n",
1210
                    instance_id, idstr);
1211
        } else {
1212
            ret = vmstate_load(f, se, version_id);
1213
            if (ret < 0) {
1214
                fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n",
1215
                        instance_id, idstr);
1216
                return ret;
1217
            }
1218
        }
1219
        /* always seek to exact end of record */
1220
        qemu_fseek(f, cur_pos + record_len, SEEK_SET);
1221
    }
1222

    
1223
    if (qemu_file_has_error(f))
1224
        return -EIO;
1225

    
1226
    return 0;
1227
}
1228

    
1229
int qemu_loadvm_state(QEMUFile *f)
1230
{
1231
    LoadStateEntry *first_le = NULL;
1232
    uint8_t section_type;
1233
    unsigned int v;
1234
    int ret;
1235

    
1236
    v = qemu_get_be32(f);
1237
    if (v != QEMU_VM_FILE_MAGIC)
1238
        return -EINVAL;
1239

    
1240
    v = qemu_get_be32(f);
1241
    if (v == QEMU_VM_FILE_VERSION_COMPAT)
1242
        return qemu_loadvm_state_v2(f);
1243
    if (v != QEMU_VM_FILE_VERSION)
1244
        return -ENOTSUP;
1245

    
1246
    while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) {
1247
        uint32_t instance_id, version_id, section_id;
1248
        LoadStateEntry *le;
1249
        SaveStateEntry *se;
1250
        char idstr[257];
1251
        int len;
1252

    
1253
        switch (section_type) {
1254
        case QEMU_VM_SECTION_START:
1255
        case QEMU_VM_SECTION_FULL:
1256
            /* Read section start */
1257
            section_id = qemu_get_be32(f);
1258
            len = qemu_get_byte(f);
1259
            qemu_get_buffer(f, (uint8_t *)idstr, len);
1260
            idstr[len] = 0;
1261
            instance_id = qemu_get_be32(f);
1262
            version_id = qemu_get_be32(f);
1263

    
1264
            /* Find savevm section */
1265
            se = find_se(idstr, instance_id);
1266
            if (se == NULL) {
1267
                fprintf(stderr, "Unknown savevm section or instance '%s' %d\n", idstr, instance_id);
1268
                ret = -EINVAL;
1269
                goto out;
1270
            }
1271

    
1272
            /* Validate version */
1273
            if (version_id > se->version_id) {
1274
                fprintf(stderr, "savevm: unsupported version %d for '%s' v%d\n",
1275
                        version_id, idstr, se->version_id);
1276
                ret = -EINVAL;
1277
                goto out;
1278
            }
1279

    
1280
            /* Add entry */
1281
            le = qemu_mallocz(sizeof(*le));
1282

    
1283
            le->se = se;
1284
            le->section_id = section_id;
1285
            le->version_id = version_id;
1286
            le->next = first_le;
1287
            first_le = le;
1288

    
1289
            ret = vmstate_load(f, le->se, le->version_id);
1290
            if (ret < 0) {
1291
                fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n",
1292
                        instance_id, idstr);
1293
                goto out;
1294
            }
1295
            break;
1296
        case QEMU_VM_SECTION_PART:
1297
        case QEMU_VM_SECTION_END:
1298
            section_id = qemu_get_be32(f);
1299

    
1300
            for (le = first_le; le && le->section_id != section_id; le = le->next);
1301
            if (le == NULL) {
1302
                fprintf(stderr, "Unknown savevm section %d\n", section_id);
1303
                ret = -EINVAL;
1304
                goto out;
1305
            }
1306

    
1307
            ret = vmstate_load(f, le->se, le->version_id);
1308
            if (ret < 0) {
1309
                fprintf(stderr, "qemu: warning: error while loading state section id %d\n",
1310
                        section_id);
1311
                goto out;
1312
            }
1313
            break;
1314
        default:
1315
            fprintf(stderr, "Unknown savevm section type %d\n", section_type);
1316
            ret = -EINVAL;
1317
            goto out;
1318
        }
1319
    }
1320

    
1321
    ret = 0;
1322

    
1323
out:
1324
    while (first_le) {
1325
        LoadStateEntry *le = first_le;
1326
        first_le = first_le->next;
1327
        qemu_free(le);
1328
    }
1329

    
1330
    if (qemu_file_has_error(f))
1331
        ret = -EIO;
1332

    
1333
    return ret;
1334
}
1335

    
1336
/* device can contain snapshots */
1337
static int bdrv_can_snapshot(BlockDriverState *bs)
1338
{
1339
    return (bs &&
1340
            !bdrv_is_removable(bs) &&
1341
            !bdrv_is_read_only(bs));
1342
}
1343

    
1344
/* device must be snapshots in order to have a reliable snapshot */
1345
static int bdrv_has_snapshot(BlockDriverState *bs)
1346
{
1347
    return (bs &&
1348
            !bdrv_is_removable(bs) &&
1349
            !bdrv_is_read_only(bs));
1350
}
1351

    
1352
static BlockDriverState *get_bs_snapshots(void)
1353
{
1354
    BlockDriverState *bs;
1355
    DriveInfo *dinfo;
1356

    
1357
    if (bs_snapshots)
1358
        return bs_snapshots;
1359
    TAILQ_FOREACH(dinfo, &drives, next) {
1360
        bs = dinfo->bdrv;
1361
        if (bdrv_can_snapshot(bs))
1362
            goto ok;
1363
    }
1364
    return NULL;
1365
 ok:
1366
    bs_snapshots = bs;
1367
    return bs;
1368
}
1369

    
1370
static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
1371
                              const char *name)
1372
{
1373
    QEMUSnapshotInfo *sn_tab, *sn;
1374
    int nb_sns, i, ret;
1375

    
1376
    ret = -ENOENT;
1377
    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1378
    if (nb_sns < 0)
1379
        return ret;
1380
    for(i = 0; i < nb_sns; i++) {
1381
        sn = &sn_tab[i];
1382
        if (!strcmp(sn->id_str, name) || !strcmp(sn->name, name)) {
1383
            *sn_info = *sn;
1384
            ret = 0;
1385
            break;
1386
        }
1387
    }
1388
    qemu_free(sn_tab);
1389
    return ret;
1390
}
1391

    
1392
void do_savevm(Monitor *mon, const char *name)
1393
{
1394
    DriveInfo *dinfo;
1395
    BlockDriverState *bs, *bs1;
1396
    QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
1397
    int must_delete, ret;
1398
    QEMUFile *f;
1399
    int saved_vm_running;
1400
    uint32_t vm_state_size;
1401
#ifdef _WIN32
1402
    struct _timeb tb;
1403
#else
1404
    struct timeval tv;
1405
#endif
1406

    
1407
    bs = get_bs_snapshots();
1408
    if (!bs) {
1409
        monitor_printf(mon, "No block device can accept snapshots\n");
1410
        return;
1411
    }
1412

    
1413
    /* ??? Should this occur after vm_stop?  */
1414
    qemu_aio_flush();
1415

    
1416
    saved_vm_running = vm_running;
1417
    vm_stop(0);
1418

    
1419
    must_delete = 0;
1420
    if (name) {
1421
        ret = bdrv_snapshot_find(bs, old_sn, name);
1422
        if (ret >= 0) {
1423
            must_delete = 1;
1424
        }
1425
    }
1426
    memset(sn, 0, sizeof(*sn));
1427
    if (must_delete) {
1428
        pstrcpy(sn->name, sizeof(sn->name), old_sn->name);
1429
        pstrcpy(sn->id_str, sizeof(sn->id_str), old_sn->id_str);
1430
    } else {
1431
        if (name)
1432
            pstrcpy(sn->name, sizeof(sn->name), name);
1433
    }
1434

    
1435
    /* fill auxiliary fields */
1436
#ifdef _WIN32
1437
    _ftime(&tb);
1438
    sn->date_sec = tb.time;
1439
    sn->date_nsec = tb.millitm * 1000000;
1440
#else
1441
    gettimeofday(&tv, NULL);
1442
    sn->date_sec = tv.tv_sec;
1443
    sn->date_nsec = tv.tv_usec * 1000;
1444
#endif
1445
    sn->vm_clock_nsec = qemu_get_clock(vm_clock);
1446

    
1447
    /* save the VM state */
1448
    f = qemu_fopen_bdrv(bs, 1);
1449
    if (!f) {
1450
        monitor_printf(mon, "Could not open VM state file\n");
1451
        goto the_end;
1452
    }
1453
    ret = qemu_savevm_state(f);
1454
    vm_state_size = qemu_ftell(f);
1455
    qemu_fclose(f);
1456
    if (ret < 0) {
1457
        monitor_printf(mon, "Error %d while writing VM\n", ret);
1458
        goto the_end;
1459
    }
1460

    
1461
    /* create the snapshots */
1462

    
1463
    TAILQ_FOREACH(dinfo, &drives, next) {
1464
        bs1 = dinfo->bdrv;
1465
        if (bdrv_has_snapshot(bs1)) {
1466
            if (must_delete) {
1467
                ret = bdrv_snapshot_delete(bs1, old_sn->id_str);
1468
                if (ret < 0) {
1469
                    monitor_printf(mon,
1470
                                   "Error while deleting snapshot on '%s'\n",
1471
                                   bdrv_get_device_name(bs1));
1472
                }
1473
            }
1474
            /* Write VM state size only to the image that contains the state */
1475
            sn->vm_state_size = (bs == bs1 ? vm_state_size : 0);
1476
            ret = bdrv_snapshot_create(bs1, sn);
1477
            if (ret < 0) {
1478
                monitor_printf(mon, "Error while creating snapshot on '%s'\n",
1479
                               bdrv_get_device_name(bs1));
1480
            }
1481
        }
1482
    }
1483

    
1484
 the_end:
1485
    if (saved_vm_running)
1486
        vm_start();
1487
}
1488

    
1489
int load_vmstate(Monitor *mon, const char *name)
1490
{
1491
    DriveInfo *dinfo;
1492
    BlockDriverState *bs, *bs1;
1493
    QEMUSnapshotInfo sn;
1494
    QEMUFile *f;
1495
    int ret;
1496

    
1497
    bs = get_bs_snapshots();
1498
    if (!bs) {
1499
        monitor_printf(mon, "No block device supports snapshots\n");
1500
        return -EINVAL;
1501
    }
1502

    
1503
    /* Flush all IO requests so they don't interfere with the new state.  */
1504
    qemu_aio_flush();
1505

    
1506
    TAILQ_FOREACH(dinfo, &drives, next) {
1507
        bs1 = dinfo->bdrv;
1508
        if (bdrv_has_snapshot(bs1)) {
1509
            ret = bdrv_snapshot_goto(bs1, name);
1510
            if (ret < 0) {
1511
                if (bs != bs1)
1512
                    monitor_printf(mon, "Warning: ");
1513
                switch(ret) {
1514
                case -ENOTSUP:
1515
                    monitor_printf(mon,
1516
                                   "Snapshots not supported on device '%s'\n",
1517
                                   bdrv_get_device_name(bs1));
1518
                    break;
1519
                case -ENOENT:
1520
                    monitor_printf(mon, "Could not find snapshot '%s' on "
1521
                                   "device '%s'\n",
1522
                                   name, bdrv_get_device_name(bs1));
1523
                    break;
1524
                default:
1525
                    monitor_printf(mon, "Error %d while activating snapshot on"
1526
                                   " '%s'\n", ret, bdrv_get_device_name(bs1));
1527
                    break;
1528
                }
1529
                /* fatal on snapshot block device */
1530
                if (bs == bs1)
1531
                    return 0;
1532
            }
1533
        }
1534
    }
1535

    
1536
    /* Don't even try to load empty VM states */
1537
    ret = bdrv_snapshot_find(bs, &sn, name);
1538
    if ((ret >= 0) && (sn.vm_state_size == 0))
1539
        return -EINVAL;
1540

    
1541
    /* restore the VM state */
1542
    f = qemu_fopen_bdrv(bs, 0);
1543
    if (!f) {
1544
        monitor_printf(mon, "Could not open VM state file\n");
1545
        return -EINVAL;
1546
    }
1547
    ret = qemu_loadvm_state(f);
1548
    qemu_fclose(f);
1549
    if (ret < 0) {
1550
        monitor_printf(mon, "Error %d while loading VM state\n", ret);
1551
        return ret;
1552
    }
1553
    return 0;
1554
}
1555

    
1556
void do_delvm(Monitor *mon, const char *name)
1557
{
1558
    DriveInfo *dinfo;
1559
    BlockDriverState *bs, *bs1;
1560
    int ret;
1561

    
1562
    bs = get_bs_snapshots();
1563
    if (!bs) {
1564
        monitor_printf(mon, "No block device supports snapshots\n");
1565
        return;
1566
    }
1567

    
1568
    TAILQ_FOREACH(dinfo, &drives, next) {
1569
        bs1 = dinfo->bdrv;
1570
        if (bdrv_has_snapshot(bs1)) {
1571
            ret = bdrv_snapshot_delete(bs1, name);
1572
            if (ret < 0) {
1573
                if (ret == -ENOTSUP)
1574
                    monitor_printf(mon,
1575
                                   "Snapshots not supported on device '%s'\n",
1576
                                   bdrv_get_device_name(bs1));
1577
                else
1578
                    monitor_printf(mon, "Error %d while deleting snapshot on "
1579
                                   "'%s'\n", ret, bdrv_get_device_name(bs1));
1580
            }
1581
        }
1582
    }
1583
}
1584

    
1585
void do_info_snapshots(Monitor *mon)
1586
{
1587
    DriveInfo *dinfo;
1588
    BlockDriverState *bs, *bs1;
1589
    QEMUSnapshotInfo *sn_tab, *sn;
1590
    int nb_sns, i;
1591
    char buf[256];
1592

    
1593
    bs = get_bs_snapshots();
1594
    if (!bs) {
1595
        monitor_printf(mon, "No available block device supports snapshots\n");
1596
        return;
1597
    }
1598
    monitor_printf(mon, "Snapshot devices:");
1599
    TAILQ_FOREACH(dinfo, &drives, next) {
1600
        bs1 = dinfo->bdrv;
1601
        if (bdrv_has_snapshot(bs1)) {
1602
            if (bs == bs1)
1603
                monitor_printf(mon, " %s", bdrv_get_device_name(bs1));
1604
        }
1605
    }
1606
    monitor_printf(mon, "\n");
1607

    
1608
    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1609
    if (nb_sns < 0) {
1610
        monitor_printf(mon, "bdrv_snapshot_list: error %d\n", nb_sns);
1611
        return;
1612
    }
1613
    monitor_printf(mon, "Snapshot list (from %s):\n",
1614
                   bdrv_get_device_name(bs));
1615
    monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1616
    for(i = 0; i < nb_sns; i++) {
1617
        sn = &sn_tab[i];
1618
        monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1619
    }
1620
    qemu_free(sn_tab);
1621
}