Statistics
| Branch: | Revision:

root / savevm.c @ 72cf2d4f

History | View | Annotate | Download (41.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
#include "qemu-queue.h"
94

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

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

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

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

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

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

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

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

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

    
153
/***********************************************************/
154
/* savevm/loadvm support */
155

    
156
#define IO_BUF_SIZE 32768
157

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

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

    
173
    int has_error;
174
};
175

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

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

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

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

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

    
200
    return len;
201
}
202

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

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

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

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

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

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

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

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

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

    
256
    s->stdio_file = stdio_file;
257

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

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

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

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

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

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

    
286
    return fd;
287
}
288

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
412
    return f;
413
}
414

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
584
    return 0;
585
}
586

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

    
594
    return 0;
595
}
596

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

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

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

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

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

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

    
643
/* 8 bit int */
644

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

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

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

    
664
/* 16 bit int */
665

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

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

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

    
685
/* 32 bit int */
686

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

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

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

    
706
/* 32 bit int. See that the received value is the same than the one
707
   in the field */
708

    
709
static int get_int32_equal(QEMUFile *f, void *pv, size_t size)
710
{
711
    int32_t *v = pv;
712
    int32_t v2;
713
    qemu_get_sbe32s(f, &v2);
714

    
715
    if (*v == v2)
716
        return 0;
717
    return -EINVAL;
718
}
719

    
720
const VMStateInfo vmstate_info_int32_equal = {
721
    .name = "int32 equal",
722
    .get  = get_int32_equal,
723
    .put  = put_int32,
724
};
725

    
726
/* 32 bit int. See that the received value is the less or the same
727
   than the one in the field */
728

    
729
static int get_int32_le(QEMUFile *f, void *pv, size_t size)
730
{
731
    int32_t *old = pv;
732
    int32_t new;
733
    qemu_get_sbe32s(f, &new);
734

    
735
    if (*old <= new)
736
        return 0;
737
    return -EINVAL;
738
}
739

    
740
const VMStateInfo vmstate_info_int32_le = {
741
    .name = "int32 equal",
742
    .get  = get_int32_le,
743
    .put  = put_int32,
744
};
745

    
746
/* 64 bit int */
747

    
748
static int get_int64(QEMUFile *f, void *pv, size_t size)
749
{
750
    int64_t *v = pv;
751
    qemu_get_sbe64s(f, v);
752
    return 0;
753
}
754

    
755
static void put_int64(QEMUFile *f, const void *pv, size_t size)
756
{
757
    const int64_t *v = pv;
758
    qemu_put_sbe64s(f, v);
759
}
760

    
761
const VMStateInfo vmstate_info_int64 = {
762
    .name = "int64",
763
    .get  = get_int64,
764
    .put  = put_int64,
765
};
766

    
767
/* 8 bit unsigned int */
768

    
769
static int get_uint8(QEMUFile *f, void *pv, size_t size)
770
{
771
    uint8_t *v = pv;
772
    qemu_get_8s(f, v);
773
    return 0;
774
}
775

    
776
static void put_uint8(QEMUFile *f, const void *pv, size_t size)
777
{
778
    const uint8_t *v = pv;
779
    qemu_put_8s(f, v);
780
}
781

    
782
const VMStateInfo vmstate_info_uint8 = {
783
    .name = "uint8",
784
    .get  = get_uint8,
785
    .put  = put_uint8,
786
};
787

    
788
/* 16 bit unsigned int */
789

    
790
static int get_uint16(QEMUFile *f, void *pv, size_t size)
791
{
792
    uint16_t *v = pv;
793
    qemu_get_be16s(f, v);
794
    return 0;
795
}
796

    
797
static void put_uint16(QEMUFile *f, const void *pv, size_t size)
798
{
799
    const uint16_t *v = pv;
800
    qemu_put_be16s(f, v);
801
}
802

    
803
const VMStateInfo vmstate_info_uint16 = {
804
    .name = "uint16",
805
    .get  = get_uint16,
806
    .put  = put_uint16,
807
};
808

    
809
/* 32 bit unsigned int */
810

    
811
static int get_uint32(QEMUFile *f, void *pv, size_t size)
812
{
813
    uint32_t *v = pv;
814
    qemu_get_be32s(f, v);
815
    return 0;
816
}
817

    
818
static void put_uint32(QEMUFile *f, const void *pv, size_t size)
819
{
820
    const uint32_t *v = pv;
821
    qemu_put_be32s(f, v);
822
}
823

    
824
const VMStateInfo vmstate_info_uint32 = {
825
    .name = "uint32",
826
    .get  = get_uint32,
827
    .put  = put_uint32,
828
};
829

    
830
/* 64 bit unsigned int */
831

    
832
static int get_uint64(QEMUFile *f, void *pv, size_t size)
833
{
834
    uint64_t *v = pv;
835
    qemu_get_be64s(f, v);
836
    return 0;
837
}
838

    
839
static void put_uint64(QEMUFile *f, const void *pv, size_t size)
840
{
841
    const uint64_t *v = pv;
842
    qemu_put_be64s(f, v);
843
}
844

    
845
const VMStateInfo vmstate_info_uint64 = {
846
    .name = "uint64",
847
    .get  = get_uint64,
848
    .put  = put_uint64,
849
};
850

    
851
/* 8 bit int. See that the received value is the same than the one
852
   in the field */
