savevm.c 44.7 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 142
static ssize_t block_put_buffer(void *opaque, const uint8_t *buf,
                                int64_t pos, size_t size)
A
aliguori 已提交
143
{
144
    bdrv_save_vmstate(opaque, buf, pos, size);
A
aliguori 已提交
145 146 147
    return size;
}

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

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

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

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

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

178

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

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

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

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

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


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

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

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

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

227

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

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

J
Juan Quintela 已提交
247 248 249
typedef struct SaveState {
    QTAILQ_HEAD(, SaveStateEntry) handlers;
    int global_section_id;
250 251 252
    bool skip_configuration;
    uint32_t len;
    const char *name;
J
Juan Quintela 已提交
253 254 255 256 257
} SaveState;

static SaveState savevm_state = {
    .handlers = QTAILQ_HEAD_INITIALIZER(savevm_state.handlers),
    .global_section_id = 0,
258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
    .skip_configuration = false,
};

void savevm_skip_configuration(void)
{
    savevm_state.skip_configuration = true;
}


static void configuration_pre_save(void *opaque)
{
    SaveState *state = opaque;
    const char *current_name = MACHINE_GET_CLASS(current_machine)->name;

    state->len = strlen(current_name);
    state->name = current_name;
}

static int configuration_post_load(void *opaque, int version_id)
{
    SaveState *state = opaque;
    const char *current_name = MACHINE_GET_CLASS(current_machine)->name;

    if (strncmp(state->name, current_name, state->len) != 0) {
        error_report("Machine type received is '%s' and local is '%s'",
                     state->name, current_name);
        return -EINVAL;
    }
    return 0;
}

static const VMStateDescription vmstate_configuration = {
    .name = "configuration",
    .version_id = 1,
    .post_load = configuration_post_load,
    .pre_save = configuration_pre_save,
    .fields = (VMStateField[]) {
        VMSTATE_UINT32(len, SaveState),
        VMSTATE_VBUFFER_ALLOC_UINT32(name, SaveState, 0, NULL, 0, len),
        VMSTATE_END_OF_LIST()
    },
J
Juan Quintela 已提交
299
};
A
aliguori 已提交
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);

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,
324
                              const VMStateDescription **subsection,
325 326
                              int indent)
{
327 328
    if (*subsection != NULL) {
        dump_vmstate_vmsd(out_file, *subsection, indent, true);
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
    }
}

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) {
369
        const VMStateDescription **subsection = vmsd->subsections;
370 371 372 373
        bool first;

        fprintf(out_file, ",\n%*s\"Subsections\": [\n", indent, "");
        first = true;
374
        while (*subsection != NULL) {
375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438
            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);
}

439 440 441 442 443
static int calculate_new_instance_id(const char *idstr)
{
    SaveStateEntry *se;
    int instance_id = 0;

J
Juan Quintela 已提交
444
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
445 446 447 448 449 450 451 452
        if (strcmp(idstr, se->idstr) == 0
            && instance_id <= se->instance_id) {
            instance_id = se->instance_id + 1;
        }
    }
    return instance_id;
}

