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
#include "qapi/qmp/qerror.h"
41
#include "qemu/error-report.h"
42 43
#include "qemu/sockets.h"
#include "qemu/queue.h"
44
#include "sysemu/cpus.h"
45
#include "exec/memory.h"
46
#include "qmp-commands.h"
47
#include "trace.h"
48
#include "qemu/iov.h"
49
#include "block/snapshot.h"
50
#include "block/qapi.h"
51

A
aliguori 已提交
52

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

60 61
static bool skip_section_footers;

N
Nolan 已提交
62
static int announce_self_create(uint8_t *buf,
63
                                uint8_t *mac_addr)
A
aliguori 已提交
64
{
N
Nolan 已提交
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
    /* 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 已提交
85 86
}

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

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

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


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

M
Mark McLoughlin 已提交
104 105
    qemu_foreach_nic(qemu_announce_self_iter, NULL);

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

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

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

126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
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;
}

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

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

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

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

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

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

177

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

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

186
    expire_time = timer_expire_time_ns(ts);
187 188 189
    qemu_put_be64(f, expire_time);
}

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

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


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

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

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

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

226

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

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

J
Juan Quintela 已提交
246 247 248 249 250 251 252 253 254
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 已提交
255

256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278
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,
279
                              const VMStateDescription **subsection,
280 281
                              int indent)
{
282 283
    if (*subsection != NULL) {
        dump_vmstate_vmsd(out_file, *subsection, indent, true);
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 322 323
    }
}

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) {
324
        const VMStateDescription **subsection = vmsd->subsections;
325 326 327 328
        bool first;

        fprintf(out_file, ",\n%*s\"Subsections\": [\n", indent, "");
        first = true;
329
        while (*subsection != NULL) {
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 392 393
            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);
}

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

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

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

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

        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 已提交
426 427 428 429
/* 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 已提交
430 431
int register_savevm_live(DeviceState *dev,
                         const char *idstr,
A
aliguori 已提交
432 433
                         int instance_id,
                         int version_id,
434
                         SaveVMHandlers *ops,
A
aliguori 已提交
435 436
                         void *opaque)
{
437
    SaveStateEntry *se;
A
aliguori 已提交
438

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

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

457
            se->compat = g_malloc0(sizeof(CompatEntry));
458 459 460 461 462 463 464 465
            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);

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

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

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

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

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

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

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

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

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

543
            se->compat = g_malloc0(sizeof(CompatEntry));
544 545 546 547 548 549 550 551
            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);

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

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

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

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

588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608
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)
609
{
610
    trace_vmstate_save(se->idstr, se->vmsd ? se->vmsd->name : "(old)");
611 612
    if (!se->vmsd) {
        vmstate_save_old_style(f, se, vmdesc);
A
Alex Williamson 已提交
613
        return;
614
    }
615
    vmstate_save_state(f, se->vmsd, se->opaque, vmdesc);
616 617
}

618 619 620 621 622
void savevm_skip_section_footers(void)
{
    skip_section_footers = true;
}

623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643
/*
 * 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);
    }
}

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 689 690
/*
 * 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 已提交
691
bool qemu_savevm_state_blocked(Error **errp)
A
Alex Williamson 已提交
692 693 694
{
    SaveStateEntry *se;

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

705 706 707 708 709 710 711
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);
}

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

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

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

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

J
Juan Quintela 已提交
746
/*
D
Dong Xu Wang 已提交
747
 * this function has three return values:
J
Juan Quintela 已提交
748 749 750 751
 *   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
 */
752
int qemu_savevm_state_iterate(QEMUFile *f)
A
aliguori 已提交
753 754 755 756
{
    SaveStateEntry *se;
    int ret = 1;

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

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

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

778 779 780
        if (ret < 0) {
            qemu_file_set_error(f, ret);
        }
781
        if (ret <= 0) {
782 783 784 785 786 787
            /* 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 已提交
788
    }
J
Juan Quintela 已提交
789
    return ret;
A
aliguori 已提交
790 791
}

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

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

805 806
    trace_savevm_state_complete();

807 808
    cpu_synchronize_all_states();

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

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

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

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

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

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

845
        save_section_header(f, se, QEMU_VM_SECTION_FULL);
A
aliguori 已提交
846

847 848 849
        vmstate_save(f, se, vmdesc);

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

    qemu_put_byte(f, QEMU_VM_EOF);
855 856 857 858 859

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

860 861 862 863 864
    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);
    }
865 866
    object_unref(OBJECT(vmdesc));

867
    qemu_fflush(f);
A
aliguori 已提交
868 869
}

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

J
Juan Quintela 已提交
875
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
876 877 878 879 880 881 882 883 884 885 886 887 888
        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;
}

889
void qemu_savevm_state_cancel(void)
890 891 892
{
    SaveStateEntry *se;

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

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

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

913
    qemu_mutex_unlock_iothread();
914
    qemu_savevm_state_header(f);
915
    qemu_savevm_state_begin(f, &params);
916 917
    qemu_mutex_lock_iothread();

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

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

936 937 938 939 940 941 942 943 944
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 已提交
945
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
946 947 948
        if (se->is_ram) {
            continue;
        }
949
        if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
950 951 952
            continue;
        }

953
        save_section_header(f, se, QEMU_VM_SECTION_FULL);
954

955
        vmstate_save(f, se, NULL);
956 957

        save_section_footer(f, se);
958 959 960 961 962 963 964
    }

    qemu_put_byte(f, QEMU_VM_EOF);

    return qemu_file_get_error(f);
}

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

J
Juan Quintela 已提交
969
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
A
aliguori 已提交
970
        if (!strcmp(se->idstr, idstr) &&
J
Jan Kiszka 已提交
971 972
            (instance_id == se->instance_id ||
             instance_id == se->alias_id))
A
aliguori 已提交
973
            return se;
974 975 976 977 978 979 980
        /* 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 已提交
981 982 983 984
    }
    return NULL;
}

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

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

    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();
1005
    Error *local_err = NULL;
A
aliguori 已提交
1006 1007 1008
    uint8_t section_type;
    unsigned int v;
    int ret;
1009
    int file_error_after_eof = -1;
A
aliguori 已提交
1010

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

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

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

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

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

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

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

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

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

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

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

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

1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141
    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);
    }

1142 1143
    cpu_synchronize_all_post_init();

A
aliguori 已提交
1144 1145 1146
    ret = 0;

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

    return ret;
}

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

1166 1167 1168 1169 1170 1171 1172
/*
 * 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;
1173
    Error *err = NULL;
1174

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

    return 0;
}

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

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

1212
        if (!bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
1213 1214 1215 1216 1217 1218 1219 1220 1221 1222
            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;
        }
    }

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

1229
    saved_vm_running = runstate_is_running();
1230
    vm_stop(RUN_STATE_SAVE_VM);
A
aliguori 已提交
1231

1232
    memset(sn, 0, sizeof(*sn));
A
aliguori 已提交
1233 1234

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

1240 1241 1242 1243 1244 1245 1246 1247 1248
    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 已提交
1249 1250
        /* cast below needed for OpenBSD where tv_sec is still 'long' */
        localtime_r((const time_t *)&tv.tv_sec, &tm);
1251 1252 1253
        strftime(sn->name, sizeof(sn->name), "vm-%Y%m%d%H%M%S", &tm);
    }

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

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

    /* create the snapshots */

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

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

1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305
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) {
1306
        error_setg_file_open(errp, errno, filename);
1307 1308 1309 1310 1311
        goto the_end;
    }
    ret = qemu_save_device_state(f);
    qemu_fclose(f);
    if (ret < 0) {
1312
        error_setg(errp, QERR_IO_ERROR);
1313 1314 1315
    }

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

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

1328
    bs_vm_state = find_vmstate_bs();
1329 1330 1331 1332 1333 1334 1335 1336 1337 1338
    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) {
1339 1340
        error_report("This is a disk-only snapshot. Revert to it offline "
            "using qemu-img.");
1341 1342 1343 1344 1345
        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. */
1346 1347
    bs = NULL;
    while ((bs = bdrv_next(bs))) {
1348

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

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

1359 1360 1361 1362 1363 1364
        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 已提交
1365 1366 1367
    }

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

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

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

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

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

1400
    return 0;
1401 1402
}

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

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

1414 1415 1416
    bs = NULL;
    while ((bs = bdrv_next(bs))) {
        if (bdrv_can_snapshot(bs)) {
1417
            err = NULL;
1418
            bdrv_snapshot_delete_by_id_or_name(bs, name, &err);
1419
            if (err) {
1420 1421 1422 1423 1424 1425
                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 已提交
1426 1427 1428 1429 1430
            }
        }
    }
}

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

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

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

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

1456
    available_snapshots = g_malloc0(sizeof(int) * nb_sns);
1457 1458
    total = 0;
    for (i = 0; i < nb_sns; i++) {
A
aliguori 已提交
1459
        sn = &sn_tab[i];
1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476
        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 已提交
1477
    }
1478 1479

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

1491 1492
    g_free(sn_tab);
    g_free(available_snapshots);
1493

A
aliguori 已提交
1494
}
1495 1496 1497

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

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

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