853

    
854
static int get_uint8_equal(QEMUFile *f, void *pv, size_t size)
855
{
856
    uint8_t *v = pv;
857
    uint8_t v2;
858
    qemu_get_8s(f, &v2);
859

    
860
    if (*v == v2)
861
        return 0;
862
    return -EINVAL;
863
}
864

    
865
const VMStateInfo vmstate_info_uint8_equal = {
866
    .name = "int32 equal",
867
    .get  = get_uint8_equal,
868
    .put  = put_uint8,
869
};
870

    
871
/* timers  */
872

    
873
static int get_timer(QEMUFile *f, void *pv, size_t size)
874
{
875
    QEMUTimer *v = pv;
876
    qemu_get_timer(f, v);
877
    return 0;
878
}
879

    
880
static void put_timer(QEMUFile *f, const void *pv, size_t size)
881
{
882
    QEMUTimer *v = (void *)pv;
883
    qemu_put_timer(f, v);
884
}
885

    
886
const VMStateInfo vmstate_info_timer = {
887
    .name = "timer",
888
    .get  = get_timer,
889
    .put  = put_timer,
890
};
891

    
892
/* uint8_t buffers */
893

    
894
static int get_buffer(QEMUFile *f, void *pv, size_t size)
895
{
896
    uint8_t *v = pv;
897
    qemu_get_buffer(f, v, size);
898
    return 0;
899
}
900

    
901
static void put_buffer(QEMUFile *f, const void *pv, size_t size)
902
{
903
    uint8_t *v = (void *)pv;
904
    qemu_put_buffer(f, v, size);
905
}
906

    
907
const VMStateInfo vmstate_info_buffer = {
908
    .name = "buffer",
909
    .get  = get_buffer,
910
    .put  = put_buffer,
911
};
912

    
913
typedef struct SaveStateEntry {
914
    QTAILQ_ENTRY(SaveStateEntry) entry;
915
    char idstr[256];
916
    int instance_id;
917
    int version_id;
918
    int section_id;
919
    SaveLiveStateHandler *save_live_state;
920
    SaveStateHandler *save_state;
921
    LoadStateHandler *load_state;
922
    const VMStateDescription *vmsd;
923
    void *opaque;
924
} SaveStateEntry;
925

    
926
static QTAILQ_HEAD(savevm_handlers, SaveStateEntry) savevm_handlers =
927
    QTAILQ_HEAD_INITIALIZER(savevm_handlers);
928
static int global_section_id;
929

    
930
static int calculate_new_instance_id(const char *idstr)
931
{
932
    SaveStateEntry *se;
933
    int instance_id = 0;
934

    
935
    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
936
        if (strcmp(idstr, se->idstr) == 0
937
            && instance_id <= se->instance_id) {
938
            instance_id = se->instance_id + 1;
939
        }
940
    }
941
    return instance_id;
942
}
943

    
944
/* TODO: Individual devices generally have very little idea about the rest
945
   of the system, so instance_id should be removed/replaced.
946
   Meanwhile pass -1 as instance_id if you do not already have a clearly
947
   distinguishing id for all instances of your device class. */
948
int register_savevm_live(const char *idstr,
949
                         int instance_id,
950
                         int version_id,
951
                         SaveLiveStateHandler *save_live_state,
952
                         SaveStateHandler *save_state,
953
                         LoadStateHandler *load_state,
954
                         void *opaque)
