savevm.c 41.9 KB
Newer Older
A
aliguori 已提交
1 2 3 4
/*
 * QEMU System Emulator
 *
 * Copyright (c) 2003-2008 Fabrice Bellard
5 6 7 8
 * Copyright (c) 2009-2015 Red Hat Inc
 *
 * Authors:
 *  Juan Quintela <quintela@redhat.com>
A
aliguori 已提交
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

B
blueswir1 已提交
29
#include "config-host.h"
30
#include "qemu-common.h"
31
#include "hw/boards.h"
32
#include "hw/hw.h"
33
#include "hw/qdev.h"
P
Paolo Bonzini 已提交
34
#include "net/net.h"
35
#include "monitor/monitor.h"
36
#include "sysemu/sysemu.h"
37
#include "qemu/timer.h"
38
#include "audio/audio.h"
39
#include "migration/migration.h"
40 41
#include "qemu/sockets.h"
#include "qemu/queue.h"
42
#include "sysemu/cpus.h"
43
#include "exec/memory.h"
44
#include "qmp-commands.h"
45
#include "trace.h"
46
#include "qemu/iov.h"
47
#include "block/snapshot.h"
48
#include "block/qapi.h"
49

A
aliguori 已提交
50

N
Nolan 已提交
51
#ifndef ETH_P_RARP
S
Stefan Berger 已提交
52
#define ETH_P_RARP 0x8035
N
Nolan 已提交
53 54 55 56 57
#endif
#define ARP_HTYPE_ETH 0x0001
#define ARP_PTYPE_IP 0x0800
#define ARP_OP_REQUEST_REV 0x3

58 59
static bool skip_section_footers;

N
Nolan 已提交
60
static int announce_self_create(uint8_t *buf,
61
                                uint8_t *mac_addr)
A
aliguori 已提交
62
{
N
Nolan 已提交
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
    /* Ethernet header. */
    memset(buf, 0xff, 6);         /* destination MAC addr */
    memcpy(buf + 6, mac_addr, 6); /* source MAC addr */
    *(uint16_t *)(buf + 12) = htons(ETH_P_RARP); /* ethertype */

    /* RARP header. */
    *(uint16_t *)(buf + 14) = htons(ARP_HTYPE_ETH); /* hardware addr space */
    *(uint16_t *)(buf + 16) = htons(ARP_PTYPE_IP); /* protocol addr space */
    *(buf + 18) = 6; /* hardware addr length (ethernet) */
    *(buf + 19) = 4; /* protocol addr length (IPv4) */
    *(uint16_t *)(buf + 20) = htons(ARP_OP_REQUEST_REV); /* opcode */
    memcpy(buf + 22, mac_addr, 6); /* source hw addr */
    memset(buf + 28, 0x00, 4);     /* source protocol addr */
    memcpy(buf + 32, mac_addr, 6); /* target hw addr */
    memset(buf + 38, 0x00, 4);     /* target protocol addr */

    /* Padding to get up to 60 bytes (ethernet min packet size, minus FCS). */
    memset(buf + 42, 0x00, 18);

    return 60; /* len (FCS will be added by hardware) */
A
aliguori 已提交
83 84
}

M
Mark McLoughlin 已提交
85
static void qemu_announce_self_iter(NICState *nic, void *opaque)
A
aliguori 已提交
86
{
N
Nolan 已提交
87
    uint8_t buf[60];
M
Mark McLoughlin 已提交
88 89
    int len;

90
    trace_qemu_announce_self_iter(qemu_ether_ntoa(&nic->conf->macaddr));
M
Mark McLoughlin 已提交
91 92
    len = announce_self_create(buf, nic->conf->macaddr.a);

J
Jason Wang 已提交
93
    qemu_send_packet_raw(qemu_get_queue(nic), buf, len);
M
Mark McLoughlin 已提交
94 95 96 97 98
}


static void qemu_announce_self_once(void *opaque)
{
99 100
    static int count = SELF_ANNOUNCE_ROUNDS;
    QEMUTimer *timer = *(QEMUTimer **)opaque;
A
aliguori 已提交
101

M
Mark McLoughlin 已提交
102 103
    qemu_foreach_nic(qemu_announce_self_iter, NULL);

N
Nolan 已提交
104 105
    if (--count) {
        /* delay 50ms, 150ms, 250ms, ... */
106
        timer_mod(timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) +
107
                  self_announce_delay(count));
108
    } else {
109 110
            timer_del(timer);
            timer_free(timer);
111 112 113 114 115
    }
}

void qemu_announce_self(void)
{
116 117 118
    static QEMUTimer *timer;
    timer = timer_new_ms(QEMU_CLOCK_REALTIME, qemu_announce_self_once, &timer);
    qemu_announce_self_once(&timer);
A
aliguori 已提交
119 120 121 122 123
}

/***********************************************************/
/* savevm/loadvm support */

124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
static ssize_t block_writev_buffer(void *opaque, struct iovec *iov, int iovcnt,
                                   int64_t pos)
{
    int ret;
    QEMUIOVector qiov;

    qemu_iovec_init_external(&qiov, iov, iovcnt);
    ret = bdrv_writev_vmstate(opaque, &qiov, pos);
    if (ret < 0) {
        return ret;
    }

    return qiov.size;
}

139
static int block_put_buffer(void *opaque, const uint8_t *buf,
A
aliguori 已提交
140 141
                           int64_t pos, int size)
{
142
    bdrv_save_vmstate(opaque, buf, pos, size);
A
aliguori 已提交
143 144 145
    return size;
}

146
static int block_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
A
aliguori 已提交
147
{
148
    return bdrv_load_vmstate(opaque, buf, pos, size);
A
aliguori 已提交
149 150 151 152
}

static int bdrv_fclose(void *opaque)
{
153
    return bdrv_flush(opaque);
A
aliguori 已提交
154 155
}

156 157 158 159 160 161
static const QEMUFileOps bdrv_read_ops = {
    .get_buffer = block_get_buffer,
    .close =      bdrv_fclose
};

static const QEMUFileOps bdrv_write_ops = {
162 163 164
    .put_buffer     = block_put_buffer,
    .writev_buffer  = block_writev_buffer,
    .close          = bdrv_fclose
165 166
};

167
static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int is_writable)
A
aliguori 已提交
168
{
E
Eduardo Habkost 已提交
169
    if (is_writable) {
170
        return qemu_fopen_ops(bs, &bdrv_write_ops);
E
Eduardo Habkost 已提交
171
    }
172
    return qemu_fopen_ops(bs, &bdrv_read_ops);
A
aliguori 已提交
173 174
}

175

176 177 178
/* QEMUFile timer support.
 * Not in qemu-file.c to not add qemu-timer.c as dependency to qemu-file.c
 */
179

180
void timer_put(QEMUFile *f, QEMUTimer *ts)
181 182 183
{
    uint64_t expire_time;

184
    expire_time = timer_expire_time_ns(ts);
185 186 187
    qemu_put_be64(f, expire_time);
}

188
void timer_get(QEMUFile *f, QEMUTimer *ts)
189 190 191 192 193
{
    uint64_t expire_time;

    expire_time = qemu_get_be64(f);
    if (expire_time != -1) {
194
        timer_mod_ns(ts, expire_time);
195
    } else {
196
        timer_del(ts);
197 198 199 200
    }
}


