xref: /openbmc/qemu/migration/savevm.c (revision c6bd8c70)
1 /*
2  * QEMU System Emulator
3  *
4  * Copyright (c) 2003-2008 Fabrice Bellard
5  * Copyright (c) 2009-2015 Red Hat Inc
6  *
7  * Authors:
8  *  Juan Quintela <quintela@redhat.com>
9  *
10  * Permission is hereby granted, free of charge, to any person obtaining a copy
11  * of this software and associated documentation files (the "Software"), to deal
12  * in the Software without restriction, including without limitation the rights
13  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14  * copies of the Software, and to permit persons to whom the Software is
15  * furnished to do so, subject to the following conditions:
16  *
17  * The above copyright notice and this permission notice shall be included in
18  * all copies or substantial portions of the Software.
19  *
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26  * THE SOFTWARE.
27  */
28 
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"
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 "qemu/sockets.h"
41 #include "qemu/queue.h"
42 #include "sysemu/cpus.h"
43 #include "exec/memory.h"
44 #include "qmp-commands.h"
45 #include "trace.h"
46 #include "qemu/iov.h"
47 #include "block/snapshot.h"
48 #include "block/qapi.h"
49 
50 
51 #ifndef ETH_P_RARP
52 #define ETH_P_RARP 0x8035
53 #endif
54 #define ARP_HTYPE_ETH 0x0001
55 #define ARP_PTYPE_IP 0x0800
56 #define ARP_OP_REQUEST_REV 0x3
57 
58 static bool skip_section_footers;
59 
60 static int announce_self_create(uint8_t *buf,
61                                 uint8_t *mac_addr)
62 {
63     /* Ethernet header. */
64     memset(buf, 0xff, 6);         /* destination MAC addr */
65     memcpy(buf + 6, mac_addr, 6); /* source MAC addr */
66     *(uint16_t *)(buf + 12) = htons(ETH_P_RARP); /* ethertype */
67 
68     /* RARP header. */
69     *(uint16_t *)(buf + 14) = htons(ARP_HTYPE_ETH); /* hardware addr space */
70     *(uint16_t *)(buf + 16) = htons(ARP_PTYPE_IP); /* protocol addr space */
71     *(buf + 18) = 6; /* hardware addr length (ethernet) */
72     *(buf + 19) = 4; /* protocol addr length (IPv4) */
73     *(uint16_t *)(buf + 20) = htons(ARP_OP_REQUEST_REV); /* opcode */
74     memcpy(buf + 22, mac_addr, 6); /* source hw addr */
75     memset(buf + 28, 0x00, 4);     /* source protocol addr */
76     memcpy(buf + 32, mac_addr, 6); /* target hw addr */
77     memset(buf + 38, 0x00, 4);     /* target protocol addr */
78 
79     /* Padding to get up to 60 bytes (ethernet min packet size, minus FCS). */
80     memset(buf + 42, 0x00, 18);
81 
82     return 60; /* len (FCS will be added by hardware) */
83 }
84 
85 static void qemu_announce_self_iter(NICState *nic, void *opaque)
86 {
87     uint8_t buf[60];
88     int len;
89 
90     trace_qemu_announce_self_iter(qemu_ether_ntoa(&nic->conf->macaddr));
91     len = announce_self_create(buf, nic->conf->macaddr.a);
92 
93     qemu_send_packet_raw(qemu_get_queue(nic), buf, len);
94 }
95 
96 
97 static void qemu_announce_self_once(void *opaque)
98 {
99     static int count = SELF_ANNOUNCE_ROUNDS;
100     QEMUTimer *timer = *(QEMUTimer **)opaque;
101 
102     qemu_foreach_nic(qemu_announce_self_iter, NULL);
103 
104     if (--count) {
105         /* delay 50ms, 150ms, 250ms, ... */
106         timer_mod(timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) +
107                   self_announce_delay(count));
108     } else {
109             timer_del(timer);
110             timer_free(timer);
111     }
112 }
113 
114 void qemu_announce_self(void)
115 {
116     static QEMUTimer *timer;
117     timer = timer_new_ms(QEMU_CLOCK_REALTIME, qemu_announce_self_once, &timer);
118     qemu_announce_self_once(&timer);
119 }
120 
121 /***********************************************************/
122 /* savevm/loadvm support */
123 
124 static ssize_t block_writev_buffer(void *opaque, struct iovec *iov, int iovcnt,
125                                    int64_t pos)
126 {
127     int ret;
128     QEMUIOVector qiov;
129 
130     qemu_iovec_init_external(&qiov, iov, iovcnt);
131     ret = bdrv_writev_vmstate(opaque, &qiov, pos);
132     if (ret < 0) {
133         return ret;
134     }
135 
136     return qiov.size;
137 }
138 
139 static int block_put_buffer(void *opaque, const uint8_t *buf,
140                            int64_t pos, int size)
141 {
142     bdrv_save_vmstate(opaque, buf, pos, size);
143     return size;
144 }
145 
146 static int block_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
147 {
148     return bdrv_load_vmstate(opaque, buf, pos, size);
149 }
150 
151 static int bdrv_fclose(void *opaque)
152 {
153     return bdrv_flush(opaque);
154 }
155 
156 static const QEMUFileOps bdrv_read_ops = {
157     .get_buffer = block_get_buffer,
158     .close =      bdrv_fclose
159 };
160 
161 static const QEMUFileOps bdrv_write_ops = {
162     .put_buffer     = block_put_buffer,
163     .writev_buffer  = block_writev_buffer,
164     .close          = bdrv_fclose
165 };
166 
167 static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int is_writable)
168 {
169     if (is_writable) {
170         return qemu_fopen_ops(bs, &bdrv_write_ops);
171     }
172     return qemu_fopen_ops(bs, &bdrv_read_ops);
173 }
174 
175 
176 /* QEMUFile timer support.
177  * Not in qemu-file.c to not add qemu-timer.c as dependency to qemu-file.c
178  */
179 
180 void timer_put(QEMUFile *f, QEMUTimer *ts)
181 {
182     uint64_t expire_time;
183 
184     expire_time = timer_expire_time_ns(ts);
185     qemu_put_be64(f, expire_time);
186 }
187 
188 void timer_get(QEMUFile *f, QEMUTimer *ts)
189 {
190     uint64_t expire_time;
191 
192     expire_time = qemu_get_be64(f);
193     if (expire_time != -1) {
194         timer_mod_ns(ts, expire_time);
195     } else {
196         timer_del(ts);
197     }
198 }
199 
200 
201 /* VMState timer support.
202  * Not in vmstate.c to not add qemu-timer.c as dependency to vmstate.c
203  */
204 
205 static int get_timer(QEMUFile *f, void *pv, size_t size)
206 {
207     QEMUTimer *v = pv;
208     timer_get(f, v);
209     return 0;
210 }
211 
212 static void put_timer(QEMUFile *f, void *pv, size_t size)
213 {
214     QEMUTimer *v = pv;
215     timer_put(f, v);
216 }
217 
218 const VMStateInfo vmstate_info_timer = {
219     .name = "timer",
220     .get  = get_timer,
221     .put  = put_timer,
222 };
223 
224 
225 typedef struct CompatEntry {
226     char idstr[256];
227     int instance_id;
228 } CompatEntry;
229 
230 typedef struct SaveStateEntry {
231     QTAILQ_ENTRY(SaveStateEntry) entry;
232     char idstr[256];
233     int instance_id;
234     int alias_id;
235     int version_id;
236     int section_id;
237     SaveVMHandlers *ops;
238     const VMStateDescription *vmsd;
239     void *opaque;
240     CompatEntry *compat;
241     int is_ram;
242 } SaveStateEntry;
243 
244 typedef struct SaveState {
245     QTAILQ_HEAD(, SaveStateEntry) handlers;
246     int global_section_id;
247 } SaveState;
248 
249 static SaveState savevm_state = {
250     .handlers = QTAILQ_HEAD_INITIALIZER(savevm_state.handlers),
251     .global_section_id = 0,
252 };
253 
254 static void dump_vmstate_vmsd(FILE *out_file,
255                               const VMStateDescription *vmsd, int indent,
256                               bool is_subsection);
257 
258 static void dump_vmstate_vmsf(FILE *out_file, const VMStateField *field,
259                               int indent)
260 {
261     fprintf(out_file, "%*s{\n", indent, "");
262     indent += 2;
263     fprintf(out_file, "%*s\"field\": \"%s\",\n", indent, "", field->name);
264     fprintf(out_file, "%*s\"version_id\": %d,\n", indent, "",
265             field->version_id);
266     fprintf(out_file, "%*s\"field_exists\": %s,\n", indent, "",
267             field->field_exists ? "true" : "false");
268     fprintf(out_file, "%*s\"size\": %zu", indent, "", field->size);
269     if (field->vmsd != NULL) {
270         fprintf(out_file, ",\n");
271         dump_vmstate_vmsd(out_file, field->vmsd, indent, false);
272     }
273     fprintf(out_file, "\n%*s}", indent - 2, "");
274 }
275 
276 static void dump_vmstate_vmss(FILE *out_file,
277                               const VMStateDescription **subsection,
278                               int indent)
279 {
280     if (*subsection != NULL) {
281         dump_vmstate_vmsd(out_file, *subsection, indent, true);
282     }
283 }
284 
285 static void dump_vmstate_vmsd(FILE *out_file,
286                               const VMStateDescription *vmsd, int indent,
287                               bool is_subsection)
288 {
289     if (is_subsection) {
290         fprintf(out_file, "%*s{\n", indent, "");
291     } else {
292         fprintf(out_file, "%*s\"%s\": {\n", indent, "", "Description");
293     }
294     indent += 2;
295     fprintf(out_file, "%*s\"name\": \"%s\",\n", indent, "", vmsd->name);
296     fprintf(out_file, "%*s\"version_id\": %d,\n", indent, "",
297             vmsd->version_id);
298     fprintf(out_file, "%*s\"minimum_version_id\": %d", indent, "",
299             vmsd->minimum_version_id);
300     if (vmsd->fields != NULL) {
301         const VMStateField *field = vmsd->fields;
302         bool first;
303 
304         fprintf(out_file, ",\n%*s\"Fields\": [\n", indent, "");
305         first = true;
306         while (field->name != NULL) {
307             if (field->flags & VMS_MUST_EXIST) {
308                 /* Ignore VMSTATE_VALIDATE bits; these don't get migrated */
309                 field++;
310                 continue;
311             }
312             if (!first) {
313                 fprintf(out_file, ",\n");
314             }
315             dump_vmstate_vmsf(out_file, field, indent + 2);
316             field++;
317             first = false;
318         }
319         fprintf(out_file, "\n%*s]", indent, "");
320     }
321     if (vmsd->subsections != NULL) {
322         const VMStateDescription **subsection = vmsd->subsections;
323         bool first;
324 
325         fprintf(out_file, ",\n%*s\"Subsections\": [\n", indent, "");
326         first = true;
327         while (*subsection != NULL) {
328             if (!first) {
329                 fprintf(out_file, ",\n");
330             }
331             dump_vmstate_vmss(out_file, subsection, indent + 2);
332             subsection++;
333             first = false;
334         }
335         fprintf(out_file, "\n%*s]", indent, "");
336     }
337     fprintf(out_file, "\n%*s}", indent - 2, "");
338 }
339 
340 static void dump_machine_type(FILE *out_file)
341 {
342     MachineClass *mc;
343 
344     mc = MACHINE_GET_CLASS(current_machine);
345 
346     fprintf(out_file, "  \"vmschkmachine\": {\n");
347     fprintf(out_file, "    \"Name\": \"%s\"\n", mc->name);
348     fprintf(out_file, "  },\n");
349 }
350 
351 void dump_vmstate_json_to_file(FILE *out_file)
352 {
353     GSList *list, *elt;
354     bool first;
355 
356     fprintf(out_file, "{\n");
357     dump_machine_type(out_file);
358 
359     first = true;
360     list = object_class_get_list(TYPE_DEVICE, true);
361     for (elt = list; elt; elt = elt->next) {
362         DeviceClass *dc = OBJECT_CLASS_CHECK(DeviceClass, elt->data,
363                                              TYPE_DEVICE);
364         const char *name;
365         int indent = 2;
366 
367         if (!dc->vmsd) {
368             continue;
369         }
370 
371         if (!first) {
372             fprintf(out_file, ",\n");
373         }
374         name = object_class_get_name(OBJECT_CLASS(dc));
375         fprintf(out_file, "%*s\"%s\": {\n", indent, "", name);
376         indent += 2;
377         fprintf(out_file, "%*s\"Name\": \"%s\",\n", indent, "", name);
378         fprintf(out_file, "%*s\"version_id\": %d,\n", indent, "",
379                 dc->vmsd->version_id);
380         fprintf(out_file, "%*s\"minimum_version_id\": %d,\n", indent, "",
381                 dc->vmsd->minimum_version_id);
382 
383         dump_vmstate_vmsd(out_file, dc->vmsd, indent, false);
384 
385         fprintf(out_file, "\n%*s}", indent - 2, "");
386         first = false;
387     }
388     fprintf(out_file, "\n}\n");
389     fclose(out_file);
390 }
391 
392 static int calculate_new_instance_id(const char *idstr)
393 {
394     SaveStateEntry *se;
395     int instance_id = 0;
396 
397     QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
398         if (strcmp(idstr, se->idstr) == 0
399             && instance_id <= se->instance_id) {
400             instance_id = se->instance_id + 1;
401         }
402     }
403     return instance_id;
404 }
405 
406 static int calculate_compat_instance_id(const char *idstr)
407 {
408     SaveStateEntry *se;
409     int instance_id = 0;
410 
411     QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
412         if (!se->compat) {
413             continue;
414         }
415 
416         if (strcmp(idstr, se->compat->idstr) == 0
417             && instance_id <= se->compat->instance_id) {
418             instance_id = se->compat->instance_id + 1;
419         }
420     }
421     return instance_id;
422 }
423 
424 /* TODO: Individual devices generally have very little idea about the rest
425    of the system, so instance_id should be removed/replaced.
426    Meanwhile pass -1 as instance_id if you do not already have a clearly
427    distinguishing id for all instances of your device class. */
428 int register_savevm_live(DeviceState *dev,
429                          const char *idstr,
430                          int instance_id,
431                          int version_id,
432                          SaveVMHandlers *ops,
433                          void *opaque)
434 {
435     SaveStateEntry *se;
436 
437     se = g_malloc0(sizeof(SaveStateEntry));
438     se->version_id = version_id;
439     se->section_id = savevm_state.global_section_id++;
440     se->ops = ops;
441     se->opaque = opaque;
442     se->vmsd = NULL;
443     /* if this is a live_savem then set is_ram */
444     if (ops->save_live_setup != NULL) {
445         se->is_ram = 1;
446     }
447 
448     if (dev) {
449         char *id = qdev_get_dev_path(dev);
450         if (id) {
451             pstrcpy(se->idstr, sizeof(se->idstr), id);
452             pstrcat(se->idstr, sizeof(se->idstr), "/");
453             g_free(id);
454 
455             se->compat = g_malloc0(sizeof(CompatEntry));
456             pstrcpy(se->compat->idstr, sizeof(se->compat->idstr), idstr);
457             se->compat->instance_id = instance_id == -1 ?
458                          calculate_compat_instance_id(idstr) : instance_id;
459             instance_id = -1;
460         }
461     }
462     pstrcat(se->idstr, sizeof(se->idstr), idstr);
463 
464     if (instance_id == -1) {
465         se->instance_id = calculate_new_instance_id(se->idstr);
466     } else {
467         se->instance_id = instance_id;
468     }
469     assert(!se->compat || se->instance_id == 0);
470     /* add at the end of list */
471     QTAILQ_INSERT_TAIL(&savevm_state.handlers, se, entry);
472     return 0;
473 }
474 
475 int register_savevm(DeviceState *dev,
476                     const char *idstr,
477                     int instance_id,
478                     int version_id,
479                     SaveStateHandler *save_state,
480                     LoadStateHandler *load_state,
481                     void *opaque)
482 {
483     SaveVMHandlers *ops = g_malloc0(sizeof(SaveVMHandlers));
484     ops->save_state = save_state;
485     ops->load_state = load_state;
486     return register_savevm_live(dev, idstr, instance_id, version_id,
487                                 ops, opaque);
488 }
489 
490 void unregister_savevm(DeviceState *dev, const char *idstr, void *opaque)
491 {
492     SaveStateEntry *se, *new_se;
493     char id[256] = "";
494 
495     if (dev) {
496         char *path = qdev_get_dev_path(dev);
497         if (path) {
498             pstrcpy(id, sizeof(id), path);
499             pstrcat(id, sizeof(id), "/");
500             g_free(path);
501         }
502     }
503     pstrcat(id, sizeof(id), idstr);
504 
505     QTAILQ_FOREACH_SAFE(se, &savevm_state.handlers, entry, new_se) {
506         if (strcmp(se->idstr, id) == 0 && se->opaque == opaque) {
507             QTAILQ_REMOVE(&savevm_state.handlers, se, entry);
508             if (se->compat) {
509                 g_free(se->compat);
510             }
511             g_free(se->ops);
512             g_free(se);
513         }
514     }
515 }
516 
517 int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
518                                    const VMStateDescription *vmsd,
519                                    void *opaque, int alias_id,
520                                    int required_for_version)
521 {
522     SaveStateEntry *se;
523 
524     /* If this triggers, alias support can be dropped for the vmsd. */
525     assert(alias_id == -1 || required_for_version >= vmsd->minimum_version_id);
526 
527     se = g_malloc0(sizeof(SaveStateEntry));
528     se->version_id = vmsd->version_id;
529     se->section_id = savevm_state.global_section_id++;
530     se->opaque = opaque;
531     se->vmsd = vmsd;
532     se->alias_id = alias_id;
533 
534     if (dev) {
535         char *id = qdev_get_dev_path(dev);
536         if (id) {
537             pstrcpy(se->idstr, sizeof(se->idstr), id);
538             pstrcat(se->idstr, sizeof(se->idstr), "/");
539             g_free(id);
540 
541             se->compat = g_malloc0(sizeof(CompatEntry));
542             pstrcpy(se->compat->idstr, sizeof(se->compat->idstr), vmsd->name);
543             se->compat->instance_id = instance_id == -1 ?
544                          calculate_compat_instance_id(vmsd->name) : instance_id;
545             instance_id = -1;
546         }
547     }
548     pstrcat(se->idstr, sizeof(se->idstr), vmsd->name);
549 
550     if (instance_id == -1) {
551         se->instance_id = calculate_new_instance_id(se->idstr);
552     } else {
553         se->instance_id = instance_id;
554     }
555     assert(!se->compat || se->instance_id == 0);
556     /* add at the end of list */
557     QTAILQ_INSERT_TAIL(&savevm_state.handlers, se, entry);
558     return 0;
559 }
560 
561 void vmstate_unregister(DeviceState *dev, const VMStateDescription *vmsd,
562                         void *opaque)
563 {
564     SaveStateEntry *se, *new_se;
565 
566     QTAILQ_FOREACH_SAFE(se, &savevm_state.handlers, entry, new_se) {
567         if (se->vmsd == vmsd && se->opaque == opaque) {
568             QTAILQ_REMOVE(&savevm_state.handlers, se, entry);
569             if (se->compat) {
570                 g_free(se->compat);
571             }
572             g_free(se);
573         }
574     }
575 }
576 
577 static int vmstate_load(QEMUFile *f, SaveStateEntry *se, int version_id)
578 {
579     trace_vmstate_load(se->idstr, se->vmsd ? se->vmsd->name : "(old)");
580     if (!se->vmsd) {         /* Old style */
581         return se->ops->load_state(f, se->opaque, version_id);
582     }
583     return vmstate_load_state(f, se->vmsd, se->opaque, version_id);
584 }
585 
586 static void vmstate_save_old_style(QEMUFile *f, SaveStateEntry *se, QJSON *vmdesc)
587 {
588     int64_t old_offset, size;
589 
590     old_offset = qemu_ftell_fast(f);
591     se->ops->save_state(f, se->opaque);
592     size = qemu_ftell_fast(f) - old_offset;
593 
594     if (vmdesc) {
595         json_prop_int(vmdesc, "size", size);
596         json_start_array(vmdesc, "fields");
597         json_start_object(vmdesc, NULL);
598         json_prop_str(vmdesc, "name", "data");
599         json_prop_int(vmdesc, "size", size);
600         json_prop_str(vmdesc, "type", "buffer");
601         json_end_object(vmdesc);
602         json_end_array(vmdesc);
603     }
604 }
605 
606 static void vmstate_save(QEMUFile *f, SaveStateEntry *se, QJSON *vmdesc)
607 {
608     trace_vmstate_save(se->idstr, se->vmsd ? se->vmsd->name : "(old)");
609     if (!se->vmsd) {
610         vmstate_save_old_style(f, se, vmdesc);
611         return;
612     }
613     vmstate_save_state(f, se->vmsd, se->opaque, vmdesc);
614 }
615 
616 void savevm_skip_section_footers(void)
617 {
618     skip_section_footers = true;
619 }
620 
621 /*
622  * Write the header for device section (QEMU_VM_SECTION START/END/PART/FULL)
623  */
624 static void save_section_header(QEMUFile *f, SaveStateEntry *se,
625                                 uint8_t section_type)
626 {
627     qemu_put_byte(f, section_type);
628     qemu_put_be32(f, se->section_id);
629 
630     if (section_type == QEMU_VM_SECTION_FULL ||
631         section_type == QEMU_VM_SECTION_START) {
632         /* ID string */
633         size_t len = strlen(se->idstr);
634         qemu_put_byte(f, len);
635         qemu_put_buffer(f, (uint8_t *)se->idstr, len);
636 
637         qemu_put_be32(f, se->instance_id);
638         qemu_put_be32(f, se->version_id);
639     }
640 }
641 
642 /*
643  * Write a footer onto device sections that catches cases misformatted device
644  * sections.
645  */
646 static void save_section_footer(QEMUFile *f, SaveStateEntry *se)
647 {
648     if (!skip_section_footers) {
649         qemu_put_byte(f, QEMU_VM_SECTION_FOOTER);
650         qemu_put_be32(f, se->section_id);
651     }
652 }
653 
654 /*
655  * Read a footer off the wire and check that it matches the expected section
656  *
657  * Returns: true if the footer was good
658  *          false if there is a problem (and calls error_report to say why)
659  */
660 static bool check_section_footer(QEMUFile *f, SaveStateEntry *se)
661 {
662     uint8_t read_mark;
663     uint32_t read_section_id;
664 
665     if (skip_section_footers) {
666         /* No footer to check */
667         return true;
668     }
669 
670     read_mark = qemu_get_byte(f);
671 
672     if (read_mark != QEMU_VM_SECTION_FOOTER) {
673         error_report("Missing section footer for %s", se->idstr);
674         return false;
675     }
676 
677     read_section_id = qemu_get_be32(f);
678     if (read_section_id != se->section_id) {
679         error_report("Mismatched section id in footer for %s -"
680                      " read 0x%x expected 0x%x",
681                      se->idstr, read_section_id, se->section_id);
682         return false;
683     }
684 
685     /* All good */
686     return true;
687 }
688 
689 bool qemu_savevm_state_blocked(Error **errp)
690 {
691     SaveStateEntry *se;
692 
693     QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
694         if (se->vmsd && se->vmsd->unmigratable) {
695             error_setg(errp, "State blocked by non-migratable device '%s'",
696                        se->idstr);
697             return true;
698         }
699     }
700     return false;
701 }
702 
703 void qemu_savevm_state_header(QEMUFile *f)
704 {
705     trace_savevm_state_header();
706     qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
707     qemu_put_be32(f, QEMU_VM_FILE_VERSION);
708 }
709 
710 void qemu_savevm_state_begin(QEMUFile *f,
711                              const MigrationParams *params)
712 {
713     SaveStateEntry *se;
714     int ret;
715 
716     trace_savevm_state_begin();
717     QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
718         if (!se->ops || !se->ops->set_params) {
719             continue;
720         }
721         se->ops->set_params(params, se->opaque);
722     }
723 
724     QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
725         if (!se->ops || !se->ops->save_live_setup) {
726             continue;
727         }
728         if (se->ops && se->ops->is_active) {
729             if (!se->ops->is_active(se->opaque)) {
730                 continue;
731             }
732         }
733         save_section_header(f, se, QEMU_VM_SECTION_START);
734 
735         ret = se->ops->save_live_setup(f, se->opaque);
736         save_section_footer(f, se);
737         if (ret < 0) {
738             qemu_file_set_error(f, ret);
739             break;
740         }
741     }
742 }
743 
744 /*
745  * this function has three return values:
746  *   negative: there was one error, and we have -errno.
747  *   0 : We haven't finished, caller have to go again
748  *   1 : We have finished, we can go to complete phase
749  */
750 int qemu_savevm_state_iterate(QEMUFile *f)
751 {
752     SaveStateEntry *se;
753     int ret = 1;
754 
755     trace_savevm_state_iterate();
756     QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
757         if (!se->ops || !se->ops->save_live_iterate) {
758             continue;
759         }
760         if (se->ops && se->ops->is_active) {
761             if (!se->ops->is_active(se->opaque)) {
762                 continue;
763             }
764         }
765         if (qemu_file_rate_limit(f)) {
766             return 0;
767         }
768         trace_savevm_section_start(se->idstr, se->section_id);
769 
770         save_section_header(f, se, QEMU_VM_SECTION_PART);
771 
772         ret = se->ops->save_live_iterate(f, se->opaque);
773         trace_savevm_section_end(se->idstr, se->section_id, ret);
774         save_section_footer(f, se);
775 
776         if (ret < 0) {
777             qemu_file_set_error(f, ret);
778         }
779         if (ret <= 0) {
780             /* Do not proceed to the next vmstate before this one reported
781                completion of the current stage. This serializes the migration
782                and reduces the probability that a faster changing state is
783                synchronized over and over again. */
784             break;
785         }
786     }
787     return ret;
788 }
789 
790 static bool should_send_vmdesc(void)
791 {
792     MachineState *machine = MACHINE(qdev_get_machine());
793     return !machine->suppress_vmdesc;
794 }
795 
796 void qemu_savevm_state_complete(QEMUFile *f)
797 {
798     QJSON *vmdesc;
799     int vmdesc_len;
800     SaveStateEntry *se;
801     int ret;
802 
803     trace_savevm_state_complete();
804 
805     cpu_synchronize_all_states();
806 
807     QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
808         if (!se->ops || !se->ops->save_live_complete) {
809             continue;
810         }
811         if (se->ops && se->ops->is_active) {
812             if (!se->ops->is_active(se->opaque)) {
813                 continue;
814             }
815         }
816         trace_savevm_section_start(se->idstr, se->section_id);
817 
818         save_section_header(f, se, QEMU_VM_SECTION_END);
819 
820         ret = se->ops->save_live_complete(f, se->opaque);
821         trace_savevm_section_end(se->idstr, se->section_id, ret);
822         save_section_footer(f, se);
823         if (ret < 0) {
824             qemu_file_set_error(f, ret);
825             return;
826         }
827     }
828 
829     vmdesc = qjson_new();
830     json_prop_int(vmdesc, "page_size", TARGET_PAGE_SIZE);
831     json_start_array(vmdesc, "devices");
832     QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
833 
834         if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
835             continue;
836         }
837         trace_savevm_section_start(se->idstr, se->section_id);
838 
839         json_start_object(vmdesc, NULL);
840         json_prop_str(vmdesc, "name", se->idstr);
841         json_prop_int(vmdesc, "instance_id", se->instance_id);
842 
843         save_section_header(f, se, QEMU_VM_SECTION_FULL);
844 
845         vmstate_save(f, se, vmdesc);
846 
847         json_end_object(vmdesc);
848         trace_savevm_section_end(se->idstr, se->section_id, 0);
849         save_section_footer(f, se);
850     }
851 
852     qemu_put_byte(f, QEMU_VM_EOF);
853 
854     json_end_array(vmdesc);
855     qjson_finish(vmdesc);
856     vmdesc_len = strlen(qjson_get_str(vmdesc));
857 
858     if (should_send_vmdesc()) {
859         qemu_put_byte(f, QEMU_VM_VMDESCRIPTION);
860         qemu_put_be32(f, vmdesc_len);
861         qemu_put_buffer(f, (uint8_t *)qjson_get_str(vmdesc), vmdesc_len);
862     }
863     object_unref(OBJECT(vmdesc));
864 
865     qemu_fflush(f);
866 }
867 
868 uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size)
869 {
870     SaveStateEntry *se;
871     uint64_t ret = 0;
872 
873     QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
874         if (!se->ops || !se->ops->save_live_pending) {
875             continue;
876         }
877         if (se->ops && se->ops->is_active) {
878             if (!se->ops->is_active(se->opaque)) {
879                 continue;
880             }
881         }
882         ret += se->ops->save_live_pending(f, se->opaque, max_size);
883     }
884     return ret;
885 }
886 
887 void qemu_savevm_state_cancel(void)
888 {
889     SaveStateEntry *se;
890 
891     trace_savevm_state_cancel();
892     QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
893         if (se->ops && se->ops->cancel) {
894             se->ops->cancel(se->opaque);
895         }
896     }
897 }
898 
899 static int qemu_savevm_state(QEMUFile *f, Error **errp)
900 {
901     int ret;
902     MigrationParams params = {
903         .blk = 0,
904         .shared = 0
905     };
906 
907     if (qemu_savevm_state_blocked(errp)) {
908         return -EINVAL;
909     }
910 
911     qemu_mutex_unlock_iothread();
912     qemu_savevm_state_header(f);
913     qemu_savevm_state_begin(f, &params);
914     qemu_mutex_lock_iothread();
915 
916     while (qemu_file_get_error(f) == 0) {
917         if (qemu_savevm_state_iterate(f) > 0) {
918             break;
919         }
920     }
921 
922     ret = qemu_file_get_error(f);
923     if (ret == 0) {
924         qemu_savevm_state_complete(f);
925         ret = qemu_file_get_error(f);
926     }
927     if (ret != 0) {
928         qemu_savevm_state_cancel();
929         error_setg_errno(errp, -ret, "Error while writing VM state");
930     }
931     return ret;
932 }
933 
934 static int qemu_save_device_state(QEMUFile *f)
935 {
936     SaveStateEntry *se;
937 
938     qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
939     qemu_put_be32(f, QEMU_VM_FILE_VERSION);
940 
941     cpu_synchronize_all_states();
942 
943     QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
944         if (se->is_ram) {
945             continue;
946         }
947         if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
948             continue;
949         }
950 
951         save_section_header(f, se, QEMU_VM_SECTION_FULL);
952 
953         vmstate_save(f, se, NULL);
954 
955         save_section_footer(f, se);
956     }
957 
958     qemu_put_byte(f, QEMU_VM_EOF);
959 
960     return qemu_file_get_error(f);
961 }
962 
963 static SaveStateEntry *find_se(const char *idstr, int instance_id)
964 {
965     SaveStateEntry *se;
966 
967     QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
968         if (!strcmp(se->idstr, idstr) &&
969             (instance_id == se->instance_id ||
970              instance_id == se->alias_id))
971             return se;
972         /* Migrating from an older version? */
973         if (strstr(se->idstr, idstr) && se->compat) {
974             if (!strcmp(se->compat->idstr, idstr) &&
975                 (instance_id == se->compat->instance_id ||
976                  instance_id == se->alias_id))
977                 return se;
978         }
979     }
980     return NULL;
981 }
982 
983 struct LoadStateEntry {
984     QLIST_ENTRY(LoadStateEntry) entry;
985     SaveStateEntry *se;
986     int section_id;
987     int version_id;
988 };
989 
990 void loadvm_free_handlers(MigrationIncomingState *mis)
991 {
992     LoadStateEntry *le, *new_le;
993 
994     QLIST_FOREACH_SAFE(le, &mis->loadvm_handlers, entry, new_le) {
995         QLIST_REMOVE(le, entry);
996         g_free(le);
997     }
998 }
999 
1000 int qemu_loadvm_state(QEMUFile *f)
1001 {
1002     MigrationIncomingState *mis = migration_incoming_get_current();
1003     Error *local_err = NULL;
1004     uint8_t section_type;
1005     unsigned int v;
1006     int ret;
1007     int file_error_after_eof = -1;
1008 
1009     if (qemu_savevm_state_blocked(&local_err)) {
1010         error_report_err(local_err);
1011         return -EINVAL;
1012     }
1013 
1014     v = qemu_get_be32(f);
1015     if (v != QEMU_VM_FILE_MAGIC) {
1016         error_report("Not a migration stream");
1017         return -EINVAL;
1018     }
1019 
1020     v = qemu_get_be32(f);
1021     if (v == QEMU_VM_FILE_VERSION_COMPAT) {
1022         error_report("SaveVM v2 format is obsolete and don't work anymore");
1023         return -ENOTSUP;
1024     }
1025     if (v != QEMU_VM_FILE_VERSION) {
1026         error_report("Unsupported migration stream version");
1027         return -ENOTSUP;
1028     }
1029 
1030     while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) {
1031         uint32_t instance_id, version_id, section_id;
1032         SaveStateEntry *se;
1033         LoadStateEntry *le;
1034         char idstr[256];
1035 
1036         trace_qemu_loadvm_state_section(section_type);
1037         switch (section_type) {
1038         case QEMU_VM_SECTION_START:
1039         case QEMU_VM_SECTION_FULL:
1040             /* Read section start */
1041             section_id = qemu_get_be32(f);
1042             if (!qemu_get_counted_string(f, idstr)) {
1043                 error_report("Unable to read ID string for section %u",
1044                             section_id);
1045                 return -EINVAL;
1046             }
1047             instance_id = qemu_get_be32(f);
1048             version_id = qemu_get_be32(f);
1049 
1050             trace_qemu_loadvm_state_section_startfull(section_id, idstr,
1051                                                       instance_id, version_id);
1052             /* Find savevm section */
1053             se = find_se(idstr, instance_id);
1054             if (se == NULL) {
1055                 error_report("Unknown savevm section or instance '%s' %d",
1056                              idstr, instance_id);
1057                 ret = -EINVAL;
1058                 goto out;
1059             }
1060 
1061             /* Validate version */
1062             if (version_id > se->version_id) {
1063                 error_report("savevm: unsupported version %d for '%s' v%d",
1064                              version_id, idstr, se->version_id);
1065                 ret = -EINVAL;
1066                 goto out;
1067             }
1068 
1069             /* Add entry */
1070             le = g_malloc0(sizeof(*le));
1071 
1072             le->se = se;
1073             le->section_id = section_id;
1074             le->version_id = version_id;
1075             QLIST_INSERT_HEAD(&mis->loadvm_handlers, le, entry);
1076 
1077             ret = vmstate_load(f, le->se, le->version_id);
1078             if (ret < 0) {
1079                 error_report("error while loading state for instance 0x%x of"
1080                              " device '%s'", instance_id, idstr);
1081                 goto out;
1082             }
1083             if (!check_section_footer(f, le->se)) {
1084                 ret = -EINVAL;
1085                 goto out;
1086             }
1087             break;
1088         case QEMU_VM_SECTION_PART:
1089         case QEMU_VM_SECTION_END:
1090             section_id = qemu_get_be32(f);
1091 
1092             trace_qemu_loadvm_state_section_partend(section_id);
1093             QLIST_FOREACH(le, &mis->loadvm_handlers, entry) {
1094                 if (le->section_id == section_id) {
1095                     break;
1096                 }
1097             }
1098             if (le == NULL) {
1099                 error_report("Unknown savevm section %d", section_id);
1100                 ret = -EINVAL;
1101                 goto out;
1102             }
1103 
1104             ret = vmstate_load(f, le->se, le->version_id);
1105             if (ret < 0) {
1106                 error_report("error while loading state section id %d(%s)",
1107                              section_id, le->se->idstr);
1108                 goto out;
1109             }
1110             if (!check_section_footer(f, le->se)) {
1111                 ret = -EINVAL;
1112                 goto out;
1113             }
1114             break;
1115         default:
1116             error_report("Unknown savevm section type %d", section_type);
1117             ret = -EINVAL;
1118             goto out;
1119         }
1120     }
1121 
1122     file_error_after_eof = qemu_file_get_error(f);
1123 
1124     /*
1125      * Try to read in the VMDESC section as well, so that dumping tools that
1126      * intercept our migration stream have the chance to see it.
1127      */
1128     if (qemu_get_byte(f) == QEMU_VM_VMDESCRIPTION) {
1129         uint32_t size = qemu_get_be32(f);
1130         uint8_t *buf = g_malloc(0x1000);
1131 
1132         while (size > 0) {
1133             uint32_t read_chunk = MIN(size, 0x1000);
1134             qemu_get_buffer(f, buf, read_chunk);
1135             size -= read_chunk;
1136         }
1137         g_free(buf);
1138     }
1139 
1140     cpu_synchronize_all_post_init();
1141 
1142     ret = 0;
1143 
1144 out:
1145     if (ret == 0) {
1146         /* We may not have a VMDESC section, so ignore relative errors */
1147         ret = file_error_after_eof;
1148     }
1149 
1150     return ret;
1151 }
1152 
1153 static BlockDriverState *find_vmstate_bs(void)
1154 {
1155     BlockDriverState *bs = NULL;
1156     while ((bs = bdrv_next(bs))) {
1157         if (bdrv_can_snapshot(bs)) {
1158             return bs;
1159         }
1160     }
1161     return NULL;
1162 }
1163 
1164 /*
1165  * Deletes snapshots of a given name in all opened images.
1166  */
1167 static int del_existing_snapshots(Monitor *mon, const char *name)
1168 {
1169     BlockDriverState *bs;
1170     QEMUSnapshotInfo sn1, *snapshot = &sn1;
1171     Error *err = NULL;
1172 
1173     bs = NULL;
1174     while ((bs = bdrv_next(bs))) {
1175         if (bdrv_can_snapshot(bs) &&
1176             bdrv_snapshot_find(bs, snapshot, name) >= 0) {
1177             bdrv_snapshot_delete_by_id_or_name(bs, name, &err);
1178             if (err) {
1179                 monitor_printf(mon,
1180                                "Error while deleting snapshot on device '%s':"
1181                                " %s\n",
1182                                bdrv_get_device_name(bs),
1183                                error_get_pretty(err));
1184                 error_free(err);
1185                 return -1;
1186             }
1187         }
1188     }
1189 
1190     return 0;
1191 }
1192 
1193 void hmp_savevm(Monitor *mon, const QDict *qdict)
1194 {
1195     BlockDriverState *bs, *bs1;
1196     QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
1197     int ret;
1198     QEMUFile *f;
1199     int saved_vm_running;
1200     uint64_t vm_state_size;
1201     qemu_timeval tv;
1202     struct tm tm;
1203     const char *name = qdict_get_try_str(qdict, "name");
1204     Error *local_err = NULL;
1205 
1206     /* Verify if there is a device that doesn't support snapshots and is writable */
1207     bs = NULL;
1208     while ((bs = bdrv_next(bs))) {
1209 
1210         if (!bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
1211             continue;
1212         }
1213 
1214         if (!bdrv_can_snapshot(bs)) {
1215             monitor_printf(mon, "Device '%s' is writable but does not support snapshots.\n",
1216                                bdrv_get_device_name(bs));
1217             return;
1218         }
1219     }
1220 
1221     bs = find_vmstate_bs();
1222     if (!bs) {
1223         monitor_printf(mon, "No block device can accept snapshots\n");
1224         return;
1225     }
1226 
1227     saved_vm_running = runstate_is_running();
1228     vm_stop(RUN_STATE_SAVE_VM);
1229 
1230     memset(sn, 0, sizeof(*sn));
1231 
1232     /* fill auxiliary fields */
1233     qemu_gettimeofday(&tv);
1234     sn->date_sec = tv.tv_sec;
1235     sn->date_nsec = tv.tv_usec * 1000;
1236     sn->vm_clock_nsec = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
1237 
1238     if (name) {
1239         ret = bdrv_snapshot_find(bs, old_sn, name);
1240         if (ret >= 0) {
1241             pstrcpy(sn->name, sizeof(sn->name), old_sn->name);
1242             pstrcpy(sn->id_str, sizeof(sn->id_str), old_sn->id_str);
1243         } else {
1244             pstrcpy(sn->name, sizeof(sn->name), name);
1245         }
1246     } else {
1247         /* cast below needed for OpenBSD where tv_sec is still 'long' */
1248         localtime_r((const time_t *)&tv.tv_sec, &tm);
1249         strftime(sn->name, sizeof(sn->name), "vm-%Y%m%d%H%M%S", &tm);
1250     }
1251 
1252     /* Delete old snapshots of the same name */
1253     if (name && del_existing_snapshots(mon, name) < 0) {
1254         goto the_end;
1255     }
1256 
1257     /* save the VM state */
1258     f = qemu_fopen_bdrv(bs, 1);
1259     if (!f) {
1260         monitor_printf(mon, "Could not open VM state file\n");
1261         goto the_end;
1262     }
1263     ret = qemu_savevm_state(f, &local_err);
1264     vm_state_size = qemu_ftell(f);
1265     qemu_fclose(f);
1266     if (ret < 0) {
1267         monitor_printf(mon, "%s\n", error_get_pretty(local_err));
1268         error_free(local_err);
1269         goto the_end;
1270     }
1271 
1272     /* create the snapshots */
1273 
1274     bs1 = NULL;
1275     while ((bs1 = bdrv_next(bs1))) {
1276         if (bdrv_can_snapshot(bs1)) {
1277             /* Write VM state size only to the image that contains the state */
1278             sn->vm_state_size = (bs == bs1 ? vm_state_size : 0);
1279             ret = bdrv_snapshot_create(bs1, sn);
1280             if (ret < 0) {
1281                 monitor_printf(mon, "Error while creating snapshot on '%s'\n",
1282                                bdrv_get_device_name(bs1));
1283             }
1284         }
1285     }
1286 
1287  the_end:
1288     if (saved_vm_running) {
1289         vm_start();
1290     }
1291 }
1292 
1293 void qmp_xen_save_devices_state(const char *filename, Error **errp)
1294 {
1295     QEMUFile *f;
1296     int saved_vm_running;
1297     int ret;
1298 
1299     saved_vm_running = runstate_is_running();
1300     vm_stop(RUN_STATE_SAVE_VM);
1301 
1302     f = qemu_fopen(filename, "wb");
1303     if (!f) {
1304         error_setg_file_open(errp, errno, filename);
1305         goto the_end;
1306     }
1307     ret = qemu_save_device_state(f);
1308     qemu_fclose(f);
1309     if (ret < 0) {
1310         error_setg(errp, QERR_IO_ERROR);
1311     }
1312 
1313  the_end:
1314     if (saved_vm_running) {
1315         vm_start();
1316     }
1317 }
1318 
1319 int load_vmstate(const char *name)
1320 {
1321     BlockDriverState *bs, *bs_vm_state;
1322     QEMUSnapshotInfo sn;
1323     QEMUFile *f;
1324     int ret;
1325 
1326     bs_vm_state = find_vmstate_bs();
1327     if (!bs_vm_state) {
1328         error_report("No block device supports snapshots");
1329         return -ENOTSUP;
1330     }
1331 
1332     /* Don't even try to load empty VM states */
1333     ret = bdrv_snapshot_find(bs_vm_state, &sn, name);
1334     if (ret < 0) {
1335         return ret;
1336     } else if (sn.vm_state_size == 0) {
1337         error_report("This is a disk-only snapshot. Revert to it offline "
1338             "using qemu-img.");
1339         return -EINVAL;
1340     }
1341 
1342     /* Verify if there is any device that doesn't support snapshots and is
1343     writable and check if the requested snapshot is available too. */
1344     bs = NULL;
1345     while ((bs = bdrv_next(bs))) {
1346 
1347         if (!bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
1348             continue;
1349         }
1350 
1351         if (!bdrv_can_snapshot(bs)) {
1352             error_report("Device '%s' is writable but does not support snapshots.",
1353                                bdrv_get_device_name(bs));
1354             return -ENOTSUP;
1355         }
1356 
1357         ret = bdrv_snapshot_find(bs, &sn, name);
1358         if (ret < 0) {
1359             error_report("Device '%s' does not have the requested snapshot '%s'",
1360                            bdrv_get_device_name(bs), name);
1361             return ret;
1362         }
1363     }
1364 
1365     /* Flush all IO requests so they don't interfere with the new state.  */
1366     bdrv_drain_all();
1367 
1368     bs = NULL;
1369     while ((bs = bdrv_next(bs))) {
1370         if (bdrv_can_snapshot(bs)) {
1371             ret = bdrv_snapshot_goto(bs, name);
1372             if (ret < 0) {
1373                 error_report("Error %d while activating snapshot '%s' on '%s'",
1374                              ret, name, bdrv_get_device_name(bs));
1375                 return ret;
1376             }
1377         }
1378     }
1379 
1380     /* restore the VM state */
1381     f = qemu_fopen_bdrv(bs_vm_state, 0);
1382     if (!f) {
1383         error_report("Could not open VM state file");
1384         return -EINVAL;
1385     }
1386 
1387     qemu_system_reset(VMRESET_SILENT);
1388     migration_incoming_state_new(f);
1389     ret = qemu_loadvm_state(f);
1390 
1391     qemu_fclose(f);
1392     migration_incoming_state_destroy();
1393     if (ret < 0) {
1394         error_report("Error %d while loading VM state", ret);
1395         return ret;
1396     }
1397 
1398     return 0;
1399 }
1400 
1401 void hmp_delvm(Monitor *mon, const QDict *qdict)
1402 {
1403     BlockDriverState *bs;
1404     Error *err;
1405     const char *name = qdict_get_str(qdict, "name");
1406 
1407     if (!find_vmstate_bs()) {
1408         monitor_printf(mon, "No block device supports snapshots\n");
1409         return;
1410     }
1411 
1412     bs = NULL;
1413     while ((bs = bdrv_next(bs))) {
1414         if (bdrv_can_snapshot(bs)) {
1415             err = NULL;
1416             bdrv_snapshot_delete_by_id_or_name(bs, name, &err);
1417             if (err) {
1418                 monitor_printf(mon,
1419                                "Error while deleting snapshot on device '%s':"
1420                                " %s\n",
1421                                bdrv_get_device_name(bs),
1422                                error_get_pretty(err));
1423                 error_free(err);
1424             }
1425         }
1426     }
1427 }
1428 
1429 void hmp_info_snapshots(Monitor *mon, const QDict *qdict)
1430 {
1431     BlockDriverState *bs, *bs1;
1432     QEMUSnapshotInfo *sn_tab, *sn, s, *sn_info = &s;
1433     int nb_sns, i, ret, available;
1434     int total;
1435     int *available_snapshots;
1436 
1437     bs = find_vmstate_bs();
1438     if (!bs) {
1439         monitor_printf(mon, "No available block device supports snapshots\n");
1440         return;
1441     }
1442 
1443     nb_sns = bdrv_snapshot_list(bs, &sn_tab);
1444     if (nb_sns < 0) {
1445         monitor_printf(mon, "bdrv_snapshot_list: error %d\n", nb_sns);
1446         return;
1447     }
1448 
1449     if (nb_sns == 0) {
1450         monitor_printf(mon, "There is no snapshot available.\n");
1451         return;
1452     }
1453 
1454     available_snapshots = g_malloc0(sizeof(int) * nb_sns);
1455     total = 0;
1456     for (i = 0; i < nb_sns; i++) {
1457         sn = &sn_tab[i];
1458         available = 1;
1459         bs1 = NULL;
1460 
1461         while ((bs1 = bdrv_next(bs1))) {
1462             if (bdrv_can_snapshot(bs1) && bs1 != bs) {
1463                 ret = bdrv_snapshot_find(bs1, sn_info, sn->id_str);
1464                 if (ret < 0) {
1465                     available = 0;
1466                     break;
1467                 }
1468             }
1469         }
1470 
1471         if (available) {
1472             available_snapshots[total] = i;
1473             total++;
1474         }
1475     }
1476 
1477     if (total > 0) {
1478         bdrv_snapshot_dump((fprintf_function)monitor_printf, mon, NULL);
1479         monitor_printf(mon, "\n");
1480         for (i = 0; i < total; i++) {
1481             sn = &sn_tab[available_snapshots[i]];
1482             bdrv_snapshot_dump((fprintf_function)monitor_printf, mon, sn);
1483             monitor_printf(mon, "\n");
1484         }
1485     } else {
1486         monitor_printf(mon, "There is no suitable snapshot available\n");
1487     }
1488 
1489     g_free(sn_tab);
1490     g_free(available_snapshots);
1491 
1492 }
1493 
1494 void vmstate_register_ram(MemoryRegion *mr, DeviceState *dev)
1495 {
1496     qemu_ram_set_idstr(memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK,
1497                        memory_region_name(mr), dev);
1498 }
1499 
1500 void vmstate_unregister_ram(MemoryRegion *mr, DeviceState *dev)
1501 {
1502     qemu_ram_unset_idstr(memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK);
1503 }
1504 
1505 void vmstate_register_ram_global(MemoryRegion *mr)
1506 {
1507     vmstate_register_ram(mr, NULL);
1508 }
1509