955
{
956
    SaveStateEntry *se;
957

    
958
    se = qemu_malloc(sizeof(SaveStateEntry));
959
    pstrcpy(se->idstr, sizeof(se->idstr), idstr);
960
    se->version_id = version_id;
961
    se->section_id = global_section_id++;
962
    se->save_live_state = save_live_state;
963
    se->save_state = save_state;
964
    se->load_state = load_state;
965
    se->opaque = opaque;
966
    se->vmsd = NULL;
967

    
968
    if (instance_id == -1) {
969
        se->instance_id = calculate_new_instance_id(idstr);
970
    } else {
971
        se->instance_id = instance_id;
972
    }
973
    /* add at the end of list */
974
    QTAILQ_INSERT_TAIL(&savevm_handlers, se, entry);
975
    return 0;
976
}
977

    
978
int register_savevm(const char *idstr,
979
                    int instance_id,
980
                    int version_id,
981
                    SaveStateHandler *save_state,
982
                    LoadStateHandler *load_state,
983
                    void *opaque)
984
{
985
    return register_savevm_live(idstr, instance_id, version_id,
986
                                NULL, save_state, load_state, opaque);
987
}
988

    
989
void unregister_savevm(const char *idstr, void *opaque)
990
{
991
    SaveStateEntry *se, *new_se;
992

    
993
    QTAILQ_FOREACH_SAFE(se, &savevm_handlers, entry, new_se) {
994
        if (strcmp(se->idstr, idstr) == 0 && se->opaque == opaque) {
995
            QTAILQ_REMOVE(&savevm_handlers, se, entry);
996
            qemu_free(se);
997
        }
998
    }
999
}
1000

    
1001
int vmstate_register(int instance_id, const VMStateDescription *vmsd,
1002
                     void *opaque)
1003
{
1004
    SaveStateEntry *se;
1005

    
1006
    se = qemu_malloc(sizeof(SaveStateEntry));
1007
    pstrcpy(se->idstr, sizeof(se->idstr), vmsd->name);
1008
    se->version_id = vmsd->version_id;
1009
    se->section_id = global_section_id++;
1010
    se->save_live_state = NULL;
1011
    se->save_state = NULL;
1012
    se->load_state = NULL;
1013
    se->opaque = opaque;
1014
    se->vmsd = vmsd;
1015

    
1016
    if (instance_id == -1) {
1017
        se->instance_id = calculate_new_instance_id(vmsd->name);
1018
    } else {
1019
        se->instance_id = instance_id;
1020
    }
1021
    /* add at the end of list */
1022
    QTAILQ_INSERT_TAIL(&savevm_handlers, se, entry);
1023
    return 0;
1024
}
1025

    
1026
void vmstate_unregister(const VMStateDescription *vmsd, void *opaque)
1027
{
1028
    SaveStateEntry *se, *new_se;
1029

    
1030
    QTAILQ_FOREACH_SAFE(se, &savevm_handlers, entry, new_se) {
1031
        if (se->vmsd == vmsd && se->opaque == opaque) {
1032
            QTAILQ_REMOVE(&savevm_handlers, se, entry);
1033
            qemu_free(se);
1034
        }
1035
    }
1036
}
1037

    
1038
int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
1039
                       void *opaque, int version_id)
1040
{
1041
    VMStateField *field = vmsd->fields;
1042

    
1043
    if (version_id > vmsd->version_id) {
1044
        return -EINVAL;
1045
    }
1046
    if (version_id < vmsd->minimum_version_id_old) {
1047
        return -EINVAL;
1048
    }
1049
    if  (version_id < vmsd->minimum_version_id) {
1050
        return vmsd->load_state_old(f, opaque, version_id);
1051
    }
1052
    if (vmsd->pre_load) {
1053
        int ret = vmsd->pre_load(opaque);
1054
        if (ret)
1055
            return ret;
1056
    }
1057
    while(field->name) {
1058
        if (field->version_id <= version_id) {
1059
            void *base_addr = opaque + field->offset;
1060
            int ret, i, n_elems = 1;
1061

    
1062
            if (field->flags & VMS_ARRAY) {
1063
                n_elems = field->num;
1064
            } else if (field->flags & VMS_VARRAY) {
1065
                n_elems = *(size_t *)(opaque+field->num_offset);
1066
            }
1067
            if (field->flags & VMS_POINTER) {
1068
                base_addr = *(void **)base_addr;
1069
            }
1070
            for (i = 0; i < n_elems; i++) {
1071
                void *addr = base_addr + field->size * i;
1072

    
1073
                if (field->flags & VMS_STRUCT) {
1074
                    ret = vmstate_load_state(f, field->vmsd, addr, field->vmsd->version_id);
1075
                } else {
1076
                    ret = field->info->get(f, addr, field->size);
1077

    
1078
                }
1079
                if (ret < 0) {
1080
                    return ret;
1081
                }
1082
            }
1083
        }
1084
        field++;
1085
    }
1086
    if (vmsd->post_load) {
1087
        return vmsd->post_load(opaque);
1088
    }
1089
    return 0;
1090
}
1091

    
1092
void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
1093
                        const void *opaque)