201 202 203
/* VMState timer support.
 * Not in vmstate.c to not add qemu-timer.c as dependency to vmstate.c
 */
J
Juan Quintela 已提交
204 205 206 207

static int get_timer(QEMUFile *f, void *pv, size_t size)
{
    QEMUTimer *v = pv;
208
    timer_get(f, v);
J
Juan Quintela 已提交
209 210 211
    return 0;
}

212
static void put_timer(QEMUFile *f, void *pv, size_t size)
J
Juan Quintela 已提交
213
{
214
    QEMUTimer *v = pv;
215
    timer_put(f, v);
J
Juan Quintela 已提交
216 217 218 219 220 221 222 223
}

const VMStateInfo vmstate_info_timer = {
    .name = "timer",
    .get  = get_timer,
    .put  = put_timer,
};

224

225 226 227 228 229
typedef struct CompatEntry {
    char idstr[256];
    int instance_id;
} CompatEntry;

A
aliguori 已提交
230
typedef struct SaveStateEntry {
B
Blue Swirl 已提交
231
    QTAILQ_ENTRY(SaveStateEntry) entry;
A
aliguori 已提交
232 233
    char idstr[256];
    int instance_id;
J
Jan Kiszka 已提交
234
    int alias_id;
A
aliguori 已提交
235 236
    int version_id;
    int section_id;
237
    SaveVMHandlers *ops;
238
    const VMStateDescription *vmsd;
A
aliguori 已提交
239
    void *opaque;
240
    CompatEntry *compat;
241
    int is_ram;
A
aliguori 已提交
242 243
} SaveStateEntry;

J
Juan Quintela 已提交
244 245 246 247 248 249 250 251 252
typedef struct SaveState {
    QTAILQ_HEAD(, SaveStateEntry) handlers;
    int global_section_id;
} SaveState;

static SaveState savevm_state = {
    .handlers = QTAILQ_HEAD_INITIALIZER(savevm_state.handlers),
    .global_section_id = 0,
};
A
aliguori 已提交
253

254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
static void dump_vmstate_vmsd(FILE *out_file,
                              const VMStateDescription *vmsd, int indent,
                              bool is_subsection);

static void dump_vmstate_vmsf(FILE *out_file, const VMStateField *field,
                              int indent)
{
    fprintf(out_file, "%*s{\n", indent, "");
    indent += 2;
    fprintf(out_file, "%*s\"field\": \"%s\",\n", indent, "", field->name);
    fprintf(out_file, "%*s\"version_id\": %d,\n", indent, "",
            field->version_id);
    fprintf(out_file, "%*s\"field_exists\": %s,\n", indent, "",
            field->field_exists ? "true" : "false");
    fprintf(out_file, "%*s\"size\": %zu", indent, "", field->size);
    if (field->vmsd != NULL) {
        fprintf(out_file, ",\n");
        dump_vmstate_vmsd(out_file, field->vmsd, indent, false);
    }
    fprintf(out_file, "\n%*s}", indent - 2, "");
}

static void dump_vmstate_vmss(FILE *out_file,
277
                              const VMStateDescription **subsection,
278 279
                              int indent)
{
280 281
    if (*subsection != NULL) {
        dump_vmstate_vmsd(out_file, *subsection, indent, true);
282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
    }
}

static void dump_vmstate_vmsd(FILE *out_file,
                              const VMStateDescription *vmsd, int indent,
                              bool is_subsection)
{
    if (is_subsection) {
        fprintf(out_file, "%*s{\n", indent, "");
    } else {
        fprintf(out_file, "%*s\"%s\": {\n", indent, "", "Description");
    }
    indent += 2;
    fprintf(out_file, "%*s\"name\": \"%s\",\n", indent, "", vmsd->name);
    fprintf(out_file, "%*s\"version_id\": %d,\n", indent, "",
            vmsd->version_id);
    fprintf(out_file, "%*s\"minimum_version_id\": %d", indent, "",
            vmsd->minimum_version_id);
    if (vmsd->fields != NULL) {
        const VMStateField *field = vmsd->fields;
        bool first;

        fprintf(out_file, ",\n%*s\"Fields\": [\n", indent, "");
        first = true;
        while (field->name != NULL) {
            if (field->flags & VMS_MUST_EXIST) {
                /* Ignore VMSTATE_VALIDATE bits; these don't get migrated */
                field++;
                continue;
            }
            if (!first) {
                fprintf(out_file, ",\n");
            }
            dump_vmstate_vmsf(out_file, field, indent + 2);
            field++;
            first = false;
        }
        fprintf(out_file, "\n%*s]", indent, "");
    }
    if (vmsd->subsections != NULL) {
322
        const VMStateDescription **subsection = vmsd->subsections;
323 324 325 326
        bool first;

        fprintf(out_file, ",\n%*s\"Subsections\": [\n", indent, "");
        first = true;
327
        while (*subsection != NULL) {
328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
            if (!first) {
                fprintf(out_file, ",\n");
            }
            dump_vmstate_vmss(out_file, subsection, indent + 2);
            subsection++;
            first = false;
        }
        fprintf(out_file, "\n%*s]", indent, "");
    }
    fprintf(out_file, "\n%*s}", indent - 2, "");
}

static void dump_machine_type(FILE *out_file)
{
    MachineClass *mc;

    mc = MACHINE_GET_CLASS(current_machine);

    fprintf(out_file, "  \"vmschkmachine\": {\n");
    fprintf(out_file, "    \"Name\": \"%s\"\n", mc->name);
    fprintf(out_file, "  },\n");
}

void dump_vmstate_json_to_file(FILE *out_file)
{
    GSList *list, *elt;
    bool first;

    fprintf(out_file, "{\n");
    dump_machine_type(out_file);

    first = true;
    list = object_class_get_list(TYPE_DEVICE, true);
    for (elt = list; elt; elt = elt->next) {
        DeviceClass *dc = OBJECT_CLASS_CHECK(DeviceClass, elt->data,
                                             TYPE_DEVICE);
        const char *name;
        int indent = 2;

        if (!dc->vmsd) {
            continue;
        }

        if (!first) {
            fprintf(out_file, ",\n");
        }
        name = object_class_get_name(OBJECT_CLASS(dc));
        fprintf(out_file, "%*s\"%s\": {\n", indent, "", name);
        indent += 2;
        fprintf(out_file, "%*s\"Name\": \"%s\",\n", indent, "", name);
        fprintf(out_file, "%*s\"version_id\": %d,\n", indent, "",
                dc->vmsd->version_id);
        fprintf(out_file, "%*s\"minimum_version_id\": %d,\n", indent, "",
                dc->vmsd->minimum_version_id);

        dump_vmstate_vmsd(out_file, dc->vmsd, indent, false);

        fprintf(out_file, "\n%*s}", indent - 2, "");
        first = false;
    }
    fprintf(out_file, "\n}\n");
    fclose(out_file);
}