453 454 455 456 457
static int calculate_compat_instance_id(const char *idstr)
{
    SaveStateEntry *se;
    int instance_id = 0;

J
Juan Quintela 已提交
458
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
E
Eduardo Habkost 已提交
459
        if (!se->compat) {
460
            continue;
E
Eduardo Habkost 已提交
461
        }
462 463 464 465 466 467 468 469 470

        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 已提交
471 472 473 474
/* 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 已提交
475 476
int register_savevm_live(DeviceState *dev,
                         const char *idstr,
A
aliguori 已提交
477 478
                         int instance_id,
                         int version_id,
479
                         SaveVMHandlers *ops,
A
aliguori 已提交
480 481
                         void *opaque)
{
482
    SaveStateEntry *se;
A
aliguori 已提交
483

484
    se = g_new0(SaveStateEntry, 1);
A
aliguori 已提交
485
    se->version_id = version_id;
J
Juan Quintela 已提交
486
    se->section_id = savevm_state.global_section_id++;
487
    se->ops = ops;
A
aliguori 已提交
488
    se->opaque = opaque;
489
    se->vmsd = NULL;
490
    /* if this is a live_savem then set is_ram */
491
    if (ops->save_live_setup != NULL) {
492 493
        se->is_ram = 1;
    }
A
aliguori 已提交
494

495 496
    if (dev) {
        char *id = qdev_get_dev_path(dev);
497 498 499
        if (id) {
            pstrcpy(se->idstr, sizeof(se->idstr), id);
            pstrcat(se->idstr, sizeof(se->idstr), "/");
500
            g_free(id);
501

502
            se->compat = g_new0(CompatEntry, 1);
503 504 505 506 507 508 509 510
            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);

511
    if (instance_id == -1) {
512
        se->instance_id = calculate_new_instance_id(se->idstr);
513 514
    } else {
        se->instance_id = instance_id;
A
aliguori 已提交
515
    }
516
    assert(!se->compat || se->instance_id == 0);
517
    /* add at the end of list */
J
Juan Quintela 已提交
518
    QTAILQ_INSERT_TAIL(&savevm_state.handlers, se, entry);
A
aliguori 已提交
519 520 521
    return 0;
}

A
Alex Williamson 已提交
522 523
int register_savevm(DeviceState *dev,
                    const char *idstr,
A
aliguori 已提交
524 525 526 527 528 529
                    int instance_id,
                    int version_id,
                    SaveStateHandler *save_state,
                    LoadStateHandler *load_state,
                    void *opaque)
{
530
    SaveVMHandlers *ops = g_new0(SaveVMHandlers, 1);
531 532
    ops->save_state = save_state;
    ops->load_state = load_state;
A
Alex Williamson 已提交
533
    return register_savevm_live(dev, idstr, instance_id, version_id,
534
                                ops, opaque);
A
aliguori 已提交
535 536
}

A
Alex Williamson 已提交
537
void unregister_savevm(DeviceState *dev, const char *idstr, void *opaque)
538
{
539
    SaveStateEntry *se, *new_se;
540 541
    char id[256] = "";

542 543
    if (dev) {
        char *path = qdev_get_dev_path(dev);
544 545 546
        if (path) {
            pstrcpy(id, sizeof(id), path);
            pstrcat(id, sizeof(id), "/");
547
            g_free(path);
548 549 550
        }
    }
    pstrcat(id, sizeof(id), idstr);
551

J
Juan Quintela 已提交
552
    QTAILQ_FOREACH_SAFE(se, &savevm_state.handlers, entry, new_se) {
553
        if (strcmp(se->idstr, id) == 0 && se->opaque == opaque) {
J
Juan Quintela 已提交
554
            QTAILQ_REMOVE(&savevm_state.handlers, se, entry);
555
            g_free(se->compat);
556
            g_free(se->ops);
557
            g_free(se);
558 559 560 561
        }
    }
}

A
Alex Williamson 已提交
562
int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
J
Jan Kiszka 已提交
563 564 565
                                   const VMStateDescription *vmsd,
                                   void *opaque, int alias_id,
                                   int required_for_version)
566
{
567
    SaveStateEntry *se;
568

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

572
    se = g_new0(SaveStateEntry, 1);
573
    se->version_id = vmsd->version_id;
J
Juan Quintela 已提交
574
    se->section_id = savevm_state.global_section_id++;
575 576
    se->opaque = opaque;
    se->vmsd = vmsd;
J
Jan Kiszka 已提交
577
    se->alias_id = alias_id;
578

579 580
    if (dev) {
        char *id = qdev_get_dev_path(dev);
581 582 583
        if (id) {
            pstrcpy(se->idstr, sizeof(se->idstr), id);
            pstrcat(se->idstr, sizeof(se->idstr), "/");
584
            g_free(id);
585

586
            se->compat = g_new0(CompatEntry, 1);
587 588 589 590 591 592 593 594
            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);

595
    if (instance_id == -1) {
596
        se->instance_id = calculate_new_instance_id(se->idstr);
597 598
    } else {
        se->instance_id = instance_id;
599
    }
600
    assert(!se->compat || se->instance_id == 0);
601
    /* add at the end of list */
J
Juan Quintela 已提交
602
    QTAILQ_INSERT_TAIL(&savevm_state.handlers, se, entry);
603 604 605
    return 0;
}

A
Alex Williamson 已提交
606 607
void vmstate_unregister(DeviceState *dev, const VMStateDescription *vmsd,
                        void *opaque)
608
{
609 610
    SaveStateEntry *se, *new_se;

J
Juan Quintela 已提交
611
    QTAILQ_FOREACH_SAFE(se, &savevm_state.handlers, entry, new_se) {
612
        if (se->vmsd == vmsd && se->opaque == opaque) {
J
Juan Quintela 已提交
613
            QTAILQ_REMOVE(&savevm_state.handlers, se, entry);
614
            g_free(se->compat);
615
            g_free(se);
616 617
        }
    }
618 619
}

620 621
static int vmstate_load(QEMUFile *f, SaveStateEntry *se, int version_id)
{
622
    trace_vmstate_load(se->idstr, se->vmsd ? se->vmsd->name : "(old)");
623
    if (!se->vmsd) {         /* Old style */
624
        return se->ops->load_state(f, se->opaque, version_id);
625 626
    }
    return vmstate_load_state(f, se->vmsd, se->opaque, version_id);
627 628
}

629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649
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)
650
{
651
    trace_vmstate_save(se->idstr, se->vmsd ? se->vmsd->name : "(old)");
652 653
    if (!se->vmsd) {
        vmstate_save_old_style(f, se, vmdesc);
A
Alex Williamson 已提交
654
        return;
655
    }
656
    vmstate_save_state(f, se->vmsd, se->opaque, vmdesc);
657 658
}