1094
{
1095
    VMStateField *field = vmsd->fields;
1096

    
1097
    if (vmsd->pre_save) {
1098
        vmsd->pre_save(opaque);
1099
    }
1100
    while(field->name) {
1101
        const void *base_addr = opaque + field->offset;
1102
        int i, n_elems = 1;
1103

    
1104
        if (field->flags & VMS_ARRAY) {
1105
            n_elems = field->num;
1106
        } else if (field->flags & VMS_VARRAY) {
1107
            n_elems = *(size_t *)(opaque+field->num_offset);
1108
        }
1109
        if (field->flags & VMS_POINTER) {
1110
            base_addr = *(void **)base_addr;
1111
        }
1112
        for (i = 0; i < n_elems; i++) {
1113
            const void *addr = base_addr + field->size * i;
1114

    
1115
            if (field->flags & VMS_STRUCT) {
1116
                vmstate_save_state(f, field->vmsd, addr);
1117
            } else {
1118
                field->info->put(f, addr, field->size);
1119
            }
1120
        }
1121
        field++;
1122
    }
1123
    if (vmsd->post_save) {
1124
        vmsd->post_save(opaque);
1125
    }
1126
}
1127

    
1128
static int vmstate_load(QEMUFile *f, SaveStateEntry *se, int version_id)
1129
{
1130
    if (!se->vmsd) {         /* Old style */
1131
        return se->load_state(f, se->opaque, version_id);
1132
    }
1133
    return vmstate_load_state(f, se->vmsd, se->opaque, version_id);
1134
}
1135

    
1136
static void vmstate_save(QEMUFile *f, SaveStateEntry *se)
1137
{
1138
    if (!se->vmsd) {         /* Old style */
1139
        se->save_state(f, se->opaque);
1140
        return;
1141
    }
1142
    vmstate_save_state(f,se->vmsd, se->opaque);
1143
}
1144

    
1145
#define QEMU_VM_FILE_MAGIC           0x5145564d
1146
#define QEMU_VM_FILE_VERSION_COMPAT  0x00000002
1147
#define QEMU_VM_FILE_VERSION         0x00000003
1148

    
1149
#define QEMU_VM_EOF                  0x00
1150
#define QEMU_VM_SECTION_START        0x01
1151
#define QEMU_VM_SECTION_PART         0x02
1152
#define QEMU_VM_SECTION_END          0x03
1153
#define QEMU_VM_SECTION_FULL         0x04
1154

    
1155
int qemu_savevm_state_begin(QEMUFile *f)
1156
{
1157
    SaveStateEntry *se;
1158

    
1159
    qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
1160
    qemu_put_be32(f, QEMU_VM_FILE_VERSION);
1161

    
1162
    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1163
        int len;
1164

    
1165
        if (se->save_live_state == NULL)
1166
            continue;
1167

    
1168
        /* Section type */
1169
        qemu_put_byte(f, QEMU_VM_SECTION_START);
1170
        qemu_put_be32(f, se->section_id);
1171

    
1172
        /* ID string */
1173
        len = strlen(se->idstr);
1174
        qemu_put_byte(f, len);
1175
        qemu_put_buffer(f, (uint8_t *)se->idstr, len);
1176

    
1177
        qemu_put_be32(f, se->instance_id);
1178
        qemu_put_be32(f, se->version_id);
1179

    
1180
        se->save_live_state(f, QEMU_VM_SECTION_START, se->opaque);
1181
    }
1182

    
1183
    if (qemu_file_has_error(f))
1184
        return -EIO;
1185

    
1186
    return 0;
1187
}
1188

    
1189
int qemu_savevm_state_iterate(QEMUFile *f)
1190
{
1191
    SaveStateEntry *se;
1192
    int ret = 1;
1193

    
1194
    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1195
        if (se->save_live_state == NULL)
1196
            continue;
1197

    
1198
        /* Section type */
1199
        qemu_put_byte(f, QEMU_VM_SECTION_PART);
1200
        qemu_put_be32(f, se->section_id);
1201

    
1202
        ret &= !!se->save_live_state(f, QEMU_VM_SECTION_PART, se->opaque);
1203
    }
1204

    
1205
    if (ret)
1206
        return 1;
1207

    
1208
    if (qemu_file_has_error(f))
1209
        return -EIO;
1210

    
1211
    return 0;