392 393 394 395 396
static int calculate_new_instance_id(const char *idstr)
{
    SaveStateEntry *se;
    int instance_id = 0;

J
Juan Quintela 已提交
397
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
398 399 400 401 402 403 404 405
        if (strcmp(idstr, se->idstr) == 0
            && instance_id <= se->instance_id) {
            instance_id = se->instance_id + 1;
        }
    }
    return instance_id;
}

406 407 408 409 410
static int calculate_compat_instance_id(const char *idstr)
{
    SaveStateEntry *se;
    int instance_id = 0;

J
Juan Quintela 已提交
411
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
E
Eduardo Habkost 已提交
412
        if (!se->compat) {
413
            continue;
E
Eduardo Habkost 已提交
414
        }
415 416 417 418 419 420 421 422 423

        if (strcmp(idstr, se->compat->idstr) == 0
            && instance_id <= se->compat->instance_id) {
            instance_id = se->compat->instance_id + 1;
        }
    }
    return instance_id;
}

A
aliguori 已提交
424 425 426 427
/* TODO: Individual devices generally have very little idea about the rest
   of the system, so instance_id should be removed/replaced.
   Meanwhile pass -1 as instance_id if you do not already have a clearly
   distinguishing id for all instances of your device class. */
A
Alex Williamson 已提交
428 429
int register_savevm_live(DeviceState *dev,
                         const char *idstr,
A
aliguori 已提交
430 431
                         int instance_id,
                         int version_id,
432
                         SaveVMHandlers *ops,
A
aliguori 已提交
433 434
                         void *opaque)
{
435
    SaveStateEntry *se;
A
aliguori 已提交
436

437
    se = g_malloc0(sizeof(SaveStateEntry));
A
aliguori 已提交
438
    se->version_id = version_id;
J
Juan Quintela 已提交
439
    se->section_id = savevm_state.global_section_id++;
440
    se->ops = ops;
A
aliguori 已提交
441
    se->opaque = opaque;
442
    se->vmsd = NULL;
443
    /* if this is a live_savem then set is_ram */
444
    if (ops->save_live_setup != NULL) {
445 446
        se->is_ram = 1;
    }
A
aliguori 已提交
447

448 449
    if (dev) {
        char *id = qdev_get_dev_path(dev);
450 451 452
        if (id) {
            pstrcpy(se->idstr, sizeof(se->idstr), id);
            pstrcat(se->idstr, sizeof(se->idstr), "/");
453
            g_free(id);
454

455
            se->compat = g_malloc0(sizeof(CompatEntry));
456 457 458 459 460 461 462 463
            pstrcpy(se->compat->idstr, sizeof(se->compat->idstr), idstr);
            se->compat->instance_id = instance_id == -1 ?
                         calculate_compat_instance_id(idstr) : instance_id;
            instance_id = -1;
        }
    }
    pstrcat(se->idstr, sizeof(se->idstr), idstr);

464
    if (instance_id == -1) {
465
        se->instance_id = calculate_new_instance_id(se->idstr);
466 467
    } else {
        se->instance_id = instance_id;
A
aliguori 已提交
468
    }
469
    assert(!se->compat || se->instance_id == 0);
470
    /* add at the end of list */
J
Juan Quintela 已提交
471
    QTAILQ_INSERT_TAIL(&savevm_state.handlers, se, entry);
A
aliguori 已提交
472 473 474
    return 0;
}

A
Alex Williamson 已提交
475 476
int register_savevm(DeviceState *dev,
                    const char *idstr,
A
aliguori 已提交
477 478 479 480 481 482
                    int instance_id,
                    int version_id,
                    SaveStateHandler *save_state,
                    LoadStateHandler *load_state,
                    void *opaque)
{
483 484 485
    SaveVMHandlers *ops = g_malloc0(sizeof(SaveVMHandlers));
    ops->save_state = save_state;
    ops->load_state = load_state;
A
Alex Williamson 已提交
486
    return register_savevm_live(dev, idstr, instance_id, version_id,
487
                                ops, opaque);
A
aliguori 已提交
488 489
}

A
Alex Williamson 已提交
490
void unregister_savevm(DeviceState *dev, const char *idstr, void *opaque)
491
{
492
    SaveStateEntry *se, *new_se;
493 494
    char id[256] = "";

495 496
    if (dev) {
        char *path = qdev_get_dev_path(dev);
497 498 499
        if (path) {
            pstrcpy(id, sizeof(id), path);
            pstrcat(id, sizeof(id), "/");
500
            g_free(path);
501 502 503
        }
    }
    pstrcat(id, sizeof(id), idstr);
504

J
Juan Quintela 已提交
505
    QTAILQ_FOREACH_SAFE(se, &savevm_state.handlers, entry, new_se) {
506
        if (strcmp(se->idstr, id) == 0 && se->opaque == opaque) {
J
Juan Quintela 已提交
507
            QTAILQ_REMOVE(&savevm_state.handlers, se, entry);
508
            if (se->compat) {
509
                g_free(se->compat);
510
            }
511
            g_free(se->ops);
512
            g_free(se);
513 514 515 516
        }
    }
}

A
Alex Williamson 已提交
517
int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
J
Jan Kiszka 已提交
518 519 520
                                   const VMStateDescription *vmsd,
                                   void *opaque, int alias_id,
                                   int required_for_version)
521
{
522
    SaveStateEntry *se;
523

J
Jan Kiszka 已提交
524 525 526
    /* If this triggers, alias support can be dropped for the vmsd. */
    assert(alias_id == -1 || required_for_version >= vmsd->minimum_version_id);

527
    se = g_malloc0(sizeof(SaveStateEntry));
528
    se->version_id = vmsd->version_id;
J
Juan Quintela 已提交
529
    se->section_id = savevm_state.global_section_id++;
530 531
    se->opaque = opaque;
    se->vmsd = vmsd;
J
Jan Kiszka 已提交
532
    se->alias_id = alias_id;
533

534 535
    if (dev) {
        char *id = qdev_get_dev_path(dev);
536 537 538
        if (id) {
            pstrcpy(se->idstr, sizeof(se->idstr), id);
            pstrcat(se->idstr, sizeof(se->idstr), "/");
539
            g_free(id);
540

541
            se->compat = g_malloc0(sizeof(CompatEntry));
542 543 544 545 546 547 548 549
            pstrcpy(se->compat->idstr, sizeof(se->compat->idstr), vmsd->name);
            se->compat->instance_id = instance_id == -1 ?
                         calculate_compat_instance_id(vmsd->name) : instance_id;
            instance_id = -1;
        }
    }
    pstrcat(se->idstr, sizeof(se->idstr), vmsd->name);

550
    if (instance_id == -1) {
551
        se->instance_id = calculate_new_instance_id(se->idstr);
552 553
    } else {
        se->instance_id = instance_id;
554
    }
555
    assert(!se->compat || se->instance_id == 0);
556
    /* add at the end of list */
J
Juan Quintela 已提交
557
    QTAILQ_INSERT_TAIL(&savevm_state.handlers, se, entry);
558 559 560
    return 0;
}

A
Alex Williamson 已提交
561 562
void vmstate_unregister(DeviceState *dev, const VMStateDescription *vmsd,
                        void *opaque)