659 660 661 662 663
void savevm_skip_section_footers(void)
{
    skip_section_footers = true;
}

664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684
/*
 * 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);
    }
}

685 686 687 688 689 690 691 692 693 694 695 696
/*
 * 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);
    }
}

L
Luiz Capitulino 已提交
697
bool qemu_savevm_state_blocked(Error **errp)
A
Alex Williamson 已提交
698 699 700
{
    SaveStateEntry *se;

J
Juan Quintela 已提交
701
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
702
        if (se->vmsd && se->vmsd->unmigratable) {
703 704
            error_setg(errp, "State blocked by non-migratable device '%s'",
                       se->idstr);
A
Alex Williamson 已提交
705 706 707 708 709 710
            return true;
        }
    }
    return false;
}

711 712 713 714 715
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);
716 717 718 719 720 721

    if (!savevm_state.skip_configuration) {
        qemu_put_byte(f, QEMU_VM_CONFIGURATION);
        vmstate_save_state(f, &vmstate_configuration, &savevm_state, 0);
    }

722 723
}

724 725
void qemu_savevm_state_begin(QEMUFile *f,
                             const MigrationParams *params)
A
aliguori 已提交
726 727
{
    SaveStateEntry *se;
J
Juan Quintela 已提交
728
    int ret;
A
aliguori 已提交
729

730
    trace_savevm_state_begin();
J
Juan Quintela 已提交
731
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
732
        if (!se->ops || !se->ops->set_params) {
L
lirans@il.ibm.com 已提交
733
            continue;
I
Isaku Yamahata 已提交
734
        }
735
        se->ops->set_params(params, se->opaque);
L
lirans@il.ibm.com 已提交
736
    }
E
Eduardo Habkost 已提交
737

J
Juan Quintela 已提交
738
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
739
        if (!se->ops || !se->ops->save_live_setup) {
A
aliguori 已提交
740
            continue;
741
        }
742 743 744 745 746
        if (se->ops && se->ops->is_active) {
            if (!se->ops->is_active(se->opaque)) {
                continue;
            }
        }
747
        save_section_header(f, se, QEMU_VM_SECTION_START);
A
aliguori 已提交
748

749
        ret = se->ops->save_live_setup(f, se->opaque);
750
        save_section_footer(f, se);
751
        if (ret < 0) {
752 753
            qemu_file_set_error(f, ret);
            break;
754
        }
A
aliguori 已提交
755 756 757
    }
}

J
Juan Quintela 已提交
758
/*
D
Dong Xu Wang 已提交
759
 * this function has three return values:
J
Juan Quintela 已提交
760 761 762 763
 *   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
 */