1212
}
1213

    
1214
int qemu_savevm_state_complete(QEMUFile *f)
1215
{
1216
    SaveStateEntry *se;
1217

    
1218
    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1219
        if (se->save_live_state == NULL)
1220
            continue;
1221

    
1222
        /* Section type */
1223
        qemu_put_byte(f, QEMU_VM_SECTION_END);
1224
        qemu_put_be32(f, se->section_id);
1225

    
1226
        se->save_live_state(f, QEMU_VM_SECTION_END, se->opaque);
1227
    }
1228

    
1229
    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1230
        int len;
1231

    
1232
        if (se->save_state == NULL && se->vmsd == NULL)
1233
            continue;
1234

    
1235
        /* Section type */
1236
        qemu_put_byte(f, QEMU_VM_SECTION_FULL);
1237
        qemu_put_be32(f, se->section_id);
1238

    
1239
        /* ID string */
1240
        len = strlen(se->idstr);
1241
        qemu_put_byte(f, len);
1242
        qemu_put_buffer(f, (uint8_t *)se->idstr, len);
1243

    
1244
        qemu_put_be32(f, se->instance_id);
1245
        qemu_put_be32(f, se->version_id);
1246

    
1247
        vmstate_save(f, se);
1248
    }
1249

    
1250
    qemu_put_byte(f, QEMU_VM_EOF);
1251

    
1252
    if (qemu_file_has_error(f))
1253
        return -EIO;
1254

    
1255
    return 0;
1256
}
1257

    
1258
int qemu_savevm_state(QEMUFile *f)
1259
{
1260
    int saved_vm_running;
1261
    int ret;
1262

    
1263
    saved_vm_running = vm_running;
1264
    vm_stop(0);
1265

    
1266
    bdrv_flush_all();
1267

    
1268
    ret = qemu_savevm_state_begin(f);
1269
    if (ret < 0)
1270
        goto out;
1271

    
1272
    do {
1273
        ret = qemu_savevm_state_iterate(f);
1274
        if (ret < 0)
1275
            goto out;
1276
    } while (ret == 0);
1277

    
1278
    ret = qemu_savevm_state_complete(f);
1279

    
1280
out:
1281
    if (qemu_file_has_error(f))
1282
        ret = -EIO;
1283

    
1284
    if (!ret && saved_vm_running)
1285
        vm_start();
1286

    
1287
    return ret;
1288
}
1289

    
1290
static SaveStateEntry *find_se(const char *idstr, int instance_id)
1291
{
1292
    SaveStateEntry *se;
1293

    
1294
    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1295
        if (!strcmp(se->idstr, idstr) &&
1296
            instance_id == se->instance_id)
1297
            return se;
1298
    }
1299
    return NULL;