563
{
564 565
    SaveStateEntry *se, *new_se;

J
Juan Quintela 已提交
566
    QTAILQ_FOREACH_SAFE(se, &savevm_state.handlers, entry, new_se) {
567
        if (se->vmsd == vmsd && se->opaque == opaque) {
J
Juan Quintela 已提交
568
            QTAILQ_REMOVE(&savevm_state.handlers, se, entry);
569
            if (se->compat) {
570
                g_free(se->compat);
571
            }
572
            g_free(se);
573 574
        }
    }
575 576
}

577 578
static int vmstate_load(QEMUFile *f, SaveStateEntry *se, int version_id)
{
579
    trace_vmstate_load(se->idstr, se->vmsd ? se->vmsd->name : "(old)");
580
    if (!se->vmsd) {         /* Old style */
581
        return se->ops->load_state(f, se->opaque, version_id);
582 583
    }
    return vmstate_load_state(f, se->vmsd, se->opaque, version_id);
584 585
}

586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606
static void vmstate_save_old_style(QEMUFile *f, SaveStateEntry *se, QJSON *vmdesc)
{
    int64_t old_offset, size;

    old_offset = qemu_ftell_fast(f);
    se->ops->save_state(f, se->opaque);
    size = qemu_ftell_fast(f) - old_offset;

    if (vmdesc) {
        json_prop_int(vmdesc, "size", size);
        json_start_array(vmdesc, "fields");
        json_start_object(vmdesc, NULL);
        json_prop_str(vmdesc, "name", "data");
        json_prop_int(vmdesc, "size", size);
        json_prop_str(vmdesc, "type", "buffer");
        json_end_object(vmdesc);
        json_end_array(vmdesc);
    }
}

static void vmstate_save(QEMUFile *f, SaveStateEntry *se, QJSON *vmdesc)
607
{
608
    trace_vmstate_save(se->idstr, se->vmsd ? se->vmsd->name : "(old)");
609 610
    if (!se->vmsd) {
        vmstate_save_old_style(f, se, vmdesc);
A
Alex Williamson 已提交
611
        return;
612
    }
613
    vmstate_save_state(f, se->vmsd, se->opaque, vmdesc);
614 615
}

616 617 618 619 620
void savevm_skip_section_footers(void)
{
    skip_section_footers = true;
}

621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641
/*
 * Write the header for device section (QEMU_VM_SECTION START/END/PART/FULL)
 */
static void save_section_header(QEMUFile *f, SaveStateEntry *se,
                                uint8_t section_type)
{
    qemu_put_byte(f, section_type);
    qemu_put_be32(f, se->section_id);

    if (section_type == QEMU_VM_SECTION_FULL ||
        section_type == QEMU_VM_SECTION_START) {
        /* ID string */
        size_t len = strlen(se->idstr);
        qemu_put_byte(f, len);
        qemu_put_buffer(f, (uint8_t *)se->idstr, len);

        qemu_put_be32(f, se->instance_id);
        qemu_put_be32(f, se->version_id);
    }
}

642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688
/*
 * Write a footer onto device sections that catches cases misformatted device
 * sections.
 */
static void save_section_footer(QEMUFile *f, SaveStateEntry *se)
{
    if (!skip_section_footers) {
        qemu_put_byte(f, QEMU_VM_SECTION_FOOTER);
        qemu_put_be32(f, se->section_id);
    }
}

/*
 * Read a footer off the wire and check that it matches the expected section
 *
 * Returns: true if the footer was good
 *          false if there is a problem (and calls error_report to say why)
 */
static bool check_section_footer(QEMUFile *f, SaveStateEntry *se)
{
    uint8_t read_mark;
    uint32_t read_section_id;

    if (skip_section_footers) {
        /* No footer to check */
        return true;
    }

    read_mark = qemu_get_byte(f);

    if (read_mark != QEMU_VM_SECTION_FOOTER) {
        error_report("Missing section footer for %s", se->idstr);
        return false;
    }

    read_section_id = qemu_get_be32(f);
    if (read_section_id != se->section_id) {
        error_report("Mismatched section id in footer for %s -"
                     " read 0x%x expected 0x%x",
                     se->idstr, read_section_id, se->section_id);
        return false;
    }

    /* All good */
    return true;
}

L
Luiz Capitulino 已提交
689
bool qemu_savevm_state_blocked(Error **errp)
A
Alex Williamson 已提交
690 691 692
{
    SaveStateEntry *se;

J
Juan Quintela 已提交
693
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
694
        if (se->vmsd && se->vmsd->unmigratable) {
695 696
            error_setg(errp, "State blocked by non-migratable device '%s'",
                       se->idstr);
A
Alex Williamson 已提交
697 698 699 700 701 702
            return true;
        }
    }
    return false;
}

703 704 705 706 707 708 709
void qemu_savevm_state_header(QEMUFile *f)
{
    trace_savevm_state_header();
    qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
    qemu_put_be32(f, QEMU_VM_FILE_VERSION);
}

710 711
void qemu_savevm_state_begin(QEMUFile *f,
                             const MigrationParams *params)
A
aliguori 已提交
712 713
{
    SaveStateEntry *se;
J
Juan Quintela 已提交
714
    int ret;
A
aliguori 已提交
715

716
    trace_savevm_state_begin();
J
Juan Quintela 已提交
717
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
718
        if (!se->ops || !se->ops->set_params) {
L
lirans@il.ibm.com 已提交
719
            continue;
I
Isaku Yamahata 已提交
720
        }
721
        se->ops->set_params(params, se->opaque);
L
lirans@il.ibm.com 已提交
722
    }
E
Eduardo Habkost 已提交
723

J
Juan Quintela 已提交
724
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
725
        if (!se->ops || !se->ops->save_live_setup) {
A
aliguori 已提交
726
            continue;
727
        }
728 729 730 731 732
        if (se->ops && se->ops->is_active) {
            if (!se->ops->is_active(se->opaque)) {
                continue;
            }
        }
733
        save_section_header(f, se, QEMU_VM_SECTION_START);
A
aliguori 已提交
734

735
        ret = se->ops->save_live_setup(f, se->opaque);
736
        save_section_footer(f, se);
737
        if (ret < 0) {
738 739
            qemu_file_set_error(f, ret);
            break;
740
        }
A
aliguori 已提交
741 742 743
    }
}

J
Juan Quintela 已提交
744
/*
D
Dong Xu Wang 已提交
745
 * this function has three return values:
J
Juan Quintela 已提交
746 747 748 749
 *   negative: there was one error, and we have -errno.
 *   0 : We haven't finished, caller have to go again
 *   1 : We have finished, we can go to complete phase
 */
750
int qemu_savevm_state_iterate(QEMUFile *f)
A
aliguori 已提交
751 752 753 754
{
    SaveStateEntry *se;
    int ret = 1;

755
    trace_savevm_state_iterate();
J
Juan Quintela 已提交
756
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
757
        if (!se->ops || !se->ops->save_live_iterate) {
A
aliguori 已提交
758
            continue;
759
        }
760 761 762 763 764
        if (se->ops && se->ops->is_active) {
            if (!se->ops->is_active(se->opaque)) {
                continue;
            }
        }
765 766 767
        if (qemu_file_rate_limit(f)) {
            return 0;
        }
768
        trace_savevm_section_start(se->idstr, se->section_id);
769 770

        save_section_header(f, se, QEMU_VM_SECTION_PART);
A
aliguori 已提交
771

772
        ret = se->ops->save_live_iterate(f, se->opaque);
773
        trace_savevm_section_end(se->idstr, se->section_id, ret);
774
        save_section_footer(f, se);
775

776 777 778
        if (ret < 0) {
            qemu_file_set_error(f, ret);
        }
779
        if (ret <= 0) {
780 781 782 783 784 785
            /* Do not proceed to the next vmstate before this one reported
               completion of the current stage. This serializes the migration
               and reduces the probability that a faster changing state is
               synchronized over and over again. */
            break;
        }
A
aliguori 已提交
786
    }