764
int qemu_savevm_state_iterate(QEMUFile *f)
A
aliguori 已提交
765 766 767 768
{
    SaveStateEntry *se;
    int ret = 1;

769
    trace_savevm_state_iterate();
J
Juan Quintela 已提交
770
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
771
        if (!se->ops || !se->ops->save_live_iterate) {
A
aliguori 已提交
772
            continue;
773
        }
774 775 776 777 778
        if (se->ops && se->ops->is_active) {
            if (!se->ops->is_active(se->opaque)) {
                continue;
            }
        }
779 780 781
        if (qemu_file_rate_limit(f)) {
            return 0;
        }
782
        trace_savevm_section_start(se->idstr, se->section_id);
783 784

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

786
        ret = se->ops->save_live_iterate(f, se->opaque);
787
        trace_savevm_section_end(se->idstr, se->section_id, ret);
788
        save_section_footer(f, se);
789

790 791 792
        if (ret < 0) {
            qemu_file_set_error(f, ret);
        }
793
        if (ret <= 0) {
794 795 796 797 798 799
            /* 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 已提交
800
    }
J
Juan Quintela 已提交
801
    return ret;
A
aliguori 已提交
802 803
}

804 805 806 807 808 809
static bool should_send_vmdesc(void)
{
    MachineState *machine = MACHINE(qdev_get_machine());
    return !machine->suppress_vmdesc;
}

810
void qemu_savevm_state_complete(QEMUFile *f)
A
aliguori 已提交
811
{
812 813
    QJSON *vmdesc;
    int vmdesc_len;
A
aliguori 已提交
814
    SaveStateEntry *se;
815
    int ret;
A
aliguori 已提交
816

817 818
    trace_savevm_state_complete();

819 820
    cpu_synchronize_all_states();

J
Juan Quintela 已提交
821
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
822
        if (!se->ops || !se->ops->save_live_complete) {
A
aliguori 已提交
823
            continue;
824
        }
825 826 827 828 829
        if (se->ops && se->ops->is_active) {
            if (!se->ops->is_active(se->opaque)) {
                continue;
            }
        }
830
        trace_savevm_section_start(se->idstr, se->section_id);
831 832

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

834
        ret = se->ops->save_live_complete(f, se->opaque);
835
        trace_savevm_section_end(se->idstr, se->section_id, ret);
836
        save_section_footer(f, se);
837
        if (ret < 0) {
838 839
            qemu_file_set_error(f, ret);
            return;
840
        }
A
aliguori 已提交
841 842
    }

843 844 845
    vmdesc = qjson_new();
    json_prop_int(vmdesc, "page_size", TARGET_PAGE_SIZE);
    json_start_array(vmdesc, "devices");
J
Juan Quintela 已提交
846
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
A
aliguori 已提交
847

848
        if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
849
            continue;
850
        }
851 852 853 854 855
        if (se->vmsd && !vmstate_save_needed(se->vmsd, se->opaque)) {
            trace_savevm_section_skip(se->idstr, se->section_id);
            continue;
        }

856
        trace_savevm_section_start(se->idstr, se->section_id);
857 858 859 860 861

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

862
        save_section_header(f, se, QEMU_VM_SECTION_FULL);
A
aliguori 已提交
863

864 865 866
        vmstate_save(f, se, vmdesc);

        json_end_object(vmdesc);
867
        trace_savevm_section_end(se->idstr, se->section_id, 0);
868
        save_section_footer(f, se);
A
aliguori 已提交
869 870 871
    }

    qemu_put_byte(f, QEMU_VM_EOF);
872 873 874 875 876

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

877 878 879 880 881
    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);
    }
882 883
    object_unref(OBJECT(vmdesc));

884
    qemu_fflush(f);
A
aliguori 已提交
885 886
}

887 888 889 890 891
uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size)
{
    SaveStateEntry *se;
    uint64_t ret = 0;

J
Juan Quintela 已提交
892
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
893 894 895 896 897 898 899 900 901 902 903 904 905
        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;
}

906
void qemu_savevm_state_cleanup(void)
907 908 909
{
    SaveStateEntry *se;

910
    trace_savevm_state_cleanup();
J
Juan Quintela 已提交
911
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
912 913
        if (se->ops && se->ops->cleanup) {
            se->ops->cleanup(se->opaque);
914 915 916 917
        }
    }
}

918
static int qemu_savevm_state(QEMUFile *f, Error **errp)
A
aliguori 已提交
919 920
{
    int ret;
I
Isaku Yamahata 已提交
921 922 923 924
    MigrationParams params = {
        .blk = 0,
        .shared = 0
    };
A
aliguori 已提交
925

926
    if (qemu_savevm_state_blocked(errp)) {
927
        return -EINVAL;
A
Alex Williamson 已提交
928 929
    }

930
    qemu_mutex_unlock_iothread();
931
    qemu_savevm_state_header(f);
932
    qemu_savevm_state_begin(f, &params);
933 934
    qemu_mutex_lock_iothread();

935 936 937 938 939
    while (qemu_file_get_error(f) == 0) {
        if (qemu_savevm_state_iterate(f) > 0) {
            break;
        }
    }
A
aliguori 已提交
940

941
    ret = qemu_file_get_error(f);
J
Juan Quintela 已提交
942
    if (ret == 0) {
943
        qemu_savevm_state_complete(f);
944
        ret = qemu_file_get_error(f);
J
Juan Quintela 已提交
945
    }
946
    if (ret != 0) {
947
        qemu_savevm_state_cleanup();
948
        error_setg_errno(errp, -ret, "Error while writing VM state");
949
    }
A
aliguori 已提交
950 951 952
    return ret;
}

953 954 955 956 957 958 959 960 961
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 已提交
962
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
963 964 965
        if (se->is_ram) {
            continue;
        }
966
        if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
967 968
            continue;
        }
969 970 971
        if (se->vmsd && !vmstate_save_needed(se->vmsd, se->opaque)) {
            continue;
        }
972

973
        save_section_header(f, se, QEMU_VM_SECTION_FULL);
974

975
        vmstate_save(f, se, NULL);
976 977

        save_section_footer(f, se);
978 979 980 981 982 983 984
    }

    qemu_put_byte(f, QEMU_VM_EOF);

    return qemu_file_get_error(f);
}

A
aliguori 已提交
985 986 987 988
static SaveStateEntry *find_se(const char *idstr, int instance_id)
{
    SaveStateEntry *se;

J
Juan Quintela 已提交
989
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
A
aliguori 已提交
990
        if (!strcmp(se->idstr, idstr) &&
J
Jan Kiszka 已提交
991 992
            (instance_id == se->instance_id ||
             instance_id == se->alias_id))
A
aliguori 已提交
993
            return se;
994 995 996 997 998 999 1000
        /* 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 已提交
1001 1002 1003 1004
    }
    return NULL;
}

1005
struct LoadStateEntry {
B
Blue Swirl 已提交
1006
    QLIST_ENTRY(LoadStateEntry) entry;
A
aliguori 已提交
1007 1008 1009
    SaveStateEntry *se;
    int section_id;
    int version_id;
1010
};
A
aliguori 已提交
1011

1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046
/*
 * 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, LoadStateEntry *le)
{
    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", le->se->idstr);
        return false;
    }

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

    /* All good */
    return true;
}

1047
void loadvm_free_handlers(MigrationIncomingState *mis)
A
aliguori 已提交
1048
{
1049
    LoadStateEntry *le, *new_le;
1050 1051 1052 1053 1054 1055 1056 1057 1058 1059

    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();
1060
    Error *local_err = NULL;
A
aliguori 已提交
1061 1062 1063
    uint8_t section_type;
    unsigned int v;
    int ret;
1064
    int file_error_after_eof = -1;
A
aliguori 已提交
1065

1066
    if (qemu_savevm_state_blocked(&local_err)) {
1067
        error_report_err(local_err);
A
Alex Williamson 已提交
1068 1069 1070
        return -EINVAL;
    }

A
aliguori 已提交
1071
    v = qemu_get_be32(f);
E
Eduardo Habkost 已提交
1072
    if (v != QEMU_VM_FILE_MAGIC) {
1073
        error_report("Not a migration stream");
A
aliguori 已提交
1074
        return -EINVAL;
E
Eduardo Habkost 已提交
1075
    }
A
aliguori 已提交
1076 1077

    v = qemu_get_be32(f);
J
Juan Quintela 已提交
1078
    if (v == QEMU_VM_FILE_VERSION_COMPAT) {
1079
        error_report("SaveVM v2 format is obsolete and don't work anymore");
J
Juan Quintela 已提交
1080 1081
        return -ENOTSUP;
    }
E
Eduardo Habkost 已提交
1082
    if (v != QEMU_VM_FILE_VERSION) {
1083
        error_report("Unsupported migration stream version");
A
aliguori 已提交
1084
        return -ENOTSUP;
E
Eduardo Habkost 已提交
1085
    }
A
aliguori 已提交
1086

1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098
    if (!savevm_state.skip_configuration) {
        if (qemu_get_byte(f) != QEMU_VM_CONFIGURATION) {
            error_report("Configuration section missing");
            return -EINVAL;
        }
        ret = vmstate_load_state(f, &vmstate_configuration, &savevm_state, 0);

        if (ret) {
            return ret;
        }
    }

A
aliguori 已提交
1099 1100 1101
    while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) {
        uint32_t instance_id, version_id, section_id;
        SaveStateEntry *se;
1102
        LoadStateEntry *le;
1103
        char idstr[256];
A
aliguori 已提交
1104

1105
        trace_qemu_loadvm_state_section(section_type);
A
aliguori 已提交
1106 1107 1108 1109 1110
        switch (section_type) {
        case QEMU_VM_SECTION_START:
        case QEMU_VM_SECTION_FULL:
            /* Read section start */
            section_id = qemu_get_be32(f);
1111 1112 1113 1114 1115
            if (!qemu_get_counted_string(f, idstr)) {
                error_report("Unable to read ID string for section %u",
                            section_id);
                return -EINVAL;
            }
A
aliguori 已提交
1116 1117 1118
            instance_id = qemu_get_be32(f);
            version_id = qemu_get_be32(f);

1119 1120
            trace_qemu_loadvm_state_section_startfull(section_id, idstr,
                                                      instance_id, version_id);
A
aliguori 已提交
1121 1122 1123
            /* Find savevm section */
            se = find_se(idstr, instance_id);
            if (se == NULL) {
1124 1125
                error_report("Unknown savevm section or instance '%s' %d",
                             idstr, instance_id);
A
aliguori 已提交
1126 1127 1128 1129 1130 1131
                ret = -EINVAL;
                goto out;
            }

            /* Validate version */
            if (version_id > se->version_id) {
1132 1133
                error_report("savevm: unsupported version %d for '%s' v%d",
                             version_id, idstr, se->version_id);
A
aliguori 已提交
1134 1135 1136 1137 1138
                ret = -EINVAL;
                goto out;
            }

            /* Add entry */
1139
            le = g_malloc0(sizeof(*le));
A
aliguori 已提交
1140 1141 1142 1143

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

1146
            ret = vmstate_load(f, le->se, le->version_id);
1147
            if (ret < 0) {
1148 1149
                error_report("error while loading state for instance 0x%x of"
                             " device '%s'", instance_id, idstr);
1150 1151
                goto out;
            }
1152
            if (!check_section_footer(f, le)) {
1153 1154 1155
                ret = -EINVAL;
                goto out;
            }
A
aliguori 已提交
1156 1157 1158 1159 1160
            break;
        case QEMU_VM_SECTION_PART:
        case QEMU_VM_SECTION_END:
            section_id = qemu_get_be32(f);

1161
            trace_qemu_loadvm_state_section_partend(section_id);
1162
            QLIST_FOREACH(le, &mis->loadvm_handlers, entry) {
1163 1164 1165 1166
                if (le->section_id == section_id) {
                    break;
                }
            }
A
aliguori 已提交
1167
            if (le == NULL) {
1168
                error_report("Unknown savevm section %d", section_id);
A
aliguori 已提交
1169 1170 1171 1172
                ret = -EINVAL;
                goto out;
            }

1173
            ret = vmstate_load(f, le->se, le->version_id);
1174
            if (ret < 0) {
1175 1176
                error_report("error while loading state section id %d(%s)",
                             section_id, le->se->idstr);
1177 1178
                goto out;
            }
1179
            if (!check_section_footer(f, le)) {
1180 1181 1182
                ret = -EINVAL;
                goto out;
            }
A
aliguori 已提交
1183 1184
            break;
        default:
1185
            error_report("Unknown savevm section type %d", section_type);
A
aliguori 已提交
1186 1187 1188 1189 1190
            ret = -EINVAL;
            goto out;
        }
    }

1191 1192 1193 1194 1195 1196
    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.
     */
1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224

    /* We've got to be careful; if we don't read the data and just shut the fd
     * then the sender can error if we close while it's still sending.
     * We also mustn't read data that isn't there; some transports (RDMA)
     * will stall waiting for that data when the source has already closed.
     */
    if (should_send_vmdesc()) {
        uint8_t *buf;
        uint32_t size;
        section_type = qemu_get_byte(f);

        if (section_type != QEMU_VM_VMDESCRIPTION) {
            error_report("Expected vmdescription section, but got %d",
                         section_type);
            /*
             * It doesn't seem worth failing at this point since
             * we apparently have an otherwise valid VM state
             */
        } else {
            buf = g_malloc(0x1000);
            size = qemu_get_be32(f);

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

1228 1229
    cpu_synchronize_all_post_init();

A
aliguori 已提交
1230 1231 1232
    ret = 0;

out:
1233
    if (ret == 0) {
1234 1235
        /* We may not have a VMDESC section, so ignore relative errors */
        ret = file_error_after_eof;
1236
    }
A
aliguori 已提交
1237 1238 1239 1240

    return ret;
}

1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251
static BlockDriverState *find_vmstate_bs(void)
{
    BlockDriverState *bs = NULL;
    while ((bs = bdrv_next(bs))) {
        if (bdrv_can_snapshot(bs)) {
            return bs;
        }
    }
    return NULL;
}

1252 1253 1254 1255 1256 1257 1258
/*
 * 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;
1259
    Error *err = NULL;
1260

1261 1262
    bs = NULL;
    while ((bs = bdrv_next(bs))) {
1263
        if (bdrv_can_snapshot(bs) &&
E
Eduardo Habkost 已提交
1264
            bdrv_snapshot_find(bs, snapshot, name) >= 0) {
1265
            bdrv_snapshot_delete_by_id_or_name(bs, name, &err);
1266
            if (err) {
1267
                monitor_printf(mon,
1268 1269 1270 1271 1272
                               "Error while deleting snapshot on device '%s':"
                               " %s\n",
                               bdrv_get_device_name(bs),
                               error_get_pretty(err));
                error_free(err);
1273 1274 1275 1276 1277 1278 1279 1280
                return -1;
            }
        }
    }

    return 0;
}

1281
void hmp_savevm(Monitor *mon, const QDict *qdict)
A
aliguori 已提交
1282 1283 1284
{
    BlockDriverState *bs, *bs1;
    QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
1285
    int ret;
A
aliguori 已提交
1286 1287
    QEMUFile *f;
    int saved_vm_running;
K
Kevin Wolf 已提交
1288
    uint64_t vm_state_size;
1289
    qemu_timeval tv;
1290
    struct tm tm;
1291
    const char *name = qdict_get_try_str(qdict, "name");
1292
    Error *local_err = NULL;
A
aliguori 已提交
1293

1294
    /* Verify if there is a device that doesn't support snapshots and is writable */
1295 1296
    bs = NULL;
    while ((bs = bdrv_next(bs))) {
1297

1298
        if (!bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
1299 1300 1301 1302 1303 1304 1305 1306 1307 1308
            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;
        }
    }

1309
    bs = find_vmstate_bs();
A
aliguori 已提交
1310
    if (!bs) {
A
aliguori 已提交
1311
        monitor_printf(mon, "No block device can accept snapshots\n");
A
aliguori 已提交
1312 1313 1314
        return;
    }

1315
    saved_vm_running = runstate_is_running();
1316 1317 1318 1319 1320 1321

    ret = global_state_store();
    if (ret) {
        monitor_printf(mon, "Error saving global state\n");
        return;
    }
1322
    vm_stop(RUN_STATE_SAVE_VM);
A
aliguori 已提交
1323

1324
    memset(sn, 0, sizeof(*sn));
A
aliguori 已提交
1325 1326

    /* fill auxiliary fields */
1327
    qemu_gettimeofday(&tv);
A
aliguori 已提交
1328 1329
    sn->date_sec = tv.tv_sec;
    sn->date_nsec = tv.tv_usec * 1000;
1330
    sn->vm_clock_nsec = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
A
aliguori 已提交
1331

1332 1333 1334 1335 1336 1337 1338 1339 1340
    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 已提交
1341 1342
        /* cast below needed for OpenBSD where tv_sec is still 'long' */
        localtime_r((const time_t *)&tv.tv_sec, &tm);
1343 1344 1345
        strftime(sn->name, sizeof(sn->name), "vm-%Y%m%d%H%M%S", &tm);
    }

1346
    /* Delete old snapshots of the same name */
1347
    if (name && del_existing_snapshots(mon, name) < 0) {
1348 1349 1350
        goto the_end;
    }

A
aliguori 已提交
1351
    /* save the VM state */
1352
    f = qemu_fopen_bdrv(bs, 1);
A
aliguori 已提交
1353
    if (!f) {
A
aliguori 已提交
1354
        monitor_printf(mon, "Could not open VM state file\n");
A
aliguori 已提交
1355 1356
        goto the_end;
    }
1357
    ret = qemu_savevm_state(f, &local_err);
1358
    vm_state_size = qemu_ftell(f);
A
aliguori 已提交
1359 1360
    qemu_fclose(f);
    if (ret < 0) {
1361 1362
        monitor_printf(mon, "%s\n", error_get_pretty(local_err));
        error_free(local_err);
A
aliguori 已提交
1363 1364 1365 1366 1367
        goto the_end;
    }

    /* create the snapshots */

1368 1369
    bs1 = NULL;
    while ((bs1 = bdrv_next(bs1))) {
1370
        if (bdrv_can_snapshot(bs1)) {
1371 1372
            /* Write VM state size only to the image that contains the state */
            sn->vm_state_size = (bs == bs1 ? vm_state_size : 0);
A
aliguori 已提交
1373 1374
            ret = bdrv_snapshot_create(bs1, sn);
            if (ret < 0) {
A
aliguori 已提交
1375 1376
                monitor_printf(mon, "Error while creating snapshot on '%s'\n",
                               bdrv_get_device_name(bs1));
A
aliguori 已提交
1377 1378 1379 1380 1381
            }
        }
    }

 the_end:
E
Eduardo Habkost 已提交
1382
    if (saved_vm_running) {
A
aliguori 已提交
1383
        vm_start();
E
Eduardo Habkost 已提交
1384
    }
A
aliguori 已提交
1385 1386
}