1300
}
1301

    
1302
typedef struct LoadStateEntry {
1303
    QLIST_ENTRY(LoadStateEntry) entry;
1304
    SaveStateEntry *se;
1305
    int section_id;
1306
    int version_id;
1307
} LoadStateEntry;
1308

    
1309
int qemu_loadvm_state(QEMUFile *f)
1310
{
1311
    QLIST_HEAD(, LoadStateEntry) loadvm_handlers =
1312
        QLIST_HEAD_INITIALIZER(loadvm_handlers);
1313
    LoadStateEntry *le, *new_le;
1314
    uint8_t section_type;
1315
    unsigned int v;
1316
    int ret;
1317

    
1318
    v = qemu_get_be32(f);
1319
    if (v != QEMU_VM_FILE_MAGIC)
1320
        return -EINVAL;
1321

    
1322
    v = qemu_get_be32(f);
1323
    if (v == QEMU_VM_FILE_VERSION_COMPAT) {
1324
        fprintf(stderr, "SaveVM v2 format is obsolete and don't work anymore\n");
1325
        return -ENOTSUP;
1326
    }
1327
    if (v != QEMU_VM_FILE_VERSION)
1328
        return -ENOTSUP;
1329

    
1330
    while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) {
1331
        uint32_t instance_id, version_id, section_id;
1332
        SaveStateEntry *se;
1333
        char idstr[257];
1334
        int len;
1335

    
1336
        switch (section_type) {
1337
        case QEMU_VM_SECTION_START:
1338
        case QEMU_VM_SECTION_FULL:
1339
            /* Read section start */
1340
            section_id = qemu_get_be32(f);
1341
            len = qemu_get_byte(f);
1342
            qemu_get_buffer(f, (uint8_t *)idstr, len);
1343
            idstr[len] = 0;
1344
            instance_id = qemu_get_be32(f);
1345
            version_id = qemu_get_be32(f);
1346

    
1347
            /* Find savevm section */
1348
            se = find_se(idstr, instance_id);
1349
            if (se == NULL) {
1350
                fprintf(stderr, "Unknown savevm section or instance '%s' %d\n", idstr, instance_id);
1351
                ret = -EINVAL;
1352
                goto out;
1353
            }
1354

    
1355
            /* Validate version */
1356
            if (version_id > se->version_id) {
1357
                fprintf(stderr, "savevm: unsupported version %d for '%s' v%d\n",
1358
                        version_id, idstr, se->version_id);
1359
                ret = -EINVAL;
1360
                goto out;
1361
            }
1362

    
1363
            /* Add entry */
1364
            le = qemu_mallocz(sizeof(*le));
1365

    
1366
            le->se = se;
1367
            le->section_id = section_id;
1368
            le->version_id = version_id;
1369
            QLIST_INSERT_HEAD(&loadvm_handlers, le, entry);
1370

    
1371
            ret = vmstate_load(f, le->se, le->version_id);
1372
            if (ret < 0) {
1373
                fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n",
1374
                        instance_id, idstr);
1375
                goto out;
1376
            }
1377
            break;
1378
        case QEMU_VM_SECTION_PART:
1379
        case QEMU_VM_SECTION_END:
1380
            section_id = qemu_get_be32(f);
1381

    
1382
            QLIST_FOREACH(le, &loadvm_handlers, entry) {
1383
                if (le->section_id == section_id) {
1384
                    break;
1385
                }
1386
            }
1387
            if (le == NULL) {
1388
                fprintf(stderr, "Unknown savevm section %d\n", section_id);
1389
                ret = -EINVAL;
1390
                goto out;
1391
            }
1392

    
1393
            ret = vmstate_load(f, le->se, le->version_id);
1394
            if (ret < 0) {
1395
                fprintf(stderr, "qemu: warning: error while loading state section id %d\n",
1396
                        section_id);
1397
                goto out;
1398
            }
1399
            break;
1400
        default:
1401
            fprintf(stderr, "Unknown savevm section type %d\n", section_type);
1402
            ret = -EINVAL;
1403
            goto out;
1404
        }
1405
    }
1406

    
1407
    ret = 0;
1408

    
1409
out:
1410
    QLIST_FOREACH_SAFE(le, &loadvm_handlers, entry, new_le) {
1411
        QLIST_REMOVE(le, entry);
1412
        qemu_free(le);
1413
    }
1414

    
1415
    if (qemu_file_has_error(f))
1416
        ret = -EIO;
1417

    
1418
    return ret;
1419
}
1420

    
1421
/* device can contain snapshots */
1422
static int bdrv_can_snapshot(BlockDriverState *bs)
1423
{
1424
    return (bs &&
1425
            !bdrv_is_removable(bs) &&
1426
            !bdrv_is_read_only(bs));
1427
}
1428

    
1429
/* device must be snapshots in order to have a reliable snapshot */
1430
static int bdrv_has_snapshot(BlockDriverState *bs)
1431
{
1432
    return (bs &&
1433
            !bdrv_is_removable(bs) &&
1434
            !bdrv_is_read_only(bs));
1435
}
1436

    
1437
static BlockDriverState *get_bs_snapshots(void)
1438
{
1439
    BlockDriverState *bs;
1440
    DriveInfo *dinfo;
1441

    
1442
    if (bs_snapshots)
1443
        return bs_snapshots;
1444
    QTAILQ_FOREACH(dinfo, &drives, next) {
1445
        bs = dinfo->bdrv;
1446
        if (bdrv_can_snapshot(bs))
1447
            goto ok;
1448
    }
1449
    return NULL;
1450
 ok:
1451
    bs_snapshots = bs;
1452
    return bs;
1453
}
1454

    
1455
static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
1456
                              const char *name)