J
Juan Quintela 已提交
787
    return ret;
A
aliguori 已提交
788 789
}

790 791 792 793 794 795
static bool should_send_vmdesc(void)
{
    MachineState *machine = MACHINE(qdev_get_machine());
    return !machine->suppress_vmdesc;
}

796
void qemu_savevm_state_complete(QEMUFile *f)
A
aliguori 已提交
797
{
798 799
    QJSON *vmdesc;
    int vmdesc_len;
A
aliguori 已提交
800
    SaveStateEntry *se;
801
    int ret;
A
aliguori 已提交
802

803 804
    trace_savevm_state_complete();

805 806
    cpu_synchronize_all_states();

J
Juan Quintela 已提交
807
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
808
        if (!se->ops || !se->ops->save_live_complete) {
A
aliguori 已提交
809
            continue;
810
        }
811 812 813 814 815
        if (se->ops && se->ops->is_active) {
            if (!se->ops->is_active(se->opaque)) {
                continue;
            }
        }
816
        trace_savevm_section_start(se->idstr, se->section_id);
817 818

        save_section_header(f, se, QEMU_VM_SECTION_END);
A
aliguori 已提交
819

820
        ret = se->ops->save_live_complete(f, se->opaque);
821
        trace_savevm_section_end(se->idstr, se->section_id, ret);
822
        save_section_footer(f, se);
823
        if (ret < 0) {
824 825
            qemu_file_set_error(f, ret);
            return;
826
        }
A
aliguori 已提交
827 828
    }

829 830 831
    vmdesc = qjson_new();
    json_prop_int(vmdesc, "page_size", TARGET_PAGE_SIZE);
    json_start_array(vmdesc, "devices");
J
Juan Quintela 已提交
832
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
A
aliguori 已提交
833

834
        if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
835
            continue;
836
        }
837
        trace_savevm_section_start(se->idstr, se->section_id);
838 839 840 841 842

        json_start_object(vmdesc, NULL);
        json_prop_str(vmdesc, "name", se->idstr);
        json_prop_int(vmdesc, "instance_id", se->instance_id);

843
        save_section_header(f, se, QEMU_VM_SECTION_FULL);
A
aliguori 已提交
844

845 846 847
        vmstate_save(f, se, vmdesc);

        json_end_object(vmdesc);
848
        trace_savevm_section_end(se->idstr, se->section_id, 0);
849
        save_section_footer(f, se);
A
aliguori 已提交
850 851 852
    }

    qemu_put_byte(f, QEMU_VM_EOF);
853 854 855 856 857

    json_end_array(vmdesc);
    qjson_finish(vmdesc);
    vmdesc_len = strlen(qjson_get_str(vmdesc));

858 859 860 861 862
    if (should_send_vmdesc()) {
        qemu_put_byte(f, QEMU_VM_VMDESCRIPTION);
        qemu_put_be32(f, vmdesc_len);
        qemu_put_buffer(f, (uint8_t *)qjson_get_str(vmdesc), vmdesc_len);
    }
863 864
    object_unref(OBJECT(vmdesc));

865
    qemu_fflush(f);
A
aliguori 已提交
866 867
}

868 869 870 871 872
uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size)
{
    SaveStateEntry *se;
    uint64_t ret = 0;

J
Juan Quintela 已提交
873
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
874 875 876 877 878 879 880 881 882 883 884 885 886
        if (!se->ops || !se->ops->save_live_pending) {
            continue;
        }
        if (se->ops && se->ops->is_active) {
            if (!se->ops->is_active(se->opaque)) {
                continue;
            }
        }
        ret += se->ops->save_live_pending(f, se->opaque, max_size);
    }
    return ret;
}

887
void qemu_savevm_state_cancel(void)
888 889 890
{
    SaveStateEntry *se;

891
    trace_savevm_state_cancel();
J
Juan Quintela 已提交
892
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
893 894
        if (se->ops && se->ops->cancel) {
            se->ops->cancel(se->opaque);
895 896 897 898
        }
    }
}

899
static int qemu_savevm_state(QEMUFile *f, Error **errp)
A
aliguori 已提交
900 901
{
    int ret;
I
Isaku Yamahata 已提交
902 903 904 905
    MigrationParams params = {
        .blk = 0,
        .shared = 0
    };
A
aliguori 已提交
906

907
    if (qemu_savevm_state_blocked(errp)) {
908
        return -EINVAL;
A
Alex Williamson 已提交
909 910
    }

911
    qemu_mutex_unlock_iothread();
912
    qemu_savevm_state_header(f);
913
    qemu_savevm_state_begin(f, &params);
914 915
    qemu_mutex_lock_iothread();

916 917 918 919 920
    while (qemu_file_get_error(f) == 0) {
        if (qemu_savevm_state_iterate(f) > 0) {
            break;
        }
    }
A
aliguori 已提交
921

922
    ret = qemu_file_get_error(f);
J
Juan Quintela 已提交
923
    if (ret == 0) {
924
        qemu_savevm_state_complete(f);
925
        ret = qemu_file_get_error(f);
J
Juan Quintela 已提交
926
    }
927 928
    if (ret != 0) {
        qemu_savevm_state_cancel();
929
        error_setg_errno(errp, -ret, "Error while writing VM state");
930
    }
A
aliguori 已提交
931 932 933
    return ret;
}

934 935 936 937 938 939 940 941 942
static int qemu_save_device_state(QEMUFile *f)
{
    SaveStateEntry *se;

    qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
    qemu_put_be32(f, QEMU_VM_FILE_VERSION);

    cpu_synchronize_all_states();

J
Juan Quintela 已提交
943
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
944 945 946
        if (se->is_ram) {
            continue;
        }
947
        if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
948 949 950
            continue;
        }

951
        save_section_header(f, se, QEMU_VM_SECTION_FULL);
952

953
        vmstate_save(f, se, NULL);
954 955

        save_section_footer(f, se);
956 957 958 959 960 961 962
    }

    qemu_put_byte(f, QEMU_VM_EOF);

    return qemu_file_get_error(f);
}

A
aliguori 已提交
963 964 965 966
static SaveStateEntry *find_se(const char *idstr, int instance_id)
{
    SaveStateEntry *se;

J
Juan Quintela 已提交
967
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
A
aliguori 已提交
968
        if (!strcmp(se->idstr, idstr) &&
J
Jan Kiszka 已提交
969 970
            (instance_id == se->instance_id ||
             instance_id == se->alias_id))
A
aliguori 已提交
971
            return se;
972 973 974 975 976 977 978
        /* Migrating from an older version? */
        if (strstr(se->idstr, idstr) && se->compat) {
            if (!strcmp(se->compat->idstr, idstr) &&
                (instance_id == se->compat->instance_id ||
                 instance_id == se->alias_id))
                return se;
        }
A
aliguori 已提交
979 980 981 982
    }
    return NULL;
}

