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

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

A
aliguori 已提交
52

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

60 61
static bool skip_section_footers;

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

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

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

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

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

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

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


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

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

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

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

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

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

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

    return qiov.size;
}

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

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

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

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

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

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

177

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

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

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

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

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


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

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

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

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

226

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

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

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

static SaveState savevm_state = {
    .handlers = QTAILQ_HEAD_INITIALIZER(savevm_state.handlers),
    .global_section_id = 0,
257 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
    .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 已提交
298
};
A
aliguori 已提交
299

300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322
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,
323
                              const VMStateDescription **subsection,
324 325
                              int indent)
{
326 327
    if (*subsection != NULL) {
        dump_vmstate_vmsd(out_file, *subsection, indent, true);
328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367
    }
}

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

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

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

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

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

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

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

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

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

501
            se->compat = g_malloc0(sizeof(CompatEntry));
502 503 504 505 506 507 508 509
            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);

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

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

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

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

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

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

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

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

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

587
            se->compat = g_malloc0(sizeof(CompatEntry));
588 589 590 591 592 593 594 595
            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);

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

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

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

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

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

662 663 664 665 666
void savevm_skip_section_footers(void)
{
    skip_section_footers = true;
}

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

688 689 690 691 692 693 694 695 696 697 698 699
/*
 * 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 已提交
700
bool qemu_savevm_state_blocked(Error **errp)
A
Alex Williamson 已提交
701 702 703
{
    SaveStateEntry *se;

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

714 715 716 717 718 719 720
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);
}

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

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

735 736 737 738 739
    if (!savevm_state.skip_configuration) {
        qemu_put_byte(f, QEMU_VM_CONFIGURATION);
        vmstate_save_state(f, &vmstate_configuration, &savevm_state, 0);
    }

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

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

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

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

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

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

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

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

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

819 820
    trace_savevm_state_complete();

821 822
    cpu_synchronize_all_states();

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

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

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

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

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

858
        trace_savevm_section_start(se->idstr, se->section_id);
859 860 861 862 863

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

864
        save_section_header(f, se, QEMU_VM_SECTION_FULL);
A
aliguori 已提交
865

866 867 868
        vmstate_save(f, se, vmdesc);

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

    qemu_put_byte(f, QEMU_VM_EOF);
874 875 876 877 878

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

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

886
    qemu_fflush(f);
A
aliguori 已提交
887 888
}

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

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

908
void qemu_savevm_state_cancel(void)
909 910 911
{
    SaveStateEntry *se;

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

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

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

932
    qemu_mutex_unlock_iothread();
933
    qemu_savevm_state_header(f);
934
    qemu_savevm_state_begin(f, &params);
935 936
    qemu_mutex_lock_iothread();

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

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

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

975
        save_section_header(f, se, QEMU_VM_SECTION_FULL);
976

977
        vmstate_save(f, se, NULL);
978 979

        save_section_footer(f, se);
980 981 982 983 984 985 986
    }

    qemu_put_byte(f, QEMU_VM_EOF);

    return qemu_file_get_error(f);
}

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

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

1007
struct LoadStateEntry {
B
Blue Swirl 已提交
1008
    QLIST_ENTRY(LoadStateEntry) entry;
A
aliguori 已提交
1009 1010 1011
    SaveStateEntry *se;
    int section_id;
    int version_id;
1012
};
A
aliguori 已提交
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 1047 1048
/*
 * 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;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1193 1194 1195 1196 1197 1198
    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.
     */
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 1225 1226

    /* 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);
1227 1228 1229
        }
    }

1230 1231
    cpu_synchronize_all_post_init();

A
aliguori 已提交
1232 1233 1234
    ret = 0;

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

    return ret;
}

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

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

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

    return 0;
}

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

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

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

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

1317
    saved_vm_running = runstate_is_running();
1318
    vm_stop(RUN_STATE_SAVE_VM);
A
aliguori 已提交
1319

1320
    memset(sn, 0, sizeof(*sn));
A
aliguori 已提交
1321 1322

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

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

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

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

    /* create the snapshots */

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

 the_end:
E
Eduardo Habkost 已提交
1378
    if (saved_vm_running) {
A
aliguori 已提交
1379
        vm_start();
E
Eduardo Habkost 已提交
1380
    }
A
aliguori 已提交
1381 1382
}

1383 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);

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

 the_end:
E
Eduardo Habkost 已提交
1404
    if (saved_vm_running) {
1405
        vm_start();
E
Eduardo Habkost 已提交
1406
    }
1407 1408
}

1409
int load_vmstate(const char *name)
A
aliguori 已提交
1410
{
1411
    BlockDriverState *bs, *bs_vm_state;
1412
    QEMUSnapshotInfo sn;
A
aliguori 已提交
1413
    QEMUFile *f;
G
Gerd Hoffmann 已提交
1414
    int ret;
A
aliguori 已提交
1415

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

1437
        if (!bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
1438 1439 1440 1441 1442 1443 1444 1445 1446
            continue;
        }

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

1447 1448 1449 1450 1451 1452
        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 已提交
1453 1454 1455
    }

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

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

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

J
Jan Kiszka 已提交
1477
    qemu_system_reset(VMRESET_SILENT);
1478
    migration_incoming_state_new(f);
A
aliguori 已提交
1479
    ret = qemu_loadvm_state(f);
1480

A
aliguori 已提交
1481
    qemu_fclose(f);
1482
    migration_incoming_state_destroy();
A
aliguori 已提交
1483
    if (ret < 0) {
1484
        error_report("Error %d while loading VM state", ret);
1485
        return ret;
A
aliguori 已提交
1486
    }
1487

1488
    return 0;
1489 1490
}

1491
void hmp_delvm(Monitor *mon, const QDict *qdict)
A
aliguori 已提交
1492
{
1493
    BlockDriverState *bs;
1494
    Error *err;
1495
    const char *name = qdict_get_str(qdict, "name");
A
aliguori 已提交
1496

1497
    if (!find_vmstate_bs()) {
A
aliguori 已提交
1498
        monitor_printf(mon, "No block device supports snapshots\n");
A
aliguori 已提交
1499 1500 1501
        return;
    }

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

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

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

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

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

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

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

1579 1580
    g_free(sn_tab);
    g_free(available_snapshots);
1581

A
aliguori 已提交
1582
}
1583 1584 1585

void vmstate_register_ram(MemoryRegion *mr, DeviceState *dev)
{
1586
    qemu_ram_set_idstr(memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK,
1587 1588 1589 1590 1591
                       memory_region_name(mr), dev);
}

void vmstate_unregister_ram(MemoryRegion *mr, DeviceState *dev)
{
1592
    qemu_ram_unset_idstr(memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK);
1593 1594 1595 1596 1597 1598
}

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