1457
{
1458
    QEMUSnapshotInfo *sn_tab, *sn;
1459
    int nb_sns, i, ret;
1460

    
1461
    ret = -ENOENT;
1462
    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1463
    if (nb_sns < 0)
1464
        return ret;
1465
    for(i = 0; i < nb_sns; i++) {
1466
        sn = &sn_tab[i];
1467
        if (!strcmp(sn->id_str, name) || !strcmp(sn->name, name)) {
1468
            *sn_info = *sn;
1469
            ret = 0;
1470
            break;
1471
        }
1472
    }
1473
    qemu_free(sn_tab);
1474
    return ret;
1475
}
1476

    
1477
void do_savevm(Monitor *mon, const QDict *qdict)
1478
{
1479
    DriveInfo *dinfo;
1480
    BlockDriverState *bs, *bs1;
1481
    QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
1482
    int must_delete, ret;
1483
    QEMUFile *f;
1484
    int saved_vm_running;
1485
    uint32_t vm_state_size;
1486
#ifdef _WIN32
1487
    struct _timeb tb;
1488
#else
1489
    struct timeval tv;
1490
#endif
1491
    const char *name = qdict_get_try_str(qdict, "name");
1492

    
1493
    bs = get_bs_snapshots();
1494
    if (!bs) {
1495
        monitor_printf(mon, "No block device can accept snapshots\n");
1496
        return;
1497
    }
1498

    
1499
    /* ??? Should this occur after vm_stop?  */
1500
    qemu_aio_flush();
1501

    
1502
    saved_vm_running = vm_running;
1503
    vm_stop(0);
1504

    
1505
    must_delete = 0;
1506
    if (name) {
1507
        ret = bdrv_snapshot_find(bs, old_sn, name);
1508
        if (ret >= 0) {
1509
            must_delete = 1;
1510
        }
1511
    }
1512
    memset(sn, 0, sizeof(*sn));
1513
    if (must_delete) {
1514
        pstrcpy(sn->name, sizeof(sn->name), old_sn->name);
1515
        pstrcpy(sn->id_str, sizeof(sn->id_str), old_sn->id_str);
1516
    } else {
1517
        if (name)
1518
            pstrcpy(sn->name, sizeof(sn->name), name);
1519
    }
1520

    
1521
    /* fill auxiliary fields */
1522
#ifdef _WIN32
1523
    _ftime(&tb);
1524
    sn->date_sec = tb.time;
1525
    sn->date_nsec = tb.millitm * 1000000;
1526
#else
1527
    gettimeofday(&tv, NULL);
1528
    sn->date_sec = tv.tv_sec;
1529
    sn->date_nsec = tv.tv_usec * 1000;
1530
#endif
1531
    sn->vm_clock_nsec = qemu_get_clock(vm_clock);
1532

    
1533
    /* save the VM state */
1534
    f = qemu_fopen_bdrv(bs, 1);
1535
    if (!f) {
1536
        monitor_printf(mon, "Could not open VM state file\n");
1537
        goto the_end;
1538
    }
1539
    ret = qemu_savevm_state(f);
1540
    vm_state_size = qemu_ftell(f);
1541
    qemu_fclose(f);
1542
    if (ret < 0) {
1543
        monitor_printf(mon, "Error %d while writing VM\n", ret);
1544
        goto the_end;
1545
    }
1546

    
1547
    /* create the snapshots */
1548

    
1549
    QTAILQ_FOREACH(dinfo, &drives, next) {
1550
        bs1 = dinfo->bdrv;
1551
        if (bdrv_has_snapshot(bs1)) {
1552
            if (must_delete) {
1553
                ret = bdrv_snapshot_delete(bs1, old_sn->id_str);
1554
                if (ret < 0) {
1555
                    monitor_printf(mon,
1556
                                   "Error while deleting snapshot on '%s'\n",
1557
                                   bdrv_get_device_name(bs1));
1558
                }
1559
            }
1560
            /* Write VM state size only to the image that contains the state */
1561
            sn->vm_state_size = (bs == bs1 ? vm_state_size : 0);
1562
            ret = bdrv_snapshot_create(bs1, sn);
1563
            if (ret < 0) {
1564
                monitor_printf(mon, "Error while creating snapshot on '%s'\n",
1565
                               bdrv_get_device_name(bs1));
1566
            }
1567
        }
1568
    }
1569

    
1570
 the_end:
1571
    if (saved_vm_running)
1572
        vm_start();
1573
}
1574

    
1575
int load_vmstate(Monitor *mon, const char *name)
1576
{
1577
    DriveInfo *dinfo;
1578
    BlockDriverState *bs, *bs1;
1579
    QEMUSnapshotInfo sn;
1580
    QEMUFile *f;
1581
    int ret;
1582

    
1583
    bs = get_bs_snapshots();
1584
    if (!bs) {
1585
        monitor_printf(mon, "No block device supports snapshots\n");
1586
        return -EINVAL;
1587
    }
1588

    
1589
    /* Flush all IO requests so they don't interfere with the new state.  */
1590
    qemu_aio_flush();
1591

    
1592
    QTAILQ_FOREACH(dinfo, &drives, next) {
1593
        bs1 = dinfo->bdrv;
1594
        if (bdrv_has_snapshot(bs1)) {
1595
            ret = bdrv_snapshot_goto(bs1, name);
1596
            if (ret < 0) {
1597
                if (bs != bs1)
1598
                    monitor_printf(mon, "Warning: ");
1599
                switch(ret) {
1600
                case -ENOTSUP:
1601
                    monitor_printf(mon,
1602
                                   "Snapshots not supported on device '%s'\n",
1603
                                   bdrv_get_device_name(bs1));
1604
                    break;
1605
                case -ENOENT:
1606
                    monitor_printf(mon, "Could not find snapshot '%s' on "
1607
                                   "device '%s'\n",
1608
                                   name, bdrv_get_device_name(bs1));
1609
                    break;
1610
                default:
1611
                    monitor_printf(mon, "Error %d while activating snapshot on"
1612
                                   " '%s'\n", ret, bdrv_get_device_name(bs1));
1613
                    break;
1614
                }
1615
                /* fatal on snapshot block device */
1616
                if (bs == bs1)
1617
                    return 0;
1618
            }
1619
        }
1620
    }
1621

    
1622
    /* Don't even try to load empty VM states */
1623
    ret = bdrv_snapshot_find(bs, &sn, name);
1624
    if ((ret >= 0) && (sn.vm_state_size == 0))
1625
        return -EINVAL;
1626

    
1627
    /* restore the VM state */
1628
    f = qemu_fopen_bdrv(bs, 0);
1629
    if (!f) {
1630
        monitor_printf(mon, "Could not open VM state file\n");
1631
        return -EINVAL;
1632
    }
1633
    ret = qemu_loadvm_state(f);
1634
    qemu_fclose(f);
1635
    if (ret < 0) {
1636
        monitor_printf(mon, "Error %d while loading VM state\n", ret);
1637
        return ret;
1638
    }
1639
    return 0;
1640
}
1641

    
1642
void do_delvm(Monitor *mon, const QDict *qdict)
1643
{
1644
    DriveInfo *dinfo;
1645
    BlockDriverState *bs, *bs1;
1646
    int ret;
1647
    const char *name = qdict_get_str(qdict, "name");
1648

    
1649
    bs = get_bs_snapshots();
1650
    if (!bs) {
1651
        monitor_printf(mon, "No block device supports snapshots\n");
1652
        return;
1653
    }
1654

    
1655
    QTAILQ_FOREACH(dinfo, &drives, next) {
1656
        bs1 = dinfo->bdrv;
1657
        if (bdrv_has_snapshot(bs1)) {
1658
            ret = bdrv_snapshot_delete(bs1, name);
1659
            if (ret < 0) {
1660
                if (ret == -ENOTSUP)
1661
                    monitor_printf(mon,
1662
                                   "Snapshots not supported on device '%s'\n",
1663
                                   bdrv_get_device_name(bs1));
1664
                else
1665
                    monitor_printf(mon, "Error %d while deleting snapshot on "
1666
                                   "'%s'\n", ret, bdrv_get_device_name(bs1));
1667
            }
1668
        }
1669
    }
1670
}
1671

    
1672
void do_info_snapshots(Monitor *mon)
1673
{
1674
    DriveInfo *dinfo;
1675
    BlockDriverState *bs, *bs1;
1676
    QEMUSnapshotInfo *sn_tab, *sn;
1677
    int nb_sns, i;
1678
    char buf[256];
1679

    
1680
    bs = get_bs_snapshots();
1681
    if (!bs) {
1682
        monitor_printf(mon, "No available block device supports snapshots\n");
1683
        return;
1684
    }
1685
    monitor_printf(mon, "Snapshot devices:");
1686
    QTAILQ_FOREACH(dinfo, &drives, next) {
1687
        bs1 = dinfo->bdrv;
1688
        if (bdrv_has_snapshot(bs1)) {
1689
            if (bs == bs1)
1690
                monitor_printf(mon, " %s", bdrv_get_device_name(bs1));
1691
        }
1692
    }
1693
    monitor_printf(mon, "\n");
1694

    
1695
    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1696
    if (nb_sns < 0) {
1697
        monitor_printf(mon, "bdrv_snapshot_list: error %d\n", nb_sns);
1698
        return;
1699
    }
1700
    monitor_printf(mon, "Snapshot list (from %s):\n",
1701
                   bdrv_get_device_name(bs));
1702
    monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
1703
    for(i = 0; i < nb_sns; i++) {
1704
        sn = &sn_tab[i];
1705
        monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
1706
    }
1707
    qemu_free(sn_tab);
1708
}