983
struct LoadStateEntry {
B
Blue Swirl 已提交
984
    QLIST_ENTRY(LoadStateEntry) entry;
A
aliguori 已提交
985 986 987
    SaveStateEntry *se;
    int section_id;
    int version_id;
988
};
A
aliguori 已提交
989

990
void loadvm_free_handlers(MigrationIncomingState *mis)
A
aliguori 已提交
991
{
992
    LoadStateEntry *le, *new_le;
993 994 995 996 997 998 999 1000 1001 1002

    QLIST_FOREACH_SAFE(le, &mis->loadvm_handlers, entry, new_le) {
        QLIST_REMOVE(le, entry);
        g_free(le);
    }
}

int qemu_loadvm_state(QEMUFile *f)
{
    MigrationIncomingState *mis = migration_incoming_get_current();
1003
    Error *local_err = NULL;
A
aliguori 已提交
1004 1005 1006
    uint8_t section_type;
    unsigned int v;
    int ret;
1007
    int file_error_after_eof = -1;
A
aliguori 已提交
1008

1009
    if (qemu_savevm_state_blocked(&local_err)) {
1010
        error_report_err(local_err);
A
Alex Williamson 已提交
1011 1012 1013
        return -EINVAL;
    }

A
aliguori 已提交
1014
    v = qemu_get_be32(f);
E
Eduardo Habkost 已提交
1015
    if (v != QEMU_VM_FILE_MAGIC) {
1016
        error_report("Not a migration stream");
A
aliguori 已提交
1017
        return -EINVAL;
E
Eduardo Habkost 已提交
1018
    }
A
aliguori 已提交
1019 1020

    v = qemu_get_be32(f);
J
Juan Quintela 已提交
1021
    if (v == QEMU_VM_FILE_VERSION_COMPAT) {
1022
        error_report("SaveVM v2 format is obsolete and don't work anymore");
J
Juan Quintela 已提交
1023 1024
        return -ENOTSUP;
    }
E
Eduardo Habkost 已提交
1025
    if (v != QEMU_VM_FILE_VERSION) {
1026
        error_report("Unsupported migration stream version");
A
aliguori 已提交
1027
        return -ENOTSUP;
E
Eduardo Habkost 已提交
1028
    }
A
aliguori 已提交
1029 1030 1031 1032

    while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) {
        uint32_t instance_id, version_id, section_id;
        SaveStateEntry *se;
1033
        LoadStateEntry *le;
1034
        char idstr[256];
A
aliguori 已提交
1035

1036
        trace_qemu_loadvm_state_section(section_type);
A
aliguori 已提交
1037 1038 1039 1040 1041
        switch (section_type) {
        case QEMU_VM_SECTION_START:
        case QEMU_VM_SECTION_FULL:
            /* Read section start */
            section_id = qemu_get_be32(f);
1042 1043 1044 1045 1046
            if (!qemu_get_counted_string(f, idstr)) {
                error_report("Unable to read ID string for section %u",
                            section_id);
                return -EINVAL;
            }
A
aliguori 已提交
1047 1048 1049
            instance_id = qemu_get_be32(f);
            version_id = qemu_get_be32(f);

1050 1051
            trace_qemu_loadvm_state_section_startfull(section_id, idstr,
                                                      instance_id, version_id);
A
aliguori 已提交
1052 1053 1054
            /* Find savevm section */
            se = find_se(idstr, instance_id);
            if (se == NULL) {
1055 1056
                error_report("Unknown savevm section or instance '%s' %d",
                             idstr, instance_id);
A
aliguori 已提交
1057 1058 1059 1060 1061 1062
                ret = -EINVAL;
                goto out;
            }

            /* Validate version */
            if (version_id > se->version_id) {
1063 1064
                error_report("savevm: unsupported version %d for '%s' v%d",
                             version_id, idstr, se->version_id);
A
aliguori 已提交
1065 1066 1067 1068 1069
                ret = -EINVAL;
                goto out;
            }

            /* Add entry */
1070
            le = g_malloc0(sizeof(*le));
A
aliguori 已提交
1071 1072 1073 1074

            le->se = se;
            le->section_id = section_id;
            le->version_id = version_id;
1075
            QLIST_INSERT_HEAD(&mis->loadvm_handlers, le, entry);
A
aliguori 已提交
1076

1077
            ret = vmstate_load(f, le->se, le->version_id);
1078
            if (ret < 0) {
1079 1080
                error_report("error while loading state for instance 0x%x of"
                             " device '%s'", instance_id, idstr);
1081 1082
                goto out;
            }
1083 1084 1085 1086
            if (!check_section_footer(f, le->se)) {
                ret = -EINVAL;
                goto out;
            }
A
aliguori 已提交
1087 1088 1089 1090 1091
            break;
        case QEMU_VM_SECTION_PART:
        case QEMU_VM_SECTION_END:
            section_id = qemu_get_be32(f);

1092
            trace_qemu_loadvm_state_section_partend(section_id);
1093
            QLIST_FOREACH(le, &mis->loadvm_handlers, entry) {
1094 1095 1096 1097
                if (le->section_id == section_id) {
                    break;
                }
            }
A
aliguori 已提交
1098
            if (le == NULL) {
1099
                error_report("Unknown savevm section %d", section_id);
A
aliguori 已提交
1100 1101 1102 1103
                ret = -EINVAL;
                goto out;
            }

1104
            ret = vmstate_load(f, le->se, le->version_id);
1105
            if (ret < 0) {
1106 1107
                error_report("error while loading state section id %d(%s)",
                             section_id, le->se->idstr);
1108 1109
                goto out;
            }
1110 1111 1112 1113
            if (!check_section_footer(f, le->se)) {
                ret = -EINVAL;
                goto out;
            }
A
aliguori 已提交
1114 1115
            break;
        default:
1116
            error_report("Unknown savevm section type %d", section_type);
A
aliguori 已提交
1117 1118 1119 1120 1121
            ret = -EINVAL;
            goto out;
        }
    }

1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139
    file_error_after_eof = qemu_file_get_error(f);

    /*
     * Try to read in the VMDESC section as well, so that dumping tools that
     * intercept our migration stream have the chance to see it.
     */
    if (qemu_get_byte(f) == QEMU_VM_VMDESCRIPTION) {
        uint32_t size = qemu_get_be32(f);
        uint8_t *buf = g_malloc(0x1000);

        while (size > 0) {
            uint32_t read_chunk = MIN(size, 0x1000);
            qemu_get_buffer(f, buf, read_chunk);
            size -= read_chunk;
        }
        g_free(buf);
    }

1140 1141
    cpu_synchronize_all_post_init();

A
aliguori 已提交
1142 1143 1144
    ret = 0;

out:
1145
    if (ret == 0) {
1146 1147
        /* We may not have a VMDESC section, so ignore relative errors */
        ret = file_error_after_eof;
1148
    }