1387 1388 1389 1390 1391 1392 1393 1394
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);
1395
    global_state_store_running();
1396 1397 1398

    f = qemu_fopen(filename, "wb");
    if (!f) {
1399
        error_setg_file_open(errp, errno, filename);
1400 1401 1402 1403 1404
        goto the_end;
    }
    ret = qemu_save_device_state(f);
    qemu_fclose(f);
    if (ret < 0) {
1405
        error_setg(errp, QERR_IO_ERROR);
1406 1407 1408
    }

 the_end:
E
Eduardo Habkost 已提交
1409
    if (saved_vm_running) {
1410
        vm_start();
E
Eduardo Habkost 已提交
1411
    }
1412 1413
}

1414
int load_vmstate(const char *name)
A
aliguori 已提交
1415
{
1416
    BlockDriverState *bs, *bs_vm_state;
1417
    QEMUSnapshotInfo sn;
A
aliguori 已提交
1418
    QEMUFile *f;
G
Gerd Hoffmann 已提交
1419
    int ret;
A
aliguori 已提交
1420

1421
    bs_vm_state = find_vmstate_bs();
1422 1423 1424 1425 1426 1427 1428 1429 1430 1431
    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) {
1432 1433
        error_report("This is a disk-only snapshot. Revert to it offline "
            "using qemu-img.");
1434 1435 1436 1437 1438
        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. */
1439 1440
    bs = NULL;
    while ((bs = bdrv_next(bs))) {
1441

1442
        if (!bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
1443 1444 1445 1446 1447 1448 1449 1450 1451
            continue;
        }

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

1452 1453 1454 1455 1456 1457
        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 已提交
1458 1459 1460
    }

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

1463 1464 1465 1466
    bs = NULL;
    while ((bs = bdrv_next(bs))) {
        if (bdrv_can_snapshot(bs)) {
            ret = bdrv_snapshot_goto(bs, name);
A
aliguori 已提交
1467
            if (ret < 0) {
1468 1469 1470
                error_report("Error %d while activating snapshot '%s' on '%s'",
                             ret, name, bdrv_get_device_name(bs));
                return ret;
A
aliguori 已提交
1471 1472 1473 1474 1475
            }
        }
    }

    /* restore the VM state */
1476
    f = qemu_fopen_bdrv(bs_vm_state, 0);
A
aliguori 已提交
1477
    if (!f) {
1478
        error_report("Could not open VM state file");
1479
        return -EINVAL;
A
aliguori 已提交
1480
    }
1481

J
Jan Kiszka 已提交
1482
    qemu_system_reset(VMRESET_SILENT);
1483
    migration_incoming_state_new(f);
A
aliguori 已提交
1484
    ret = qemu_loadvm_state(f);
1485

A
aliguori 已提交
1486
    qemu_fclose(f);
1487
    migration_incoming_state_destroy();
A
aliguori 已提交
1488
    if (ret < 0) {
1489
        error_report("Error %d while loading VM state", ret);
1490
        return ret;
A
aliguori 已提交
1491
    }
1492

1493
    return 0;
1494 1495
}

