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_malloc0(sizeof(SaveStateEntry));
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_malloc0(sizeof(CompatEntry));
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 531 532
    SaveVMHandlers *ops = g_malloc0(sizeof(SaveVMHandlers));
    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_malloc0(sizeof(SaveStateEntry));
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_malloc0(sizeof(CompatEntry));
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 716 717
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);
}

718 719
void qemu_savevm_state_begin(QEMUFile *f,
                             const MigrationParams *params)
A
aliguori 已提交
720 721
{
    SaveStateEntry *se;
J
Juan Quintela 已提交
722
    int ret;
A
aliguori 已提交
723

724
    trace_savevm_state_begin();
J
Juan Quintela 已提交
725
    QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
726
        if (!se->ops || !se->ops->set_params) {
L
lirans@il.ibm.com 已提交
727
            continue;
I
Isaku Yamahata 已提交
728
        }
729
        se->ops->set_params(params, se->opaque);
L
lirans@il.ibm.com 已提交
730
    }
E
Eduardo Habkost 已提交
731

732 733 734 735 736
    if (!savevm_state.skip_configuration) {
        qemu_put_byte(f, QEMU_VM_CONFIGURATION);
        vmstate_save_state(f, &vmstate_configuration, &savevm_state, 0);
    }

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

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

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

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

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

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

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

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

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

816 817
    trace_savevm_state_complete();

818 819
    cpu_synchronize_all_states();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

905
void qemu_savevm_state_cancel(void)
906 907 908
{
    SaveStateEntry *se;

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

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

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

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

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

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

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

972
        save_section_header(f, se, QEMU_VM_SECTION_FULL);
973

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

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

    qemu_put_byte(f, QEMU_VM_EOF);

    return qemu_file_get_error(f);
}

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

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

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

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
/*
 * 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;
}

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

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

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

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

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

1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097
    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 已提交
1098 1099 1100
    while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) {
        uint32_t instance_id, version_id, section_id;
        SaveStateEntry *se;
1101
        LoadStateEntry *le;
1102
        char idstr[256];
A
aliguori 已提交
1103

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

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

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

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

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

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

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

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

1190 1191 1192 1193 1194 1195
    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.
     */
1196 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

    /* 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);
1224 1225 1226
        }
    }

1227 1228
    cpu_synchronize_all_post_init();

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

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

    return ret;
}

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

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

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

    return 0;
}

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

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

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

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

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

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

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

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

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

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

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

    /* create the snapshots */

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1492
    return 0;
1493 1494
}

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

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

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

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

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

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

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

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

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

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

A
aliguori 已提交
1586
}
1587 1588 1589

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

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

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