A
aliguori 已提交
1149 1150 1151 1152

    return ret;
}

1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163
static BlockDriverState *find_vmstate_bs(void)
{
    BlockDriverState *bs = NULL;
    while ((bs = bdrv_next(bs))) {
        if (bdrv_can_snapshot(bs)) {
            return bs;
        }
    }
    return NULL;
}

1164 1165 1166 1167 1168 1169 1170
/*
 * Deletes snapshots of a given name in all opened images.
 */
static int del_existing_snapshots(Monitor *mon, const char *name)
{
    BlockDriverState *bs;
    QEMUSnapshotInfo sn1, *snapshot = &sn1;
1171
    Error *err = NULL;
1172

1173 1174
    bs = NULL;
    while ((bs = bdrv_next(bs))) {
1175
        if (bdrv_can_snapshot(bs) &&
E
Eduardo Habkost 已提交
1176
            bdrv_snapshot_find(bs, snapshot, name) >= 0) {
1177
            bdrv_snapshot_delete_by_id_or_name(bs, name, &err);
1178
            if (err) {
1179
                monitor_printf(mon,
1180 1181 1182 1183 1184
                               "Error while deleting snapshot on device '%s':"
                               " %s\n",
                               bdrv_get_device_name(bs),
                               error_get_pretty(err));
                error_free(err);
1185 1186 1187 1188 1189 1190 1191 1192
                return -1;
            }
        }
    }

    return 0;
}

1193
void hmp_savevm(Monitor *mon, const QDict *qdict)
A
aliguori 已提交
1194 1195 1196
{
    BlockDriverState *bs, *bs1;
    QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
1197
    int ret;
A
aliguori 已提交
1198 1199
    QEMUFile *f;
    int saved_vm_running;
K
Kevin Wolf 已提交
1200
    uint64_t vm_state_size;
1201
    qemu_timeval tv;
1202
    struct tm tm;
1203
    const char *name = qdict_get_try_str(qdict, "name");
1204
    Error *local_err = NULL;
A
aliguori 已提交
1205

1206
    /* Verify if there is a device that doesn't support snapshots and is writable */
1207 1208
    bs = NULL;
    while ((bs = bdrv_next(bs))) {
1209

1210
        if (!bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
1211 1212 1213 1214 1215 1216 1217 1218 1219 1220
            continue;
        }

        if (!bdrv_can_snapshot(bs)) {
            monitor_printf(mon, "Device '%s' is writable but does not support snapshots.\n",
                               bdrv_get_device_name(bs));
            return;
        }
    }

1221
    bs = find_vmstate_bs();
A
aliguori 已提交
1222
    if (!bs) {
A
aliguori 已提交
1223
        monitor_printf(mon, "No block device can accept snapshots\n");
A
aliguori 已提交
1224 1225 1226
        return;
    }

1227
    saved_vm_running = runstate_is_running();
1228
    vm_stop(RUN_STATE_SAVE_VM);
A
aliguori 已提交
1229

1230
    memset(sn, 0, sizeof(*sn));
A
aliguori 已提交
1231 1232

    /* fill auxiliary fields */
1233
    qemu_gettimeofday(&tv);
A
aliguori 已提交
1234 1235
    sn->date_sec = tv.tv_sec;
    sn->date_nsec = tv.tv_usec * 1000;
1236
    sn->vm_clock_nsec = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
A
aliguori 已提交
1237

1238 1239 1240 1241 1242 1243 1244 1245 1246
    if (name) {
        ret = bdrv_snapshot_find(bs, old_sn, name);
        if (ret >= 0) {
            pstrcpy(sn->name, sizeof(sn->name), old_sn->name);
            pstrcpy(sn->id_str, sizeof(sn->id_str), old_sn->id_str);
        } else {
            pstrcpy(sn->name, sizeof(sn->name), name);
        }
    } else {
B
Blue Swirl 已提交
1247 1248
        /* cast below needed for OpenBSD where tv_sec is still 'long' */
        localtime_r((const time_t *)&tv.tv_sec, &tm);
1249 1250 1251
        strftime(sn->name, sizeof(sn->name), "vm-%Y%m%d%H%M%S", &tm);
    }

1252
    /* Delete old snapshots of the same name */
1253
    if (name && del_existing_snapshots(mon, name) < 0) {
1254 1255 1256
        goto the_end;
    }

A
aliguori 已提交
1257
    /* save the VM state */
1258
    f = qemu_fopen_bdrv(bs, 1);
A
aliguori 已提交
1259
    if (!f) {
A
aliguori 已提交
1260
        monitor_printf(mon, "Could not open VM state file\n");
A
aliguori 已提交
1261 1262
        goto the_end;
    }
1263
    ret = qemu_savevm_state(f, &local_err);
1264
    vm_state_size = qemu_ftell(f);
A
aliguori 已提交
1265 1266
    qemu_fclose(f);
    if (ret < 0) {
1267 1268
        monitor_printf(mon, "%s\n", error_get_pretty(local_err));
        error_free(local_err);
A
aliguori 已提交
1269 1270 1271 1272 1273
        goto the_end;
    }

    /* create the snapshots */

1274 1275
    bs1 = NULL;
    while ((bs1 = bdrv_next(bs1))) {
1276
        if (bdrv_can_snapshot(bs1)) {
1277 1278
            /* Write VM state size only to the image that contains the state */
            sn->vm_state_size = (bs == bs1 ? vm_state_size : 0);
A
aliguori 已提交
1279 1280
            ret = bdrv_snapshot_create(bs1, sn);
            if (ret < 0) {
A
aliguori 已提交
1281 1282
                monitor_printf(mon, "Error while creating snapshot on '%s'\n",
                               bdrv_get_device_name(bs1));
A
aliguori 已提交
1283 1284 1285 1286 1287
            }
        }
    }

 the_end:
E
Eduardo Habkost 已提交
1288
    if (saved_vm_running) {
A
aliguori 已提交
1289
        vm_start();
E
Eduardo Habkost 已提交
1290
    }
A
aliguori 已提交
1291 1292
}

1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303
void qmp_xen_save_devices_state(const char *filename, Error **errp)
{
    QEMUFile *f;
    int saved_vm_running;
    int ret;

    saved_vm_running = runstate_is_running();
    vm_stop(RUN_STATE_SAVE_VM);

    f = qemu_fopen(filename, "wb");
    if (!f) {
1304
        error_setg_file_open(errp, errno, filename);
1305 1306 1307 1308 1309 1310 1311 1312 1313
        goto the_end;
    }
    ret = qemu_save_device_state(f);
    qemu_fclose(f);
    if (ret < 0) {
        error_set(errp, QERR_IO_ERROR);
    }

 the_end:
E
Eduardo Habkost 已提交
1314
    if (saved_vm_running) {
1315
        vm_start();
E
Eduardo Habkost 已提交
1316
    }
1317 1318
}