1496
void hmp_delvm(Monitor *mon, const QDict *qdict)
A
aliguori 已提交
1497
{
1498
    BlockDriverState *bs;
1499
    Error *err;
1500
    const char *name = qdict_get_str(qdict, "name");
A
aliguori 已提交
1501

1502
    if (!find_vmstate_bs()) {
A
aliguori 已提交
1503
        monitor_printf(mon, "No block device supports snapshots\n");
A
aliguori 已提交
1504 1505 1506
        return;
    }

1507 1508 1509
    bs = NULL;
    while ((bs = bdrv_next(bs))) {
        if (bdrv_can_snapshot(bs)) {
1510
            err = NULL;
1511
            bdrv_snapshot_delete_by_id_or_name(bs, name, &err);
1512
            if (err) {
1513 1514 1515 1516 1517 1518
                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 已提交
1519 1520 1521 1522 1523
            }
        }
    }
}

1524
void hmp_info_snapshots(Monitor *mon, const QDict *qdict)
A
aliguori 已提交
1525 1526
{
    BlockDriverState *bs, *bs1;
1527 1528 1529 1530
    QEMUSnapshotInfo *sn_tab, *sn, s, *sn_info = &s;
    int nb_sns, i, ret, available;
    int total;
    int *available_snapshots;
A
aliguori 已提交
1531

1532
    bs = find_vmstate_bs();
A
aliguori 已提交
1533
    if (!bs) {
A
aliguori 已提交
1534
        monitor_printf(mon, "No available block device supports snapshots\n");
A
aliguori 已提交
1535 1536 1537 1538 1539
        return;
    }

    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
    if (nb_sns < 0) {
A
aliguori 已提交
1540
        monitor_printf(mon, "bdrv_snapshot_list: error %d\n", nb_sns);
A
aliguori 已提交
1541 1542
        return;
    }
1543 1544 1545 1546 1547 1548

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

1549
    available_snapshots = g_new0(int, nb_sns);
1550 1551
    total = 0;
    for (i = 0; i < nb_sns; i++) {
A
aliguori 已提交
1552
        sn = &sn_tab[i];
1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569
        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 已提交
1570
    }
1571 1572

    if (total > 0) {
1573 1574
        bdrv_snapshot_dump((fprintf_function)monitor_printf, mon, NULL);
        monitor_printf(mon, "\n");
1575 1576
        for (i = 0; i < total; i++) {
            sn = &sn_tab[available_snapshots[i]];
1577 1578
            bdrv_snapshot_dump((fprintf_function)monitor_printf, mon, sn);
            monitor_printf(mon, "\n");
1579 1580 1581 1582 1583
        }
    } else {
        monitor_printf(mon, "There is no suitable snapshot available\n");
    }

1584 1585
    g_free(sn_tab);
    g_free(available_snapshots);
1586

A
aliguori 已提交
1587
}
1588 1589 1590

void vmstate_register_ram(MemoryRegion *mr, DeviceState *dev)
{
1591
    qemu_ram_set_idstr(memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK,
1592 1593 1594 1595 1596
                       memory_region_name(mr), dev);
}

void vmstate_unregister_ram(MemoryRegion *mr, DeviceState *dev)
{
1597
    qemu_ram_unset_idstr(memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK);
1598 1599 1600 1601 1602 1603
}

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