1319
int load_vmstate(const char *name)
A
aliguori 已提交
1320
{
1321
    BlockDriverState *bs, *bs_vm_state;
1322
    QEMUSnapshotInfo sn;
A
aliguori 已提交
1323
    QEMUFile *f;
G
Gerd Hoffmann 已提交
1324
    int ret;
A
aliguori 已提交
1325

1326
    bs_vm_state = find_vmstate_bs();
1327 1328 1329 1330 1331 1332 1333 1334 1335 1336
    if (!bs_vm_state) {
        error_report("No block device supports snapshots");
        return -ENOTSUP;
    }

    /* Don't even try to load empty VM states */
    ret = bdrv_snapshot_find(bs_vm_state, &sn, name);
    if (ret < 0) {
        return ret;
    } else if (sn.vm_state_size == 0) {
1337 1338
        error_report("This is a disk-only snapshot. Revert to it offline "
            "using qemu-img.");
1339 1340 1341 1342 1343
        return -EINVAL;
    }

    /* Verify if there is any device that doesn't support snapshots and is
    writable and check if the requested snapshot is available too. */
1344 1345
    bs = NULL;
    while ((bs = bdrv_next(bs))) {
1346

1347
        if (!bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
1348 1349 1350 1351 1352 1353 1354 1355 1356
            continue;
        }

        if (!bdrv_can_snapshot(bs)) {
            error_report("Device '%s' is writable but does not support snapshots.",
                               bdrv_get_device_name(bs));
            return -ENOTSUP;
        }

1357 1358 1359 1360 1361 1362
        ret = bdrv_snapshot_find(bs, &sn, name);
        if (ret < 0) {
            error_report("Device '%s' does not have the requested snapshot '%s'",
                           bdrv_get_device_name(bs), name);
            return ret;
        }
A
aliguori 已提交
1363 1364 1365
    }

    /* Flush all IO requests so they don't interfere with the new state.  */
1366
    bdrv_drain_all();
A
aliguori 已提交
1367

1368 1369 1370 1371
    bs = NULL;
    while ((bs = bdrv_next(bs))) {
        if (bdrv_can_snapshot(bs)) {
            ret = bdrv_snapshot_goto(bs, name);
A
aliguori 已提交
1372
            if (ret < 0) {
1373 1374 1375
                error_report("Error %d while activating snapshot '%s' on '%s'",
                             ret, name, bdrv_get_device_name(bs));
                return ret;
A
aliguori 已提交
1376 1377 1378 1379 1380
            }
        }
    }

    /* restore the VM state */
1381
    f = qemu_fopen_bdrv(bs_vm_state, 0);
A
aliguori 已提交
1382
    if (!f) {
1383
        error_report("Could not open VM state file");
1384
        return -EINVAL;
A
aliguori 已提交
1385
    }
1386

J
Jan Kiszka 已提交
1387
    qemu_system_reset(VMRESET_SILENT);
1388
    migration_incoming_state_new(f);
A
aliguori 已提交
1389
    ret = qemu_loadvm_state(f);
1390

A
aliguori 已提交
1391
    qemu_fclose(f);
1392
    migration_incoming_state_destroy();
A
aliguori 已提交
1393
    if (ret < 0) {
1394
        error_report("Error %d while loading VM state", ret);
1395
        return ret;
A
aliguori 已提交
1396
    }
1397

1398
    return 0;
1399 1400
}

1401
void hmp_delvm(Monitor *mon, const QDict *qdict)
A
aliguori 已提交
1402
{
1403
    BlockDriverState *bs;
1404
    Error *err;
1405
    const char *name = qdict_get_str(qdict, "name");
A
aliguori 已提交
1406

1407
    if (!find_vmstate_bs()) {
A
aliguori 已提交
1408
        monitor_printf(mon, "No block device supports snapshots\n");
A
aliguori 已提交
1409 1410 1411
        return;
    }

1412 1413 1414
    bs = NULL;
    while ((bs = bdrv_next(bs))) {
        if (bdrv_can_snapshot(bs)) {
1415
            err = NULL;
1416
            bdrv_snapshot_delete_by_id_or_name(bs, name, &err);
1417
            if (err) {
1418 1419 1420 1421 1422 1423
                monitor_printf(mon,
                               "Error while deleting snapshot on device '%s':"
                               " %s\n",
                               bdrv_get_device_name(bs),
                               error_get_pretty(err));
                error_free(err);
A
aliguori 已提交
1424 1425 1426 1427 1428
            }
        }
    }
}

1429
void hmp_info_snapshots(Monitor *mon, const QDict *qdict)
A
aliguori 已提交
1430 1431
{
    BlockDriverState *bs, *bs1;
1432 1433 1434 1435
    QEMUSnapshotInfo *sn_tab, *sn, s, *sn_info = &s;
    int nb_sns, i, ret, available;
    int total;
    int *available_snapshots;
A
aliguori 已提交
1436

1437
    bs = find_vmstate_bs();
A
aliguori 已提交
1438
    if (!bs) {
A
aliguori 已提交
1439
        monitor_printf(mon, "No available block device supports snapshots\n");
A
aliguori 已提交
1440 1441 1442 1443 1444
        return;
    }

    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
    if (nb_sns < 0) {
A
aliguori 已提交
1445
        monitor_printf(mon, "bdrv_snapshot_list: error %d\n", nb_sns);
A
aliguori 已提交
1446 1447
        return;
    }
1448 1449 1450 1451 1452 1453

    if (nb_sns == 0) {
        monitor_printf(mon, "There is no snapshot available.\n");
        return;
    }

1454
    available_snapshots = g_malloc0(sizeof(int) * nb_sns);
1455 1456
    total = 0;
    for (i = 0; i < nb_sns; i++) {
A
aliguori 已提交
1457
        sn = &sn_tab[i];
1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474
        available = 1;
        bs1 = NULL;

        while ((bs1 = bdrv_next(bs1))) {
            if (bdrv_can_snapshot(bs1) && bs1 != bs) {
                ret = bdrv_snapshot_find(bs1, sn_info, sn->id_str);
                if (ret < 0) {
                    available = 0;
                    break;
                }
            }
        }

        if (available) {
            available_snapshots[total] = i;
            total++;
        }
A
aliguori 已提交
1475
    }
1476 1477

    if (total > 0) {
1478 1479
        bdrv_snapshot_dump((fprintf_function)monitor_printf, mon, NULL);
        monitor_printf(mon, "\n");
1480 1481
        for (i = 0; i < total; i++) {
            sn = &sn_tab[available_snapshots[i]];
1482 1483
            bdrv_snapshot_dump((fprintf_function)monitor_printf, mon, sn);
            monitor_printf(mon, "\n");
1484 1485 1486 1487 1488
        }
    } else {
        monitor_printf(mon, "There is no suitable snapshot available\n");
    }

1489 1490
    g_free(sn_tab);
    g_free(available_snapshots);
1491

A
aliguori 已提交
1492
}
1493 1494 1495

void vmstate_register_ram(MemoryRegion *mr, DeviceState *dev)
{
1496
    qemu_ram_set_idstr(memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK,
1497 1498 1499 1500 1501
                       memory_region_name(mr), dev);
}

void vmstate_unregister_ram(MemoryRegion *mr, DeviceState *dev)
{
1502
    qemu_ram_unset_idstr(memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK);
1503 1504 1505 1506 1507 1508
}

void vmstate_register_ram_global(MemoryRegion *mr)
{
    vmstate_register_ram(mr, NULL);
}