Statistics
| Branch: | Revision:

root / savevm.c @ 0834c9ea

History | View | Annotate | Download (62.7 kB)

1 a672b469 aliguori
/*
2 a672b469 aliguori
 * QEMU System Emulator
3 a672b469 aliguori
 *
4 a672b469 aliguori
 * Copyright (c) 2003-2008 Fabrice Bellard
5 a672b469 aliguori
 *
6 a672b469 aliguori
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 a672b469 aliguori
 * of this software and associated documentation files (the "Software"), to deal
8 a672b469 aliguori
 * in the Software without restriction, including without limitation the rights
9 a672b469 aliguori
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 a672b469 aliguori
 * copies of the Software, and to permit persons to whom the Software is
11 a672b469 aliguori
 * furnished to do so, subject to the following conditions:
12 a672b469 aliguori
 *
13 a672b469 aliguori
 * The above copyright notice and this permission notice shall be included in
14 a672b469 aliguori
 * all copies or substantial portions of the Software.
15 a672b469 aliguori
 *
16 a672b469 aliguori
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 a672b469 aliguori
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 a672b469 aliguori
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 a672b469 aliguori
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 a672b469 aliguori
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 a672b469 aliguori
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 a672b469 aliguori
 * THE SOFTWARE.
23 a672b469 aliguori
 */
24 a672b469 aliguori
#include <unistd.h>
25 a672b469 aliguori
#include <fcntl.h>
26 a672b469 aliguori
#include <time.h>
27 a672b469 aliguori
#include <errno.h>
28 a672b469 aliguori
#include <sys/time.h>
29 a672b469 aliguori
#include <zlib.h>
30 a672b469 aliguori
31 71e72a19 Juan Quintela
/* Needed early for CONFIG_BSD etc. */
32 d40cdb10 blueswir1
#include "config-host.h"
33 d40cdb10 blueswir1
34 a672b469 aliguori
#ifndef _WIN32
35 a672b469 aliguori
#include <sys/times.h>
36 a672b469 aliguori
#include <sys/wait.h>
37 a672b469 aliguori
#include <termios.h>
38 a672b469 aliguori
#include <sys/mman.h>
39 a672b469 aliguori
#include <sys/ioctl.h>
40 a672b469 aliguori
#include <sys/resource.h>
41 a672b469 aliguori
#include <sys/socket.h>
42 a672b469 aliguori
#include <netinet/in.h>
43 a672b469 aliguori
#include <net/if.h>
44 a672b469 aliguori
#include <arpa/inet.h>
45 a672b469 aliguori
#include <dirent.h>
46 a672b469 aliguori
#include <netdb.h>
47 a672b469 aliguori
#include <sys/select.h>
48 71e72a19 Juan Quintela
#ifdef CONFIG_BSD
49 a672b469 aliguori
#include <sys/stat.h>
50 a167ba50 Aurelien Jarno
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
51 a672b469 aliguori
#include <libutil.h>
52 a672b469 aliguori
#else
53 a672b469 aliguori
#include <util.h>
54 a672b469 aliguori
#endif
55 a672b469 aliguori
#ifdef __linux__
56 a672b469 aliguori
#include <pty.h>
57 a672b469 aliguori
#include <malloc.h>
58 a672b469 aliguori
#include <linux/rtc.h>
59 a672b469 aliguori
#endif
60 a672b469 aliguori
#endif
61 a672b469 aliguori
#endif
62 a672b469 aliguori
63 a672b469 aliguori
#ifdef _WIN32
64 49dc768d aliguori
#include <windows.h>
65 a672b469 aliguori
#include <malloc.h>
66 a672b469 aliguori
#include <sys/timeb.h>
67 a672b469 aliguori
#include <mmsystem.h>
68 a672b469 aliguori
#define getopt_long_only getopt_long
69 a672b469 aliguori
#define memalign(align, size) malloc(size)
70 a672b469 aliguori
#endif
71 a672b469 aliguori
72 511d2b14 blueswir1
#include "qemu-common.h"
73 511d2b14 blueswir1
#include "hw/hw.h"
74 7685ee6a Alex Williamson
#include "hw/qdev.h"
75 511d2b14 blueswir1
#include "net.h"
76 511d2b14 blueswir1
#include "monitor.h"
77 511d2b14 blueswir1
#include "sysemu.h"
78 511d2b14 blueswir1
#include "qemu-timer.h"
79 511d2b14 blueswir1
#include "qemu-char.h"
80 511d2b14 blueswir1
#include "audio/audio.h"
81 511d2b14 blueswir1
#include "migration.h"
82 511d2b14 blueswir1
#include "qemu_socket.h"
83 72cf2d4f Blue Swirl
#include "qemu-queue.h"
84 2ff68d07 Paolo Bonzini
#include "qemu-timer.h"
85 17a4663e Blue Swirl
#include "cpus.h"
86 c5705a77 Avi Kivity
#include "memory.h"
87 a7ae8355 Stefano Stabellini
#include "qmp-commands.h"
88 517a13c9 Juan Quintela
#include "trace.h"
89 511d2b14 blueswir1
90 a672b469 aliguori
#define SELF_ANNOUNCE_ROUNDS 5
91 a672b469 aliguori
92 18995b98 Nolan
#ifndef ETH_P_RARP
93 f8778a77 Stefan Berger
#define ETH_P_RARP 0x8035
94 18995b98 Nolan
#endif
95 18995b98 Nolan
#define ARP_HTYPE_ETH 0x0001
96 18995b98 Nolan
#define ARP_PTYPE_IP 0x0800
97 18995b98 Nolan
#define ARP_OP_REQUEST_REV 0x3
98 18995b98 Nolan
99 18995b98 Nolan
static int announce_self_create(uint8_t *buf,
100 a672b469 aliguori
                                uint8_t *mac_addr)
101 a672b469 aliguori
{
102 18995b98 Nolan
    /* Ethernet header. */
103 18995b98 Nolan
    memset(buf, 0xff, 6);         /* destination MAC addr */
104 18995b98 Nolan
    memcpy(buf + 6, mac_addr, 6); /* source MAC addr */
105 18995b98 Nolan
    *(uint16_t *)(buf + 12) = htons(ETH_P_RARP); /* ethertype */
106 18995b98 Nolan
107 18995b98 Nolan
    /* RARP header. */
108 18995b98 Nolan
    *(uint16_t *)(buf + 14) = htons(ARP_HTYPE_ETH); /* hardware addr space */
109 18995b98 Nolan
    *(uint16_t *)(buf + 16) = htons(ARP_PTYPE_IP); /* protocol addr space */
110 18995b98 Nolan
    *(buf + 18) = 6; /* hardware addr length (ethernet) */
111 18995b98 Nolan
    *(buf + 19) = 4; /* protocol addr length (IPv4) */
112 18995b98 Nolan
    *(uint16_t *)(buf + 20) = htons(ARP_OP_REQUEST_REV); /* opcode */
113 18995b98 Nolan
    memcpy(buf + 22, mac_addr, 6); /* source hw addr */
114 18995b98 Nolan
    memset(buf + 28, 0x00, 4);     /* source protocol addr */
115 18995b98 Nolan
    memcpy(buf + 32, mac_addr, 6); /* target hw addr */
116 18995b98 Nolan
    memset(buf + 38, 0x00, 4);     /* target protocol addr */
117 18995b98 Nolan
118 18995b98 Nolan
    /* Padding to get up to 60 bytes (ethernet min packet size, minus FCS). */
119 18995b98 Nolan
    memset(buf + 42, 0x00, 18);
120 18995b98 Nolan
121 18995b98 Nolan
    return 60; /* len (FCS will be added by hardware) */
122 a672b469 aliguori
}
123 a672b469 aliguori
124 f401ca22 Mark McLoughlin
static void qemu_announce_self_iter(NICState *nic, void *opaque)
125 a672b469 aliguori
{
126 18995b98 Nolan
    uint8_t buf[60];
127 f401ca22 Mark McLoughlin
    int len;
128 f401ca22 Mark McLoughlin
129 f401ca22 Mark McLoughlin
    len = announce_self_create(buf, nic->conf->macaddr.a);
130 f401ca22 Mark McLoughlin
131 f401ca22 Mark McLoughlin
    qemu_send_packet_raw(&nic->nc, buf, len);
132 f401ca22 Mark McLoughlin
}
133 f401ca22 Mark McLoughlin
134 f401ca22 Mark McLoughlin
135 f401ca22 Mark McLoughlin
static void qemu_announce_self_once(void *opaque)
136 f401ca22 Mark McLoughlin
{
137 ed8b330b Gleb Natapov
    static int count = SELF_ANNOUNCE_ROUNDS;
138 ed8b330b Gleb Natapov
    QEMUTimer *timer = *(QEMUTimer **)opaque;
139 a672b469 aliguori
140 f401ca22 Mark McLoughlin
    qemu_foreach_nic(qemu_announce_self_iter, NULL);
141 f401ca22 Mark McLoughlin
142 18995b98 Nolan
    if (--count) {
143 18995b98 Nolan
        /* delay 50ms, 150ms, 250ms, ... */
144 7bd427d8 Paolo Bonzini
        qemu_mod_timer(timer, qemu_get_clock_ms(rt_clock) +
145 18995b98 Nolan
                       50 + (SELF_ANNOUNCE_ROUNDS - count - 1) * 100);
146 ed8b330b Gleb Natapov
    } else {
147 ed8b330b Gleb Natapov
            qemu_del_timer(timer);
148 ed8b330b Gleb Natapov
            qemu_free_timer(timer);
149 ed8b330b Gleb Natapov
    }
150 ed8b330b Gleb Natapov
}
151 ed8b330b Gleb Natapov
152 ed8b330b Gleb Natapov
void qemu_announce_self(void)
153 ed8b330b Gleb Natapov
{
154 ed8b330b Gleb Natapov
        static QEMUTimer *timer;
155 7bd427d8 Paolo Bonzini
        timer = qemu_new_timer_ms(rt_clock, qemu_announce_self_once, &timer);
156 ed8b330b Gleb Natapov
        qemu_announce_self_once(&timer);
157 a672b469 aliguori
}
158 a672b469 aliguori
159 a672b469 aliguori
/***********************************************************/
160 a672b469 aliguori
/* savevm/loadvm support */
161 a672b469 aliguori
162 a672b469 aliguori
#define IO_BUF_SIZE 32768
163 a672b469 aliguori
164 a672b469 aliguori
struct QEMUFile {
165 a672b469 aliguori
    QEMUFilePutBufferFunc *put_buffer;
166 a672b469 aliguori
    QEMUFileGetBufferFunc *get_buffer;
167 a672b469 aliguori
    QEMUFileCloseFunc *close;
168 a672b469 aliguori
    QEMUFileRateLimit *rate_limit;
169 19629537 Glauber Costa
    QEMUFileSetRateLimit *set_rate_limit;
170 c163b5ca lirans@il.ibm.com
    QEMUFileGetRateLimit *get_rate_limit;
171 a672b469 aliguori
    void *opaque;
172 a672b469 aliguori
    int is_write;
173 a672b469 aliguori
174 a672b469 aliguori
    int64_t buf_offset; /* start of buffer when writing, end of buffer
175 a672b469 aliguori
                           when reading */
176 a672b469 aliguori
    int buf_index;
177 a672b469 aliguori
    int buf_size; /* 0 when writing */
178 a672b469 aliguori
    uint8_t buf[IO_BUF_SIZE];
179 a672b469 aliguori
180 3961b4dd Juan Quintela
    int last_error;
181 a672b469 aliguori
};
182 a672b469 aliguori
183 7f79dd28 Paolo Bonzini
typedef struct QEMUFileStdio
184 a672b469 aliguori
{
185 7f79dd28 Paolo Bonzini
    FILE *stdio_file;
186 a672b469 aliguori
    QEMUFile *file;
187 7f79dd28 Paolo Bonzini
} QEMUFileStdio;
188 a672b469 aliguori
189 a672b469 aliguori
typedef struct QEMUFileSocket
190 a672b469 aliguori
{
191 a672b469 aliguori
    int fd;
192 a672b469 aliguori
    QEMUFile *file;
193 a672b469 aliguori
} QEMUFileSocket;
194 a672b469 aliguori
195 a672b469 aliguori
static int socket_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
196 a672b469 aliguori
{
197 a672b469 aliguori
    QEMUFileSocket *s = opaque;
198 a672b469 aliguori
    ssize_t len;
199 a672b469 aliguori
200 a672b469 aliguori
    do {
201 00aa0040 Blue Swirl
        len = qemu_recv(s->fd, buf, size, 0);
202 a672b469 aliguori
    } while (len == -1 && socket_error() == EINTR);
203 a672b469 aliguori
204 a672b469 aliguori
    if (len == -1)
205 a672b469 aliguori
        len = -socket_error();
206 a672b469 aliguori
207 a672b469 aliguori
    return len;
208 a672b469 aliguori
}
209 a672b469 aliguori
210 a672b469 aliguori
static int socket_close(void *opaque)
211 a672b469 aliguori
{
212 a672b469 aliguori
    QEMUFileSocket *s = opaque;
213 7267c094 Anthony Liguori
    g_free(s);
214 a672b469 aliguori
    return 0;
215 a672b469 aliguori
}
216 a672b469 aliguori
217 7f79dd28 Paolo Bonzini
static int stdio_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size)
218 a672b469 aliguori
{
219 7f79dd28 Paolo Bonzini
    QEMUFileStdio *s = opaque;
220 7f79dd28 Paolo Bonzini
    return fwrite(buf, 1, size, s->stdio_file);
221 a672b469 aliguori
}
222 a672b469 aliguori
223 7f79dd28 Paolo Bonzini
static int stdio_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
224 a672b469 aliguori
{
225 7f79dd28 Paolo Bonzini
    QEMUFileStdio *s = opaque;
226 7f79dd28 Paolo Bonzini
    FILE *fp = s->stdio_file;
227 8a67ec4d Uri Lublin
    int bytes;
228 8a67ec4d Uri Lublin
229 8a67ec4d Uri Lublin
    do {
230 8a67ec4d Uri Lublin
        clearerr(fp);
231 8a67ec4d Uri Lublin
        bytes = fread(buf, 1, size, fp);
232 8a67ec4d Uri Lublin
    } while ((bytes == 0) && ferror(fp) && (errno == EINTR));
233 8a67ec4d Uri Lublin
    return bytes;
234 a672b469 aliguori
}
235 a672b469 aliguori
236 7f79dd28 Paolo Bonzini
static int stdio_pclose(void *opaque)
237 7f79dd28 Paolo Bonzini
{
238 7f79dd28 Paolo Bonzini
    QEMUFileStdio *s = opaque;
239 41ef56e6 Anthony Liguori
    int ret;
240 41ef56e6 Anthony Liguori
    ret = pclose(s->stdio_file);
241 26f1af0a Eduardo Habkost
    if (ret == -1) {
242 26f1af0a Eduardo Habkost
        ret = -errno;
243 26f1af0a Eduardo Habkost
    }
244 7267c094 Anthony Liguori
    g_free(s);
245 41ef56e6 Anthony Liguori
    return ret;
246 7f79dd28 Paolo Bonzini
}
247 7f79dd28 Paolo Bonzini
248 7f79dd28 Paolo Bonzini
static int stdio_fclose(void *opaque)
249 a672b469 aliguori
{
250 7f79dd28 Paolo Bonzini
    QEMUFileStdio *s = opaque;
251 0e286705 Eduardo Habkost
    int ret = 0;
252 0e286705 Eduardo Habkost
    if (fclose(s->stdio_file) == EOF) {
253 0e286705 Eduardo Habkost
        ret = -errno;
254 0e286705 Eduardo Habkost
    }
255 7267c094 Anthony Liguori
    g_free(s);
256 0e286705 Eduardo Habkost
    return ret;
257 a672b469 aliguori
}
258 a672b469 aliguori
259 7f79dd28 Paolo Bonzini
QEMUFile *qemu_popen(FILE *stdio_file, const char *mode)
260 a672b469 aliguori
{
261 7f79dd28 Paolo Bonzini
    QEMUFileStdio *s;
262 a672b469 aliguori
263 7f79dd28 Paolo Bonzini
    if (stdio_file == NULL || mode == NULL || (mode[0] != 'r' && mode[0] != 'w') || mode[1] != 0) {
264 a672b469 aliguori
        fprintf(stderr, "qemu_popen: Argument validity check failed\n");
265 a672b469 aliguori
        return NULL;
266 a672b469 aliguori
    }
267 a672b469 aliguori
268 7267c094 Anthony Liguori
    s = g_malloc0(sizeof(QEMUFileStdio));
269 a672b469 aliguori
270 7f79dd28 Paolo Bonzini
    s->stdio_file = stdio_file;
271 a672b469 aliguori
272 a672b469 aliguori
    if(mode[0] == 'r') {
273 c163b5ca lirans@il.ibm.com
        s->file = qemu_fopen_ops(s, NULL, stdio_get_buffer, stdio_pclose, 
274 c163b5ca lirans@il.ibm.com
                                 NULL, NULL, NULL);
275 a672b469 aliguori
    } else {
276 c163b5ca lirans@il.ibm.com
        s->file = qemu_fopen_ops(s, stdio_put_buffer, NULL, stdio_pclose, 
277 c163b5ca lirans@il.ibm.com
                                 NULL, NULL, NULL);
278 a672b469 aliguori
    }
279 a672b469 aliguori
    return s->file;
280 a672b469 aliguori
}
281 a672b469 aliguori
282 a672b469 aliguori
QEMUFile *qemu_popen_cmd(const char *command, const char *mode)
283 a672b469 aliguori
{
284 a672b469 aliguori
    FILE *popen_file;
285 a672b469 aliguori
286 a672b469 aliguori
    popen_file = popen(command, mode);
287 a672b469 aliguori
    if(popen_file == NULL) {
288 a672b469 aliguori
        return NULL;
289 a672b469 aliguori
    }
290 a672b469 aliguori
291 a672b469 aliguori
    return qemu_popen(popen_file, mode);
292 a672b469 aliguori
}
293 a672b469 aliguori
294 7f79dd28 Paolo Bonzini
int qemu_stdio_fd(QEMUFile *f)
295 8a43b1ea Chris Lalancette
{
296 7f79dd28 Paolo Bonzini
    QEMUFileStdio *p;
297 8a43b1ea Chris Lalancette
    int fd;
298 8a43b1ea Chris Lalancette
299 7f79dd28 Paolo Bonzini
    p = (QEMUFileStdio *)f->opaque;
300 7f79dd28 Paolo Bonzini
    fd = fileno(p->stdio_file);
301 8a43b1ea Chris Lalancette
302 8a43b1ea Chris Lalancette
    return fd;
303 8a43b1ea Chris Lalancette
}
304 8a43b1ea Chris Lalancette
305 5ac1fad3 Paolo Bonzini
QEMUFile *qemu_fdopen(int fd, const char *mode)
306 5ac1fad3 Paolo Bonzini
{
307 5ac1fad3 Paolo Bonzini
    QEMUFileStdio *s;
308 5ac1fad3 Paolo Bonzini
309 5ac1fad3 Paolo Bonzini
    if (mode == NULL ||
310 5ac1fad3 Paolo Bonzini
        (mode[0] != 'r' && mode[0] != 'w') ||
311 5ac1fad3 Paolo Bonzini
        mode[1] != 'b' || mode[2] != 0) {
312 5ac1fad3 Paolo Bonzini
        fprintf(stderr, "qemu_fdopen: Argument validity check failed\n");
313 5ac1fad3 Paolo Bonzini
        return NULL;
314 5ac1fad3 Paolo Bonzini
    }
315 5ac1fad3 Paolo Bonzini
316 7267c094 Anthony Liguori
    s = g_malloc0(sizeof(QEMUFileStdio));
317 5ac1fad3 Paolo Bonzini
    s->stdio_file = fdopen(fd, mode);
318 5ac1fad3 Paolo Bonzini
    if (!s->stdio_file)
319 5ac1fad3 Paolo Bonzini
        goto fail;
320 5ac1fad3 Paolo Bonzini
321 5ac1fad3 Paolo Bonzini
    if(mode[0] == 'r') {
322 c163b5ca lirans@il.ibm.com
        s->file = qemu_fopen_ops(s, NULL, stdio_get_buffer, stdio_fclose, 
323 c163b5ca lirans@il.ibm.com
                                 NULL, NULL, NULL);
324 5ac1fad3 Paolo Bonzini
    } else {
325 c163b5ca lirans@il.ibm.com
        s->file = qemu_fopen_ops(s, stdio_put_buffer, NULL, stdio_fclose, 
326 c163b5ca lirans@il.ibm.com
                                 NULL, NULL, NULL);
327 5ac1fad3 Paolo Bonzini
    }
328 5ac1fad3 Paolo Bonzini
    return s->file;
329 5ac1fad3 Paolo Bonzini
330 5ac1fad3 Paolo Bonzini
fail:
331 7267c094 Anthony Liguori
    g_free(s);
332 5ac1fad3 Paolo Bonzini
    return NULL;
333 5ac1fad3 Paolo Bonzini
}
334 5ac1fad3 Paolo Bonzini
335 a672b469 aliguori
QEMUFile *qemu_fopen_socket(int fd)
336 a672b469 aliguori
{
337 7267c094 Anthony Liguori
    QEMUFileSocket *s = g_malloc0(sizeof(QEMUFileSocket));
338 a672b469 aliguori
339 a672b469 aliguori
    s->fd = fd;
340 c163b5ca lirans@il.ibm.com
    s->file = qemu_fopen_ops(s, NULL, socket_get_buffer, socket_close, 
341 c163b5ca lirans@il.ibm.com
                             NULL, NULL, NULL);
342 a672b469 aliguori
    return s->file;
343 a672b469 aliguori
}
344 a672b469 aliguori
345 a672b469 aliguori
static int file_put_buffer(void *opaque, const uint8_t *buf,
346 a672b469 aliguori
                            int64_t pos, int size)
347 a672b469 aliguori
{
348 a672b469 aliguori
    QEMUFileStdio *s = opaque;
349 7f79dd28 Paolo Bonzini
    fseek(s->stdio_file, pos, SEEK_SET);
350 5fdb3aa1 Kirill A. Shutemov
    return fwrite(buf, 1, size, s->stdio_file);
351 a672b469 aliguori
}
352 a672b469 aliguori
353 a672b469 aliguori
static int file_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
354 a672b469 aliguori
{
355 a672b469 aliguori
    QEMUFileStdio *s = opaque;
356 7f79dd28 Paolo Bonzini
    fseek(s->stdio_file, pos, SEEK_SET);
357 7f79dd28 Paolo Bonzini
    return fread(buf, 1, size, s->stdio_file);
358 a672b469 aliguori
}
359 a672b469 aliguori
360 a672b469 aliguori
QEMUFile *qemu_fopen(const char *filename, const char *mode)
361 a672b469 aliguori
{
362 a672b469 aliguori
    QEMUFileStdio *s;
363 a672b469 aliguori
364 7f79dd28 Paolo Bonzini
    if (mode == NULL ||
365 7f79dd28 Paolo Bonzini
        (mode[0] != 'r' && mode[0] != 'w') ||
366 7f79dd28 Paolo Bonzini
        mode[1] != 'b' || mode[2] != 0) {
367 090414a3 Blue Swirl
        fprintf(stderr, "qemu_fopen: Argument validity check failed\n");
368 7f79dd28 Paolo Bonzini
        return NULL;
369 7f79dd28 Paolo Bonzini
    }
370 7f79dd28 Paolo Bonzini
371 7267c094 Anthony Liguori
    s = g_malloc0(sizeof(QEMUFileStdio));
372 a672b469 aliguori
373 7f79dd28 Paolo Bonzini
    s->stdio_file = fopen(filename, mode);
374 7f79dd28 Paolo Bonzini
    if (!s->stdio_file)
375 a672b469 aliguori
        goto fail;
376 c163b5ca lirans@il.ibm.com
    
377 7f79dd28 Paolo Bonzini
    if(mode[0] == 'w') {
378 c163b5ca lirans@il.ibm.com
        s->file = qemu_fopen_ops(s, file_put_buffer, NULL, stdio_fclose, 
379 c163b5ca lirans@il.ibm.com
                                 NULL, NULL, NULL);
380 7f79dd28 Paolo Bonzini
    } else {
381 c163b5ca lirans@il.ibm.com
        s->file = qemu_fopen_ops(s, NULL, file_get_buffer, stdio_fclose, 
382 c163b5ca lirans@il.ibm.com
                               NULL, NULL, NULL);
383 7f79dd28 Paolo Bonzini
    }
384 7f79dd28 Paolo Bonzini
    return s->file;
385 a672b469 aliguori
fail:
386 7267c094 Anthony Liguori
    g_free(s);
387 a672b469 aliguori
    return NULL;
388 a672b469 aliguori
}
389 a672b469 aliguori
390 178e08a5 aliguori
static int block_put_buffer(void *opaque, const uint8_t *buf,
391 a672b469 aliguori
                           int64_t pos, int size)
392 a672b469 aliguori
{
393 45566e9c Christoph Hellwig
    bdrv_save_vmstate(opaque, buf, pos, size);
394 a672b469 aliguori
    return size;
395 a672b469 aliguori
}
396 a672b469 aliguori
397 178e08a5 aliguori
static int block_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
398 a672b469 aliguori
{
399 45566e9c Christoph Hellwig
    return bdrv_load_vmstate(opaque, buf, pos, size);
400 a672b469 aliguori
}
401 a672b469 aliguori
402 a672b469 aliguori
static int bdrv_fclose(void *opaque)
403 a672b469 aliguori
{
404 ad492c92 Paolo Bonzini
    return bdrv_flush(opaque);
405 a672b469 aliguori
}
406 a672b469 aliguori
407 45566e9c Christoph Hellwig
static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int is_writable)
408 a672b469 aliguori
{
409 a672b469 aliguori
    if (is_writable)
410 c163b5ca lirans@il.ibm.com
        return qemu_fopen_ops(bs, block_put_buffer, NULL, bdrv_fclose, 
411 c163b5ca lirans@il.ibm.com
                              NULL, NULL, NULL);
412 c163b5ca lirans@il.ibm.com
    return qemu_fopen_ops(bs, NULL, block_get_buffer, bdrv_fclose, NULL, NULL, NULL);
413 a672b469 aliguori
}
414 a672b469 aliguori
415 a672b469 aliguori
QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer,
416 a672b469 aliguori
                         QEMUFileGetBufferFunc *get_buffer,
417 a672b469 aliguori
                         QEMUFileCloseFunc *close,
418 19629537 Glauber Costa
                         QEMUFileRateLimit *rate_limit,
419 c163b5ca lirans@il.ibm.com
                         QEMUFileSetRateLimit *set_rate_limit,
420 c163b5ca lirans@il.ibm.com
                         QEMUFileGetRateLimit *get_rate_limit)
421 a672b469 aliguori
{
422 a672b469 aliguori
    QEMUFile *f;
423 a672b469 aliguori
424 7267c094 Anthony Liguori
    f = g_malloc0(sizeof(QEMUFile));
425 a672b469 aliguori
426 a672b469 aliguori
    f->opaque = opaque;
427 a672b469 aliguori
    f->put_buffer = put_buffer;
428 a672b469 aliguori
    f->get_buffer = get_buffer;
429 a672b469 aliguori
    f->close = close;
430 a672b469 aliguori
    f->rate_limit = rate_limit;
431 19629537 Glauber Costa
    f->set_rate_limit = set_rate_limit;
432 c163b5ca lirans@il.ibm.com
    f->get_rate_limit = get_rate_limit;
433 a672b469 aliguori
    f->is_write = 0;
434 a672b469 aliguori
435 a672b469 aliguori
    return f;
436 a672b469 aliguori
}
437 a672b469 aliguori
438 624b9cc2 Juan Quintela
int qemu_file_get_error(QEMUFile *f)
439 a672b469 aliguori
{
440 3961b4dd Juan Quintela
    return f->last_error;
441 a672b469 aliguori
}
442 a672b469 aliguori
443 dcd1d224 Juan Quintela
void qemu_file_set_error(QEMUFile *f, int ret)
444 4dabe248 aliguori
{
445 3961b4dd Juan Quintela
    f->last_error = ret;
446 4dabe248 aliguori
}
447 4dabe248 aliguori
448 d82ca915 Eduardo Habkost
/** Sets last_error conditionally
449 d82ca915 Eduardo Habkost
 *
450 d82ca915 Eduardo Habkost
 * Sets last_error only if ret is negative _and_ no error
451 d82ca915 Eduardo Habkost
 * was set before.
452 d82ca915 Eduardo Habkost
 */
453 d82ca915 Eduardo Habkost
static void qemu_file_set_if_error(QEMUFile *f, int ret)
454 d82ca915 Eduardo Habkost
{
455 d82ca915 Eduardo Habkost
    if (ret < 0 && !f->last_error) {
456 d82ca915 Eduardo Habkost
        qemu_file_set_error(f, ret);
457 d82ca915 Eduardo Habkost
    }
458 d82ca915 Eduardo Habkost
}
459 d82ca915 Eduardo Habkost
460 d82ca915 Eduardo Habkost
/** Flushes QEMUFile buffer
461 d82ca915 Eduardo Habkost
 *
462 d82ca915 Eduardo Habkost
 * In case of error, last_error is set.
463 d82ca915 Eduardo Habkost
 */
464 a672b469 aliguori
void qemu_fflush(QEMUFile *f)
465 a672b469 aliguori
{
466 a672b469 aliguori
    if (!f->put_buffer)
467 a672b469 aliguori
        return;
468 a672b469 aliguori
469 a672b469 aliguori
    if (f->is_write && f->buf_index > 0) {
470 a672b469 aliguori
        int len;
471 a672b469 aliguori
472 a672b469 aliguori
        len = f->put_buffer(f->opaque, f->buf, f->buf_offset, f->buf_index);
473 a672b469 aliguori
        if (len > 0)
474 a672b469 aliguori
            f->buf_offset += f->buf_index;
475 a672b469 aliguori
        else
476 c29110d5 Eduardo Habkost
            qemu_file_set_error(f, -EINVAL);
477 a672b469 aliguori
        f->buf_index = 0;
478 a672b469 aliguori
    }
479 a672b469 aliguori
}
480 a672b469 aliguori
481 a672b469 aliguori
static void qemu_fill_buffer(QEMUFile *f)
482 a672b469 aliguori
{
483 a672b469 aliguori
    int len;
484 0046c45b Juan Quintela
    int pending;
485 a672b469 aliguori
486 a672b469 aliguori
    if (!f->get_buffer)
487 a672b469 aliguori
        return;
488 a672b469 aliguori
489 a672b469 aliguori
    if (f->is_write)
490 a672b469 aliguori
        abort();
491 a672b469 aliguori
492 0046c45b Juan Quintela
    pending = f->buf_size - f->buf_index;
493 0046c45b Juan Quintela
    if (pending > 0) {
494 0046c45b Juan Quintela
        memmove(f->buf, f->buf + f->buf_index, pending);
495 0046c45b Juan Quintela
    }
496 0046c45b Juan Quintela
    f->buf_index = 0;
497 0046c45b Juan Quintela
    f->buf_size = pending;
498 0046c45b Juan Quintela
499 0046c45b Juan Quintela
    len = f->get_buffer(f->opaque, f->buf + pending, f->buf_offset,
500 0046c45b Juan Quintela
                        IO_BUF_SIZE - pending);
501 a672b469 aliguori
    if (len > 0) {
502 0046c45b Juan Quintela
        f->buf_size += len;
503 a672b469 aliguori
        f->buf_offset += len;
504 fa39a30f Juan Quintela
    } else if (len == 0) {
505 fa39a30f Juan Quintela
        f->last_error = -EIO;
506 a672b469 aliguori
    } else if (len != -EAGAIN)
507 c29110d5 Eduardo Habkost
        qemu_file_set_error(f, len);
508 a672b469 aliguori
}
509 a672b469 aliguori
510 d82ca915 Eduardo Habkost
/** Calls close function and set last_error if needed
511 d82ca915 Eduardo Habkost
 *
512 d82ca915 Eduardo Habkost
 * Internal function. qemu_fflush() must be called before this.
513 d82ca915 Eduardo Habkost
 *
514 d82ca915 Eduardo Habkost
 * Returns f->close() return value, or 0 if close function is not set.
515 d82ca915 Eduardo Habkost
 */
516 2e1e79da Corey Bryant
static int qemu_fclose_internal(QEMUFile *f)
517 a672b469 aliguori
{
518 a672b469 aliguori
    int ret = 0;
519 d82ca915 Eduardo Habkost
    if (f->close) {
520 a672b469 aliguori
        ret = f->close(f->opaque);
521 d82ca915 Eduardo Habkost
        qemu_file_set_if_error(f, ret);
522 d82ca915 Eduardo Habkost
    }
523 d82ca915 Eduardo Habkost
    return ret;
524 d82ca915 Eduardo Habkost
}
525 d82ca915 Eduardo Habkost
526 d82ca915 Eduardo Habkost
/** Closes the file
527 d82ca915 Eduardo Habkost
 *
528 d82ca915 Eduardo Habkost
 * Returns negative error value if any error happened on previous operations or
529 d82ca915 Eduardo Habkost
 * while closing the file. Returns 0 or positive number on success.
530 d82ca915 Eduardo Habkost
 *
531 d82ca915 Eduardo Habkost
 * The meaning of return value on success depends on the specific backend
532 d82ca915 Eduardo Habkost
 * being used.
533 d82ca915 Eduardo Habkost
 */
534 d82ca915 Eduardo Habkost
int qemu_fclose(QEMUFile *f)
535 d82ca915 Eduardo Habkost
{
536 d82ca915 Eduardo Habkost
    int ret;
537 d82ca915 Eduardo Habkost
    qemu_fflush(f);
538 2e1e79da Corey Bryant
    ret = qemu_fclose_internal(f);
539 d82ca915 Eduardo Habkost
    /* If any error was spotted before closing, we should report it
540 d82ca915 Eduardo Habkost
     * instead of the close() return value.
541 d82ca915 Eduardo Habkost
     */
542 d82ca915 Eduardo Habkost
    if (f->last_error) {
543 d82ca915 Eduardo Habkost
        ret = f->last_error;
544 d82ca915 Eduardo Habkost
    }
545 7267c094 Anthony Liguori
    g_free(f);
546 a672b469 aliguori
    return ret;
547 a672b469 aliguori
}
548 a672b469 aliguori
549 a672b469 aliguori
void qemu_file_put_notify(QEMUFile *f)
550 a672b469 aliguori
{
551 a672b469 aliguori
    f->put_buffer(f->opaque, NULL, 0, 0);
552 a672b469 aliguori
}
553 a672b469 aliguori
554 a672b469 aliguori
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
555 a672b469 aliguori
{
556 a672b469 aliguori
    int l;
557 a672b469 aliguori
558 3961b4dd Juan Quintela
    if (!f->last_error && f->is_write == 0 && f->buf_index > 0) {
559 a672b469 aliguori
        fprintf(stderr,
560 a672b469 aliguori
                "Attempted to write to buffer while read buffer is not empty\n");
561 a672b469 aliguori
        abort();
562 a672b469 aliguori
    }
563 a672b469 aliguori
564 3961b4dd Juan Quintela
    while (!f->last_error && size > 0) {
565 a672b469 aliguori
        l = IO_BUF_SIZE - f->buf_index;
566 a672b469 aliguori
        if (l > size)
567 a672b469 aliguori
            l = size;
568 a672b469 aliguori
        memcpy(f->buf + f->buf_index, buf, l);
569 a672b469 aliguori
        f->is_write = 1;
570 a672b469 aliguori
        f->buf_index += l;
571 a672b469 aliguori
        buf += l;
572 a672b469 aliguori
        size -= l;
573 a672b469 aliguori
        if (f->buf_index >= IO_BUF_SIZE)
574 a672b469 aliguori
            qemu_fflush(f);
575 a672b469 aliguori
    }
576 a672b469 aliguori
}
577 a672b469 aliguori
578 a672b469 aliguori
void qemu_put_byte(QEMUFile *f, int v)
579 a672b469 aliguori
{
580 3961b4dd Juan Quintela
    if (!f->last_error && f->is_write == 0 && f->buf_index > 0) {
581 a672b469 aliguori
        fprintf(stderr,
582 a672b469 aliguori
                "Attempted to write to buffer while read buffer is not empty\n");
583 a672b469 aliguori
        abort();
584 a672b469 aliguori
    }
585 a672b469 aliguori
586 a672b469 aliguori
    f->buf[f->buf_index++] = v;
587 a672b469 aliguori
    f->is_write = 1;
588 a672b469 aliguori
    if (f->buf_index >= IO_BUF_SIZE)
589 a672b469 aliguori
        qemu_fflush(f);
590 a672b469 aliguori
}
591 a672b469 aliguori
592 c6380724 Juan Quintela
static void qemu_file_skip(QEMUFile *f, int size)
593 a672b469 aliguori
{
594 c6380724 Juan Quintela
    if (f->buf_index + size <= f->buf_size) {
595 c6380724 Juan Quintela
        f->buf_index += size;
596 c6380724 Juan Quintela
    }
597 c6380724 Juan Quintela
}
598 c6380724 Juan Quintela
599 c6380724 Juan Quintela
static int qemu_peek_buffer(QEMUFile *f, uint8_t *buf, int size, size_t offset)
600 a672b469 aliguori
{
601 c6380724 Juan Quintela
    int pending;
602 c6380724 Juan Quintela
    int index;
603 a672b469 aliguori
604 b9ce1454 Juan Quintela
    if (f->is_write) {
605 a672b469 aliguori
        abort();
606 b9ce1454 Juan Quintela
    }
607 a672b469 aliguori
608 c6380724 Juan Quintela
    index = f->buf_index + offset;
609 c6380724 Juan Quintela
    pending = f->buf_size - index;
610 c6380724 Juan Quintela
    if (pending < size) {
611 c6380724 Juan Quintela
        qemu_fill_buffer(f);
612 c6380724 Juan Quintela
        index = f->buf_index + offset;
613 c6380724 Juan Quintela
        pending = f->buf_size - index;
614 c6380724 Juan Quintela
    }
615 c6380724 Juan Quintela
616 c6380724 Juan Quintela
    if (pending <= 0) {
617 c6380724 Juan Quintela
        return 0;
618 c6380724 Juan Quintela
    }
619 c6380724 Juan Quintela
    if (size > pending) {
620 c6380724 Juan Quintela
        size = pending;
621 c6380724 Juan Quintela
    }
622 c6380724 Juan Quintela
623 c6380724 Juan Quintela
    memcpy(buf, f->buf + index, size);
624 c6380724 Juan Quintela
    return size;
625 c6380724 Juan Quintela
}
626 c6380724 Juan Quintela
627 c6380724 Juan Quintela
int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size)
628 c6380724 Juan Quintela
{
629 c6380724 Juan Quintela
    int pending = size;
630 c6380724 Juan Quintela
    int done = 0;
631 c6380724 Juan Quintela
632 c6380724 Juan Quintela
    while (pending > 0) {
633 c6380724 Juan Quintela
        int res;
634 c6380724 Juan Quintela
635 c6380724 Juan Quintela
        res = qemu_peek_buffer(f, buf, pending, 0);
636 c6380724 Juan Quintela
        if (res == 0) {
637 c6380724 Juan Quintela
            return done;
638 a672b469 aliguori
        }
639 c6380724 Juan Quintela
        qemu_file_skip(f, res);
640 c6380724 Juan Quintela
        buf += res;
641 c6380724 Juan Quintela
        pending -= res;
642 c6380724 Juan Quintela
        done += res;
643 a672b469 aliguori
    }
644 c6380724 Juan Quintela
    return done;
645 a672b469 aliguori
}
646 a672b469 aliguori
647 c6380724 Juan Quintela
static int qemu_peek_byte(QEMUFile *f, int offset)
648 811814bd Juan Quintela
{
649 c6380724 Juan Quintela
    int index = f->buf_index + offset;
650 c6380724 Juan Quintela
651 b9ce1454 Juan Quintela
    if (f->is_write) {
652 811814bd Juan Quintela
        abort();
653 b9ce1454 Juan Quintela
    }
654 811814bd Juan Quintela
655 c6380724 Juan Quintela
    if (index >= f->buf_size) {
656 811814bd Juan Quintela
        qemu_fill_buffer(f);
657 c6380724 Juan Quintela
        index = f->buf_index + offset;
658 c6380724 Juan Quintela
        if (index >= f->buf_size) {
659 811814bd Juan Quintela
            return 0;
660 b9ce1454 Juan Quintela
        }
661 811814bd Juan Quintela
    }
662 c6380724 Juan Quintela
    return f->buf[index];
663 811814bd Juan Quintela
}
664 811814bd Juan Quintela
665 a672b469 aliguori
int qemu_get_byte(QEMUFile *f)
666 a672b469 aliguori
{
667 65f3bb3d Juan Quintela
    int result;
668 a672b469 aliguori
669 c6380724 Juan Quintela
    result = qemu_peek_byte(f, 0);
670 c6380724 Juan Quintela
    qemu_file_skip(f, 1);
671 65f3bb3d Juan Quintela
    return result;
672 a672b469 aliguori
}
673 a672b469 aliguori
674 a672b469 aliguori
int64_t qemu_ftell(QEMUFile *f)
675 a672b469 aliguori
{
676 a672b469 aliguori
    return f->buf_offset - f->buf_size + f->buf_index;
677 a672b469 aliguori
}
678 a672b469 aliguori
679 a672b469 aliguori
int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence)
680 a672b469 aliguori
{
681 a672b469 aliguori
    if (whence == SEEK_SET) {
682 a672b469 aliguori
        /* nothing to do */
683 a672b469 aliguori
    } else if (whence == SEEK_CUR) {
684 a672b469 aliguori
        pos += qemu_ftell(f);
685 a672b469 aliguori
    } else {
686 a672b469 aliguori
        /* SEEK_END not supported */
687 a672b469 aliguori
        return -1;
688 a672b469 aliguori
    }
689 a672b469 aliguori
    if (f->put_buffer) {
690 a672b469 aliguori
        qemu_fflush(f);
691 a672b469 aliguori
        f->buf_offset = pos;
692 a672b469 aliguori
    } else {
693 a672b469 aliguori
        f->buf_offset = pos;
694 a672b469 aliguori
        f->buf_index = 0;
695 a672b469 aliguori
        f->buf_size = 0;
696 a672b469 aliguori
    }
697 a672b469 aliguori
    return pos;
698 a672b469 aliguori
}
699 a672b469 aliguori
700 a672b469 aliguori
int qemu_file_rate_limit(QEMUFile *f)
701 a672b469 aliguori
{
702 a672b469 aliguori
    if (f->rate_limit)
703 a672b469 aliguori
        return f->rate_limit(f->opaque);
704 a672b469 aliguori
705 a672b469 aliguori
    return 0;
706 a672b469 aliguori
}
707 a672b469 aliguori
708 3d002df3 Michael S. Tsirkin
int64_t qemu_file_get_rate_limit(QEMUFile *f)
709 c163b5ca lirans@il.ibm.com
{
710 c163b5ca lirans@il.ibm.com
    if (f->get_rate_limit)
711 c163b5ca lirans@il.ibm.com
        return f->get_rate_limit(f->opaque);
712 c163b5ca lirans@il.ibm.com
713 c163b5ca lirans@il.ibm.com
    return 0;
714 c163b5ca lirans@il.ibm.com
}
715 c163b5ca lirans@il.ibm.com
716 3d002df3 Michael S. Tsirkin
int64_t qemu_file_set_rate_limit(QEMUFile *f, int64_t new_rate)
717 19629537 Glauber Costa
{
718 0bb05eaf Glauber Costa
    /* any failed or completed migration keeps its state to allow probing of
719 0bb05eaf Glauber Costa
     * migration data, but has no associated file anymore */
720 0bb05eaf Glauber Costa
    if (f && f->set_rate_limit)
721 19629537 Glauber Costa
        return f->set_rate_limit(f->opaque, new_rate);
722 19629537 Glauber Costa
723 19629537 Glauber Costa
    return 0;
724 19629537 Glauber Costa
}
725 19629537 Glauber Costa
726 a672b469 aliguori
void qemu_put_be16(QEMUFile *f, unsigned int v)
727 a672b469 aliguori
{
728 a672b469 aliguori
    qemu_put_byte(f, v >> 8);
729 a672b469 aliguori
    qemu_put_byte(f, v);
730 a672b469 aliguori
}
731 a672b469 aliguori
732 a672b469 aliguori
void qemu_put_be32(QEMUFile *f, unsigned int v)
733 a672b469 aliguori
{
734 a672b469 aliguori
    qemu_put_byte(f, v >> 24);
735 a672b469 aliguori
    qemu_put_byte(f, v >> 16);
736 a672b469 aliguori
    qemu_put_byte(f, v >> 8);
737 a672b469 aliguori
    qemu_put_byte(f, v);
738 a672b469 aliguori
}
739 a672b469 aliguori
740 a672b469 aliguori
void qemu_put_be64(QEMUFile *f, uint64_t v)
741 a672b469 aliguori
{
742 a672b469 aliguori
    qemu_put_be32(f, v >> 32);
743 a672b469 aliguori
    qemu_put_be32(f, v);
744 a672b469 aliguori
}
745 a672b469 aliguori
746 a672b469 aliguori
unsigned int qemu_get_be16(QEMUFile *f)
747 a672b469 aliguori
{
748 a672b469 aliguori
    unsigned int v;
749 a672b469 aliguori
    v = qemu_get_byte(f) << 8;
750 a672b469 aliguori
    v |= qemu_get_byte(f);
751 a672b469 aliguori
    return v;
752 a672b469 aliguori
}
753 a672b469 aliguori
754 a672b469 aliguori
unsigned int qemu_get_be32(QEMUFile *f)
755 a672b469 aliguori
{
756 a672b469 aliguori
    unsigned int v;
757 a672b469 aliguori
    v = qemu_get_byte(f) << 24;
758 a672b469 aliguori
    v |= qemu_get_byte(f) << 16;
759 a672b469 aliguori
    v |= qemu_get_byte(f) << 8;
760 a672b469 aliguori
    v |= qemu_get_byte(f);
761 a672b469 aliguori
    return v;
762 a672b469 aliguori
}
763 a672b469 aliguori
764 a672b469 aliguori
uint64_t qemu_get_be64(QEMUFile *f)
765 a672b469 aliguori
{
766 a672b469 aliguori
    uint64_t v;
767 a672b469 aliguori
    v = (uint64_t)qemu_get_be32(f) << 32;
768 a672b469 aliguori
    v |= qemu_get_be32(f);
769 a672b469 aliguori
    return v;
770 a672b469 aliguori
}
771 a672b469 aliguori
772 2ff68d07 Paolo Bonzini
773 2ff68d07 Paolo Bonzini
/* timer */
774 2ff68d07 Paolo Bonzini
775 2ff68d07 Paolo Bonzini
void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
776 2ff68d07 Paolo Bonzini
{
777 2ff68d07 Paolo Bonzini
    uint64_t expire_time;
778 2ff68d07 Paolo Bonzini
779 2ff68d07 Paolo Bonzini
    expire_time = qemu_timer_expire_time_ns(ts);
780 2ff68d07 Paolo Bonzini
    qemu_put_be64(f, expire_time);
781 2ff68d07 Paolo Bonzini
}
782 2ff68d07 Paolo Bonzini
783 2ff68d07 Paolo Bonzini
void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
784 2ff68d07 Paolo Bonzini
{
785 2ff68d07 Paolo Bonzini
    uint64_t expire_time;
786 2ff68d07 Paolo Bonzini
787 2ff68d07 Paolo Bonzini
    expire_time = qemu_get_be64(f);
788 2ff68d07 Paolo Bonzini
    if (expire_time != -1) {
789 2ff68d07 Paolo Bonzini
        qemu_mod_timer_ns(ts, expire_time);
790 2ff68d07 Paolo Bonzini
    } else {
791 2ff68d07 Paolo Bonzini
        qemu_del_timer(ts);
792 2ff68d07 Paolo Bonzini
    }
793 2ff68d07 Paolo Bonzini
}
794 2ff68d07 Paolo Bonzini
795 2ff68d07 Paolo Bonzini
796 cdae5cfb Gerd Hoffmann
/* bool */
797 cdae5cfb Gerd Hoffmann
798 cdae5cfb Gerd Hoffmann
static int get_bool(QEMUFile *f, void *pv, size_t size)
799 cdae5cfb Gerd Hoffmann
{
800 cdae5cfb Gerd Hoffmann
    bool *v = pv;
801 cdae5cfb Gerd Hoffmann
    *v = qemu_get_byte(f);
802 cdae5cfb Gerd Hoffmann
    return 0;
803 cdae5cfb Gerd Hoffmann
}
804 cdae5cfb Gerd Hoffmann
805 cdae5cfb Gerd Hoffmann
static void put_bool(QEMUFile *f, void *pv, size_t size)
806 cdae5cfb Gerd Hoffmann
{
807 cdae5cfb Gerd Hoffmann
    bool *v = pv;
808 cdae5cfb Gerd Hoffmann
    qemu_put_byte(f, *v);
809 cdae5cfb Gerd Hoffmann
}
810 cdae5cfb Gerd Hoffmann
811 cdae5cfb Gerd Hoffmann
const VMStateInfo vmstate_info_bool = {
812 cdae5cfb Gerd Hoffmann
    .name = "bool",
813 cdae5cfb Gerd Hoffmann
    .get  = get_bool,
814 cdae5cfb Gerd Hoffmann
    .put  = put_bool,
815 cdae5cfb Gerd Hoffmann
};
816 cdae5cfb Gerd Hoffmann
817 9ed7d6ae Juan Quintela
/* 8 bit int */
818 9ed7d6ae Juan Quintela
819 9ed7d6ae Juan Quintela
static int get_int8(QEMUFile *f, void *pv, size_t size)
820 9ed7d6ae Juan Quintela
{
821 9ed7d6ae Juan Quintela
    int8_t *v = pv;
822 9ed7d6ae Juan Quintela
    qemu_get_s8s(f, v);
823 9ed7d6ae Juan Quintela
    return 0;
824 9ed7d6ae Juan Quintela
}
825 9ed7d6ae Juan Quintela
826 84e2e3eb Juan Quintela
static void put_int8(QEMUFile *f, void *pv, size_t size)
827 9ed7d6ae Juan Quintela
{
828 84e2e3eb Juan Quintela
    int8_t *v = pv;
829 9ed7d6ae Juan Quintela
    qemu_put_s8s(f, v);
830 9ed7d6ae Juan Quintela
}
831 9ed7d6ae Juan Quintela
832 9ed7d6ae Juan Quintela
const VMStateInfo vmstate_info_int8 = {
833 9ed7d6ae Juan Quintela
    .name = "int8",
834 9ed7d6ae Juan Quintela
    .get  = get_int8,
835 9ed7d6ae Juan Quintela
    .put  = put_int8,
836 9ed7d6ae Juan Quintela
};
837 9ed7d6ae Juan Quintela
838 9ed7d6ae Juan Quintela
/* 16 bit int */
839 9ed7d6ae Juan Quintela
840 9ed7d6ae Juan Quintela
static int get_int16(QEMUFile *f, void *pv, size_t size)
841 9ed7d6ae Juan Quintela
{
842 9ed7d6ae Juan Quintela
    int16_t *v = pv;
843 9ed7d6ae Juan Quintela
    qemu_get_sbe16s(f, v);
844 9ed7d6ae Juan Quintela
    return 0;
845 9ed7d6ae Juan Quintela
}
846 9ed7d6ae Juan Quintela
847 84e2e3eb Juan Quintela
static void put_int16(QEMUFile *f, void *pv, size_t size)
848 9ed7d6ae Juan Quintela
{
849 84e2e3eb Juan Quintela
    int16_t *v = pv;
850 9ed7d6ae Juan Quintela
    qemu_put_sbe16s(f, v);
851 9ed7d6ae Juan Quintela
}
852 9ed7d6ae Juan Quintela
853 9ed7d6ae Juan Quintela
const VMStateInfo vmstate_info_int16 = {
854 9ed7d6ae Juan Quintela
    .name = "int16",
855 9ed7d6ae Juan Quintela
    .get  = get_int16,
856 9ed7d6ae Juan Quintela
    .put  = put_int16,
857 9ed7d6ae Juan Quintela
};
858 9ed7d6ae Juan Quintela
859 9ed7d6ae Juan Quintela
/* 32 bit int */
860 9ed7d6ae Juan Quintela
861 9ed7d6ae Juan Quintela
static int get_int32(QEMUFile *f, void *pv, size_t size)
862 9ed7d6ae Juan Quintela
{
863 9ed7d6ae Juan Quintela
    int32_t *v = pv;
864 9ed7d6ae Juan Quintela
    qemu_get_sbe32s(f, v);
865 9ed7d6ae Juan Quintela
    return 0;
866 9ed7d6ae Juan Quintela
}
867 9ed7d6ae Juan Quintela
868 84e2e3eb Juan Quintela
static void put_int32(QEMUFile *f, void *pv, size_t size)
869 9ed7d6ae Juan Quintela
{
870 84e2e3eb Juan Quintela
    int32_t *v = pv;
871 9ed7d6ae Juan Quintela
    qemu_put_sbe32s(f, v);
872 9ed7d6ae Juan Quintela
}
873 9ed7d6ae Juan Quintela
874 9ed7d6ae Juan Quintela
const VMStateInfo vmstate_info_int32 = {
875 9ed7d6ae Juan Quintela
    .name = "int32",
876 9ed7d6ae Juan Quintela
    .get  = get_int32,
877 9ed7d6ae Juan Quintela
    .put  = put_int32,
878 9ed7d6ae Juan Quintela
};
879 9ed7d6ae Juan Quintela
880 82501660 Juan Quintela
/* 32 bit int. See that the received value is the same than the one
881 82501660 Juan Quintela
   in the field */
882 82501660 Juan Quintela
883 82501660 Juan Quintela
static int get_int32_equal(QEMUFile *f, void *pv, size_t size)
884 82501660 Juan Quintela
{
885 82501660 Juan Quintela
    int32_t *v = pv;
886 82501660 Juan Quintela
    int32_t v2;
887 82501660 Juan Quintela
    qemu_get_sbe32s(f, &v2);
888 82501660 Juan Quintela
889 82501660 Juan Quintela
    if (*v == v2)
890 82501660 Juan Quintela
        return 0;
891 82501660 Juan Quintela
    return -EINVAL;
892 82501660 Juan Quintela
}
893 82501660 Juan Quintela
894 82501660 Juan Quintela
const VMStateInfo vmstate_info_int32_equal = {
895 82501660 Juan Quintela
    .name = "int32 equal",
896 82501660 Juan Quintela
    .get  = get_int32_equal,
897 82501660 Juan Quintela
    .put  = put_int32,
898 82501660 Juan Quintela
};
899 82501660 Juan Quintela
900 0a031e0a Juan Quintela
/* 32 bit int. See that the received value is the less or the same
901 0a031e0a Juan Quintela
   than the one in the field */
902 0a031e0a Juan Quintela
903 0a031e0a Juan Quintela
static int get_int32_le(QEMUFile *f, void *pv, size_t size)
904 0a031e0a Juan Quintela
{
905 0a031e0a Juan Quintela
    int32_t *old = pv;
906 0a031e0a Juan Quintela
    int32_t new;
907 0a031e0a Juan Quintela
    qemu_get_sbe32s(f, &new);
908 0a031e0a Juan Quintela
909 0a031e0a Juan Quintela
    if (*old <= new)
910 0a031e0a Juan Quintela
        return 0;
911 0a031e0a Juan Quintela
    return -EINVAL;
912 0a031e0a Juan Quintela
}
913 0a031e0a Juan Quintela
914 0a031e0a Juan Quintela
const VMStateInfo vmstate_info_int32_le = {
915 0a031e0a Juan Quintela
    .name = "int32 equal",
916 0a031e0a Juan Quintela
    .get  = get_int32_le,
917 0a031e0a Juan Quintela
    .put  = put_int32,
918 0a031e0a Juan Quintela
};
919 0a031e0a Juan Quintela
920 9ed7d6ae Juan Quintela
/* 64 bit int */
921 9ed7d6ae Juan Quintela
922 9ed7d6ae Juan Quintela
static int get_int64(QEMUFile *f, void *pv, size_t size)
923 9ed7d6ae Juan Quintela
{
924 9ed7d6ae Juan Quintela
    int64_t *v = pv;
925 9ed7d6ae Juan Quintela
    qemu_get_sbe64s(f, v);
926 9ed7d6ae Juan Quintela
    return 0;
927 9ed7d6ae Juan Quintela
}
928 9ed7d6ae Juan Quintela
929 84e2e3eb Juan Quintela
static void put_int64(QEMUFile *f, void *pv, size_t size)
930 9ed7d6ae Juan Quintela
{
931 84e2e3eb Juan Quintela
    int64_t *v = pv;
932 9ed7d6ae Juan Quintela
    qemu_put_sbe64s(f, v);
933 9ed7d6ae Juan Quintela
}
934 9ed7d6ae Juan Quintela
935 9ed7d6ae Juan Quintela
const VMStateInfo vmstate_info_int64 = {
936 9ed7d6ae Juan Quintela
    .name = "int64",
937 9ed7d6ae Juan Quintela
    .get  = get_int64,
938 9ed7d6ae Juan Quintela
    .put  = put_int64,
939 9ed7d6ae Juan Quintela
};
940 9ed7d6ae Juan Quintela
941 9ed7d6ae Juan Quintela
/* 8 bit unsigned int */
942 9ed7d6ae Juan Quintela
943 9ed7d6ae Juan Quintela
static int get_uint8(QEMUFile *f, void *pv, size_t size)
944 9ed7d6ae Juan Quintela
{
945 9ed7d6ae Juan Quintela
    uint8_t *v = pv;
946 9ed7d6ae Juan Quintela
    qemu_get_8s(f, v);
947 9ed7d6ae Juan Quintela
    return 0;
948 9ed7d6ae Juan Quintela
}
949 9ed7d6ae Juan Quintela
950 84e2e3eb Juan Quintela
static void put_uint8(QEMUFile *f, void *pv, size_t size)
951 9ed7d6ae Juan Quintela
{
952 84e2e3eb Juan Quintela
    uint8_t *v = pv;
953 9ed7d6ae Juan Quintela
    qemu_put_8s(f, v);
954 9ed7d6ae Juan Quintela
}
955 9ed7d6ae Juan Quintela
956 9ed7d6ae Juan Quintela
const VMStateInfo vmstate_info_uint8 = {
957 9ed7d6ae Juan Quintela
    .name = "uint8",
958 9ed7d6ae Juan Quintela
    .get  = get_uint8,
959 9ed7d6ae Juan Quintela
    .put  = put_uint8,
960 9ed7d6ae Juan Quintela
};
961 9ed7d6ae Juan Quintela
962 9ed7d6ae Juan Quintela
/* 16 bit unsigned int */
963 9ed7d6ae Juan Quintela
964 9ed7d6ae Juan Quintela
static int get_uint16(QEMUFile *f, void *pv, size_t size)
965 9ed7d6ae Juan Quintela
{
966 9ed7d6ae Juan Quintela
    uint16_t *v = pv;
967 9ed7d6ae Juan Quintela
    qemu_get_be16s(f, v);
968 9ed7d6ae Juan Quintela
    return 0;
969 9ed7d6ae Juan Quintela
}
970 9ed7d6ae Juan Quintela
971 84e2e3eb Juan Quintela
static void put_uint16(QEMUFile *f, void *pv, size_t size)
972 9ed7d6ae Juan Quintela
{
973 84e2e3eb Juan Quintela
    uint16_t *v = pv;
974 9ed7d6ae Juan Quintela
    qemu_put_be16s(f, v);
975 9ed7d6ae Juan Quintela
}
976 9ed7d6ae Juan Quintela
977 9ed7d6ae Juan Quintela
const VMStateInfo vmstate_info_uint16 = {
978 9ed7d6ae Juan Quintela
    .name = "uint16",
979 9ed7d6ae Juan Quintela
    .get  = get_uint16,
980 9ed7d6ae Juan Quintela
    .put  = put_uint16,
981 9ed7d6ae Juan Quintela
};
982 9ed7d6ae Juan Quintela
983 9ed7d6ae Juan Quintela
/* 32 bit unsigned int */
984 9ed7d6ae Juan Quintela
985 9ed7d6ae Juan Quintela
static int get_uint32(QEMUFile *f, void *pv, size_t size)
986 9ed7d6ae Juan Quintela
{
987 9ed7d6ae Juan Quintela
    uint32_t *v = pv;
988 9ed7d6ae Juan Quintela
    qemu_get_be32s(f, v);
989 9ed7d6ae Juan Quintela
    return 0;
990 9ed7d6ae Juan Quintela
}
991 9ed7d6ae Juan Quintela
992 84e2e3eb Juan Quintela
static void put_uint32(QEMUFile *f, void *pv, size_t size)
993 9ed7d6ae Juan Quintela
{
994 84e2e3eb Juan Quintela
    uint32_t *v = pv;
995 9ed7d6ae Juan Quintela
    qemu_put_be32s(f, v);
996 9ed7d6ae Juan Quintela
}
997 9ed7d6ae Juan Quintela
998 9ed7d6ae Juan Quintela
const VMStateInfo vmstate_info_uint32 = {
999 9ed7d6ae Juan Quintela
    .name = "uint32",
1000 9ed7d6ae Juan Quintela
    .get  = get_uint32,
1001 9ed7d6ae Juan Quintela
    .put  = put_uint32,
1002 9ed7d6ae Juan Quintela
};
1003 9ed7d6ae Juan Quintela
1004 9122a8fe Juan Quintela
/* 32 bit uint. See that the received value is the same than the one
1005 9122a8fe Juan Quintela
   in the field */
1006 9122a8fe Juan Quintela
1007 9122a8fe Juan Quintela
static int get_uint32_equal(QEMUFile *f, void *pv, size_t size)
1008 9122a8fe Juan Quintela
{
1009 9122a8fe Juan Quintela
    uint32_t *v = pv;
1010 9122a8fe Juan Quintela
    uint32_t v2;
1011 9122a8fe Juan Quintela
    qemu_get_be32s(f, &v2);
1012 9122a8fe Juan Quintela
1013 9122a8fe Juan Quintela
    if (*v == v2) {
1014 9122a8fe Juan Quintela
        return 0;
1015 9122a8fe Juan Quintela
    }
1016 9122a8fe Juan Quintela
    return -EINVAL;
1017 9122a8fe Juan Quintela
}
1018 9122a8fe Juan Quintela
1019 9122a8fe Juan Quintela
const VMStateInfo vmstate_info_uint32_equal = {
1020 9122a8fe Juan Quintela
    .name = "uint32 equal",
1021 9122a8fe Juan Quintela
    .get  = get_uint32_equal,
1022 9122a8fe Juan Quintela
    .put  = put_uint32,
1023 9122a8fe Juan Quintela
};
1024 9122a8fe Juan Quintela
1025 9ed7d6ae Juan Quintela
/* 64 bit unsigned int */
1026 9ed7d6ae Juan Quintela
1027 9ed7d6ae Juan Quintela
static int get_uint64(QEMUFile *f, void *pv, size_t size)
1028 9ed7d6ae Juan Quintela
{
1029 9ed7d6ae Juan Quintela
    uint64_t *v = pv;
1030 9ed7d6ae Juan Quintela
    qemu_get_be64s(f, v);
1031 9ed7d6ae Juan Quintela
    return 0;
1032 9ed7d6ae Juan Quintela
}
1033 9ed7d6ae Juan Quintela
1034 84e2e3eb Juan Quintela
static void put_uint64(QEMUFile *f, void *pv, size_t size)
1035 9ed7d6ae Juan Quintela
{
1036 84e2e3eb Juan Quintela
    uint64_t *v = pv;
1037 9ed7d6ae Juan Quintela
    qemu_put_be64s(f, v);
1038 9ed7d6ae Juan Quintela
}
1039 9ed7d6ae Juan Quintela
1040 9ed7d6ae Juan Quintela
const VMStateInfo vmstate_info_uint64 = {
1041 9ed7d6ae Juan Quintela
    .name = "uint64",
1042 9ed7d6ae Juan Quintela
    .get  = get_uint64,
1043 9ed7d6ae Juan Quintela
    .put  = put_uint64,
1044 9ed7d6ae Juan Quintela
};
1045 9ed7d6ae Juan Quintela
1046 80cd83e7 Juan Quintela
/* 8 bit int. See that the received value is the same than the one
1047 80cd83e7 Juan Quintela
   in the field */
1048 80cd83e7 Juan Quintela
1049 80cd83e7 Juan Quintela
static int get_uint8_equal(QEMUFile *f, void *pv, size_t size)
1050 80cd83e7 Juan Quintela
{
1051 80cd83e7 Juan Quintela
    uint8_t *v = pv;
1052 80cd83e7 Juan Quintela
    uint8_t v2;
1053 80cd83e7 Juan Quintela
    qemu_get_8s(f, &v2);
1054 80cd83e7 Juan Quintela
1055 80cd83e7 Juan Quintela
    if (*v == v2)
1056 80cd83e7 Juan Quintela
        return 0;
1057 80cd83e7 Juan Quintela
    return -EINVAL;
1058 80cd83e7 Juan Quintela
}
1059 80cd83e7 Juan Quintela
1060 80cd83e7 Juan Quintela
const VMStateInfo vmstate_info_uint8_equal = {
1061 aa1cce69 Juan Quintela
    .name = "uint8 equal",
1062 80cd83e7 Juan Quintela
    .get  = get_uint8_equal,
1063 80cd83e7 Juan Quintela
    .put  = put_uint8,
1064 80cd83e7 Juan Quintela
};
1065 80cd83e7 Juan Quintela
1066 dc3b83a0 Juan Quintela
/* 16 bit unsigned int int. See that the received value is the same than the one
1067 dc3b83a0 Juan Quintela
   in the field */
1068 dc3b83a0 Juan Quintela
1069 dc3b83a0 Juan Quintela
static int get_uint16_equal(QEMUFile *f, void *pv, size_t size)
1070 dc3b83a0 Juan Quintela
{
1071 dc3b83a0 Juan Quintela
    uint16_t *v = pv;
1072 dc3b83a0 Juan Quintela
    uint16_t v2;
1073 dc3b83a0 Juan Quintela
    qemu_get_be16s(f, &v2);
1074 dc3b83a0 Juan Quintela
1075 dc3b83a0 Juan Quintela
    if (*v == v2)
1076 dc3b83a0 Juan Quintela
        return 0;
1077 dc3b83a0 Juan Quintela
    return -EINVAL;
1078 dc3b83a0 Juan Quintela
}
1079 dc3b83a0 Juan Quintela
1080 dc3b83a0 Juan Quintela
const VMStateInfo vmstate_info_uint16_equal = {
1081 dc3b83a0 Juan Quintela
    .name = "uint16 equal",
1082 dc3b83a0 Juan Quintela
    .get  = get_uint16_equal,
1083 dc3b83a0 Juan Quintela
    .put  = put_uint16,
1084 dc3b83a0 Juan Quintela
};
1085 dc3b83a0 Juan Quintela
1086 dde0463b Juan Quintela
/* timers  */
1087 dde0463b Juan Quintela
1088 dde0463b Juan Quintela
static int get_timer(QEMUFile *f, void *pv, size_t size)
1089 dde0463b Juan Quintela
{
1090 dde0463b Juan Quintela
    QEMUTimer *v = pv;
1091 dde0463b Juan Quintela
    qemu_get_timer(f, v);
1092 dde0463b Juan Quintela
    return 0;
1093 dde0463b Juan Quintela
}
1094 dde0463b Juan Quintela
1095 84e2e3eb Juan Quintela
static void put_timer(QEMUFile *f, void *pv, size_t size)
1096 dde0463b Juan Quintela
{
1097 84e2e3eb Juan Quintela
    QEMUTimer *v = pv;
1098 dde0463b Juan Quintela
    qemu_put_timer(f, v);
1099 dde0463b Juan Quintela
}
1100 dde0463b Juan Quintela
1101 dde0463b Juan Quintela
const VMStateInfo vmstate_info_timer = {
1102 dde0463b Juan Quintela
    .name = "timer",
1103 dde0463b Juan Quintela
    .get  = get_timer,
1104 dde0463b Juan Quintela
    .put  = put_timer,
1105 dde0463b Juan Quintela
};
1106 dde0463b Juan Quintela
1107 6f67c50f Juan Quintela
/* uint8_t buffers */
1108 6f67c50f Juan Quintela
1109 6f67c50f Juan Quintela
static int get_buffer(QEMUFile *f, void *pv, size_t size)
1110 6f67c50f Juan Quintela
{
1111 6f67c50f Juan Quintela
    uint8_t *v = pv;
1112 6f67c50f Juan Quintela
    qemu_get_buffer(f, v, size);
1113 6f67c50f Juan Quintela
    return 0;
1114 6f67c50f Juan Quintela
}
1115 6f67c50f Juan Quintela
1116 84e2e3eb Juan Quintela
static void put_buffer(QEMUFile *f, void *pv, size_t size)
1117 6f67c50f Juan Quintela
{
1118 84e2e3eb Juan Quintela
    uint8_t *v = pv;
1119 6f67c50f Juan Quintela
    qemu_put_buffer(f, v, size);
1120 6f67c50f Juan Quintela
}
1121 6f67c50f Juan Quintela
1122 6f67c50f Juan Quintela
const VMStateInfo vmstate_info_buffer = {
1123 6f67c50f Juan Quintela
    .name = "buffer",
1124 6f67c50f Juan Quintela
    .get  = get_buffer,
1125 6f67c50f Juan Quintela
    .put  = put_buffer,
1126 6f67c50f Juan Quintela
};
1127 6f67c50f Juan Quintela
1128 76507c75 Juan Quintela
/* unused buffers: space that was used for some fields that are
1129 61cc8701 Stefan Weil
   not useful anymore */
1130 76507c75 Juan Quintela
1131 76507c75 Juan Quintela
static int get_unused_buffer(QEMUFile *f, void *pv, size_t size)
1132 76507c75 Juan Quintela
{
1133 21174c34 Jan Kiszka
    uint8_t buf[1024];
1134 21174c34 Jan Kiszka
    int block_len;
1135 21174c34 Jan Kiszka
1136 21174c34 Jan Kiszka
    while (size > 0) {
1137 21174c34 Jan Kiszka
        block_len = MIN(sizeof(buf), size);
1138 21174c34 Jan Kiszka
        size -= block_len;
1139 21174c34 Jan Kiszka
        qemu_get_buffer(f, buf, block_len);
1140 21174c34 Jan Kiszka
    }
1141 21174c34 Jan Kiszka
   return 0;
1142 76507c75 Juan Quintela
}
1143 76507c75 Juan Quintela
1144 76507c75 Juan Quintela
static void put_unused_buffer(QEMUFile *f, void *pv, size_t size)
1145 76507c75 Juan Quintela
{
1146 21174c34 Jan Kiszka
    static const uint8_t buf[1024];
1147 21174c34 Jan Kiszka
    int block_len;
1148 21174c34 Jan Kiszka
1149 21174c34 Jan Kiszka
    while (size > 0) {
1150 21174c34 Jan Kiszka
        block_len = MIN(sizeof(buf), size);
1151 21174c34 Jan Kiszka
        size -= block_len;
1152 21174c34 Jan Kiszka
        qemu_put_buffer(f, buf, block_len);
1153 21174c34 Jan Kiszka
    }
1154 76507c75 Juan Quintela
}
1155 76507c75 Juan Quintela
1156 76507c75 Juan Quintela
const VMStateInfo vmstate_info_unused_buffer = {
1157 76507c75 Juan Quintela
    .name = "unused_buffer",
1158 76507c75 Juan Quintela
    .get  = get_unused_buffer,
1159 76507c75 Juan Quintela
    .put  = put_unused_buffer,
1160 76507c75 Juan Quintela
};
1161 76507c75 Juan Quintela
1162 7685ee6a Alex Williamson
typedef struct CompatEntry {
1163 7685ee6a Alex Williamson
    char idstr[256];
1164 7685ee6a Alex Williamson
    int instance_id;
1165 7685ee6a Alex Williamson
} CompatEntry;
1166 7685ee6a Alex Williamson
1167 a672b469 aliguori
typedef struct SaveStateEntry {
1168 72cf2d4f Blue Swirl
    QTAILQ_ENTRY(SaveStateEntry) entry;
1169 a672b469 aliguori
    char idstr[256];
1170 a672b469 aliguori
    int instance_id;
1171 4d2ffa08 Jan Kiszka
    int alias_id;
1172 a672b469 aliguori
    int version_id;
1173 a672b469 aliguori
    int section_id;
1174 22ea40f4 Juan Quintela
    SaveVMHandlers *ops;
1175 9ed7d6ae Juan Quintela
    const VMStateDescription *vmsd;
1176 a672b469 aliguori
    void *opaque;
1177 7685ee6a Alex Williamson
    CompatEntry *compat;
1178 24312968 Cam Macdonell
    int no_migrate;
1179 a7ae8355 Stefano Stabellini
    int is_ram;
1180 a672b469 aliguori
} SaveStateEntry;
1181 a672b469 aliguori
1182 c163b5ca lirans@il.ibm.com
1183 72cf2d4f Blue Swirl
static QTAILQ_HEAD(savevm_handlers, SaveStateEntry) savevm_handlers =
1184 72cf2d4f Blue Swirl
    QTAILQ_HEAD_INITIALIZER(savevm_handlers);
1185 9ed7d6ae Juan Quintela
static int global_section_id;
1186 a672b469 aliguori
1187 8718e999 Juan Quintela
static int calculate_new_instance_id(const char *idstr)
1188 8718e999 Juan Quintela
{
1189 8718e999 Juan Quintela
    SaveStateEntry *se;
1190 8718e999 Juan Quintela
    int instance_id = 0;
1191 8718e999 Juan Quintela
1192 72cf2d4f Blue Swirl
    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1193 8718e999 Juan Quintela
        if (strcmp(idstr, se->idstr) == 0
1194 8718e999 Juan Quintela
            && instance_id <= se->instance_id) {
1195 8718e999 Juan Quintela
            instance_id = se->instance_id + 1;
1196 8718e999 Juan Quintela
        }
1197 8718e999 Juan Quintela
    }
1198 8718e999 Juan Quintela
    return instance_id;
1199 8718e999 Juan Quintela
}
1200 8718e999 Juan Quintela
1201 7685ee6a Alex Williamson
static int calculate_compat_instance_id(const char *idstr)
1202 7685ee6a Alex Williamson
{
1203 7685ee6a Alex Williamson
    SaveStateEntry *se;
1204 7685ee6a Alex Williamson
    int instance_id = 0;
1205 7685ee6a Alex Williamson
1206 7685ee6a Alex Williamson
    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1207 7685ee6a Alex Williamson
        if (!se->compat)
1208 7685ee6a Alex Williamson
            continue;
1209 7685ee6a Alex Williamson
1210 7685ee6a Alex Williamson
        if (strcmp(idstr, se->compat->idstr) == 0
1211 7685ee6a Alex Williamson
            && instance_id <= se->compat->instance_id) {
1212 7685ee6a Alex Williamson
            instance_id = se->compat->instance_id + 1;
1213 7685ee6a Alex Williamson
        }
1214 7685ee6a Alex Williamson
    }
1215 7685ee6a Alex Williamson
    return instance_id;
1216 7685ee6a Alex Williamson
}
1217 7685ee6a Alex Williamson
1218 a672b469 aliguori
/* TODO: Individual devices generally have very little idea about the rest
1219 a672b469 aliguori
   of the system, so instance_id should be removed/replaced.
1220 a672b469 aliguori
   Meanwhile pass -1 as instance_id if you do not already have a clearly
1221 a672b469 aliguori
   distinguishing id for all instances of your device class. */
1222 0be71e32 Alex Williamson
int register_savevm_live(DeviceState *dev,
1223 0be71e32 Alex Williamson
                         const char *idstr,
1224 a672b469 aliguori
                         int instance_id,
1225 a672b469 aliguori
                         int version_id,
1226 7908c78d Juan Quintela
                         SaveVMHandlers *ops,
1227 a672b469 aliguori
                         void *opaque)
1228 a672b469 aliguori
{
1229 8718e999 Juan Quintela
    SaveStateEntry *se;
1230 a672b469 aliguori
1231 7267c094 Anthony Liguori
    se = g_malloc0(sizeof(SaveStateEntry));
1232 a672b469 aliguori
    se->version_id = version_id;
1233 a672b469 aliguori
    se->section_id = global_section_id++;
1234 7908c78d Juan Quintela
    se->ops = ops;
1235 a672b469 aliguori
    se->opaque = opaque;
1236 9ed7d6ae Juan Quintela
    se->vmsd = NULL;
1237 24312968 Cam Macdonell
    se->no_migrate = 0;
1238 a7ae8355 Stefano Stabellini
    /* if this is a live_savem then set is_ram */
1239 16310a3c Juan Quintela
    if (ops->save_live_setup != NULL) {
1240 a7ae8355 Stefano Stabellini
        se->is_ram = 1;
1241 a7ae8355 Stefano Stabellini
    }
1242 a672b469 aliguori
1243 09e5ab63 Anthony Liguori
    if (dev) {
1244 09e5ab63 Anthony Liguori
        char *id = qdev_get_dev_path(dev);
1245 7685ee6a Alex Williamson
        if (id) {
1246 7685ee6a Alex Williamson
            pstrcpy(se->idstr, sizeof(se->idstr), id);
1247 7685ee6a Alex Williamson
            pstrcat(se->idstr, sizeof(se->idstr), "/");
1248 7267c094 Anthony Liguori
            g_free(id);
1249 7685ee6a Alex Williamson
1250 7267c094 Anthony Liguori
            se->compat = g_malloc0(sizeof(CompatEntry));
1251 7685ee6a Alex Williamson
            pstrcpy(se->compat->idstr, sizeof(se->compat->idstr), idstr);
1252 7685ee6a Alex Williamson
            se->compat->instance_id = instance_id == -1 ?
1253 7685ee6a Alex Williamson
                         calculate_compat_instance_id(idstr) : instance_id;
1254 7685ee6a Alex Williamson
            instance_id = -1;
1255 7685ee6a Alex Williamson
        }
1256 7685ee6a Alex Williamson
    }
1257 7685ee6a Alex Williamson
    pstrcat(se->idstr, sizeof(se->idstr), idstr);
1258 7685ee6a Alex Williamson
1259 8718e999 Juan Quintela
    if (instance_id == -1) {
1260 7685ee6a Alex Williamson
        se->instance_id = calculate_new_instance_id(se->idstr);
1261 8718e999 Juan Quintela
    } else {
1262 8718e999 Juan Quintela
        se->instance_id = instance_id;
1263 a672b469 aliguori
    }
1264 7685ee6a Alex Williamson
    assert(!se->compat || se->instance_id == 0);
1265 8718e999 Juan Quintela
    /* add at the end of list */
1266 72cf2d4f Blue Swirl
    QTAILQ_INSERT_TAIL(&savevm_handlers, se, entry);
1267 a672b469 aliguori
    return 0;
1268 a672b469 aliguori
}
1269 a672b469 aliguori
1270 0be71e32 Alex Williamson
int register_savevm(DeviceState *dev,
1271 0be71e32 Alex Williamson
                    const char *idstr,
1272 a672b469 aliguori
                    int instance_id,
1273 a672b469 aliguori
                    int version_id,
1274 a672b469 aliguori
                    SaveStateHandler *save_state,
1275 a672b469 aliguori
                    LoadStateHandler *load_state,
1276 a672b469 aliguori
                    void *opaque)
1277 a672b469 aliguori
{
1278 7908c78d Juan Quintela
    SaveVMHandlers *ops = g_malloc0(sizeof(SaveVMHandlers));
1279 7908c78d Juan Quintela
    ops->save_state = save_state;
1280 7908c78d Juan Quintela
    ops->load_state = load_state;
1281 0be71e32 Alex Williamson
    return register_savevm_live(dev, idstr, instance_id, version_id,
1282 7908c78d Juan Quintela
                                ops, opaque);
1283 a672b469 aliguori
}
1284 a672b469 aliguori
1285 0be71e32 Alex Williamson
void unregister_savevm(DeviceState *dev, const char *idstr, void *opaque)
1286 41bd13af aliguori
{
1287 8718e999 Juan Quintela
    SaveStateEntry *se, *new_se;
1288 7685ee6a Alex Williamson
    char id[256] = "";
1289 7685ee6a Alex Williamson
1290 09e5ab63 Anthony Liguori
    if (dev) {
1291 09e5ab63 Anthony Liguori
        char *path = qdev_get_dev_path(dev);
1292 7685ee6a Alex Williamson
        if (path) {
1293 7685ee6a Alex Williamson
            pstrcpy(id, sizeof(id), path);
1294 7685ee6a Alex Williamson
            pstrcat(id, sizeof(id), "/");
1295 7267c094 Anthony Liguori
            g_free(path);
1296 7685ee6a Alex Williamson
        }
1297 7685ee6a Alex Williamson
    }
1298 7685ee6a Alex Williamson
    pstrcat(id, sizeof(id), idstr);
1299 41bd13af aliguori
1300 72cf2d4f Blue Swirl
    QTAILQ_FOREACH_SAFE(se, &savevm_handlers, entry, new_se) {
1301 7685ee6a Alex Williamson
        if (strcmp(se->idstr, id) == 0 && se->opaque == opaque) {
1302 72cf2d4f Blue Swirl
            QTAILQ_REMOVE(&savevm_handlers, se, entry);
1303 69e58af9 Alex Williamson
            if (se->compat) {
1304 7267c094 Anthony Liguori
                g_free(se->compat);
1305 69e58af9 Alex Williamson
            }
1306 22ea40f4 Juan Quintela
            g_free(se->ops);
1307 7267c094 Anthony Liguori
            g_free(se);
1308 41bd13af aliguori
        }
1309 41bd13af aliguori
    }
1310 41bd13af aliguori
}
1311 41bd13af aliguori
1312 0be71e32 Alex Williamson
int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
1313 4d2ffa08 Jan Kiszka
                                   const VMStateDescription *vmsd,
1314 4d2ffa08 Jan Kiszka
                                   void *opaque, int alias_id,
1315 4d2ffa08 Jan Kiszka
                                   int required_for_version)
1316 9ed7d6ae Juan Quintela
{
1317 8718e999 Juan Quintela
    SaveStateEntry *se;
1318 9ed7d6ae Juan Quintela
1319 4d2ffa08 Jan Kiszka
    /* If this triggers, alias support can be dropped for the vmsd. */
1320 4d2ffa08 Jan Kiszka
    assert(alias_id == -1 || required_for_version >= vmsd->minimum_version_id);
1321 4d2ffa08 Jan Kiszka
1322 7267c094 Anthony Liguori
    se = g_malloc0(sizeof(SaveStateEntry));
1323 9ed7d6ae Juan Quintela
    se->version_id = vmsd->version_id;
1324 9ed7d6ae Juan Quintela
    se->section_id = global_section_id++;
1325 9ed7d6ae Juan Quintela
    se->opaque = opaque;
1326 9ed7d6ae Juan Quintela
    se->vmsd = vmsd;
1327 4d2ffa08 Jan Kiszka
    se->alias_id = alias_id;
1328 2837c8ea Gerd Hoffmann
    se->no_migrate = vmsd->unmigratable;
1329 9ed7d6ae Juan Quintela
1330 09e5ab63 Anthony Liguori
    if (dev) {
1331 09e5ab63 Anthony Liguori
        char *id = qdev_get_dev_path(dev);
1332 7685ee6a Alex Williamson
        if (id) {
1333 7685ee6a Alex Williamson
            pstrcpy(se->idstr, sizeof(se->idstr), id);
1334 7685ee6a Alex Williamson
            pstrcat(se->idstr, sizeof(se->idstr), "/");
1335 7267c094 Anthony Liguori
            g_free(id);
1336 7685ee6a Alex Williamson
1337 7267c094 Anthony Liguori
            se->compat = g_malloc0(sizeof(CompatEntry));
1338 7685ee6a Alex Williamson
            pstrcpy(se->compat->idstr, sizeof(se->compat->idstr), vmsd->name);
1339 7685ee6a Alex Williamson
            se->compat->instance_id = instance_id == -1 ?
1340 7685ee6a Alex Williamson
                         calculate_compat_instance_id(vmsd->name) : instance_id;
1341 7685ee6a Alex Williamson
            instance_id = -1;
1342 7685ee6a Alex Williamson
        }
1343 7685ee6a Alex Williamson
    }
1344 7685ee6a Alex Williamson
    pstrcat(se->idstr, sizeof(se->idstr), vmsd->name);
1345 7685ee6a Alex Williamson
1346 8718e999 Juan Quintela
    if (instance_id == -1) {
1347 7685ee6a Alex Williamson
        se->instance_id = calculate_new_instance_id(se->idstr);
1348 8718e999 Juan Quintela
    } else {
1349 8718e999 Juan Quintela
        se->instance_id = instance_id;
1350 9ed7d6ae Juan Quintela
    }
1351 7685ee6a Alex Williamson
    assert(!se->compat || se->instance_id == 0);
1352 8718e999 Juan Quintela
    /* add at the end of list */
1353 72cf2d4f Blue Swirl
    QTAILQ_INSERT_TAIL(&savevm_handlers, se, entry);
1354 9ed7d6ae Juan Quintela
    return 0;
1355 9ed7d6ae Juan Quintela
}
1356 9ed7d6ae Juan Quintela
1357 0be71e32 Alex Williamson
int vmstate_register(DeviceState *dev, int instance_id,
1358 0be71e32 Alex Williamson
                     const VMStateDescription *vmsd, void *opaque)
1359 4d2ffa08 Jan Kiszka
{
1360 0be71e32 Alex Williamson
    return vmstate_register_with_alias_id(dev, instance_id, vmsd,
1361 0be71e32 Alex Williamson
                                          opaque, -1, 0);
1362 4d2ffa08 Jan Kiszka
}
1363 4d2ffa08 Jan Kiszka
1364 0be71e32 Alex Williamson
void vmstate_unregister(DeviceState *dev, const VMStateDescription *vmsd,
1365 0be71e32 Alex Williamson
                        void *opaque)
1366 9ed7d6ae Juan Quintela
{
1367 1eb7538b Juan Quintela
    SaveStateEntry *se, *new_se;
1368 1eb7538b Juan Quintela
1369 72cf2d4f Blue Swirl
    QTAILQ_FOREACH_SAFE(se, &savevm_handlers, entry, new_se) {
1370 1eb7538b Juan Quintela
        if (se->vmsd == vmsd && se->opaque == opaque) {
1371 72cf2d4f Blue Swirl
            QTAILQ_REMOVE(&savevm_handlers, se, entry);
1372 69e58af9 Alex Williamson
            if (se->compat) {
1373 7267c094 Anthony Liguori
                g_free(se->compat);
1374 69e58af9 Alex Williamson
            }
1375 7267c094 Anthony Liguori
            g_free(se);
1376 1eb7538b Juan Quintela
        }
1377 1eb7538b Juan Quintela
    }
1378 9ed7d6ae Juan Quintela
}
1379 9ed7d6ae Juan Quintela
1380 811814bd Juan Quintela
static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
1381 811814bd Juan Quintela
                                    void *opaque);
1382 811814bd Juan Quintela
static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
1383 811814bd Juan Quintela
                                   void *opaque);
1384 811814bd Juan Quintela
1385 9ed7d6ae Juan Quintela
int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
1386 9ed7d6ae Juan Quintela
                       void *opaque, int version_id)
1387 9ed7d6ae Juan Quintela
{
1388 9ed7d6ae Juan Quintela
    VMStateField *field = vmsd->fields;
1389 811814bd Juan Quintela
    int ret;
1390 9ed7d6ae Juan Quintela
1391 9ed7d6ae Juan Quintela
    if (version_id > vmsd->version_id) {
1392 9ed7d6ae Juan Quintela
        return -EINVAL;
1393 9ed7d6ae Juan Quintela
    }
1394 9ed7d6ae Juan Quintela
    if (version_id < vmsd->minimum_version_id_old) {
1395 9ed7d6ae Juan Quintela
        return -EINVAL;
1396 9ed7d6ae Juan Quintela
    }
1397 9ed7d6ae Juan Quintela
    if  (version_id < vmsd->minimum_version_id) {
1398 9ed7d6ae Juan Quintela
        return vmsd->load_state_old(f, opaque, version_id);
1399 9ed7d6ae Juan Quintela
    }
1400 fd4d52de Juan Quintela
    if (vmsd->pre_load) {
1401 fd4d52de Juan Quintela
        int ret = vmsd->pre_load(opaque);
1402 fd4d52de Juan Quintela
        if (ret)
1403 fd4d52de Juan Quintela
            return ret;
1404 fd4d52de Juan Quintela
    }
1405 9ed7d6ae Juan Quintela
    while(field->name) {
1406 f11f6a5f Juan Quintela
        if ((field->field_exists &&
1407 f11f6a5f Juan Quintela
             field->field_exists(opaque, version_id)) ||
1408 f11f6a5f Juan Quintela
            (!field->field_exists &&
1409 f11f6a5f Juan Quintela
             field->version_id <= version_id)) {
1410 f752a6aa Juan Quintela
            void *base_addr = opaque + field->offset;
1411 811814bd Juan Quintela
            int i, n_elems = 1;
1412 e61a1e0a Juan Quintela
            int size = field->size;
1413 9ed7d6ae Juan Quintela
1414 e61a1e0a Juan Quintela
            if (field->flags & VMS_VBUFFER) {
1415 e61a1e0a Juan Quintela
                size = *(int32_t *)(opaque+field->size_offset);
1416 33599e2a Juan Quintela
                if (field->flags & VMS_MULTIPLY) {
1417 33599e2a Juan Quintela
                    size *= field->size;
1418 33599e2a Juan Quintela
                }
1419 e61a1e0a Juan Quintela
            }
1420 f752a6aa Juan Quintela
            if (field->flags & VMS_ARRAY) {
1421 f752a6aa Juan Quintela
                n_elems = field->num;
1422 d6698281 Juan Quintela
            } else if (field->flags & VMS_VARRAY_INT32) {
1423 d6698281 Juan Quintela
                n_elems = *(int32_t *)(opaque+field->num_offset);
1424 a624b086 Juan Quintela
            } else if (field->flags & VMS_VARRAY_UINT32) {
1425 a624b086 Juan Quintela
                n_elems = *(uint32_t *)(opaque+field->num_offset);
1426 bdb4941d Juan Quintela
            } else if (field->flags & VMS_VARRAY_UINT16) {
1427 bdb4941d Juan Quintela
                n_elems = *(uint16_t *)(opaque+field->num_offset);
1428 82fa39b7 Juan Quintela
            } else if (field->flags & VMS_VARRAY_UINT8) {
1429 82fa39b7 Juan Quintela
                n_elems = *(uint8_t *)(opaque+field->num_offset);
1430 f752a6aa Juan Quintela
            }
1431 dde0463b Juan Quintela
            if (field->flags & VMS_POINTER) {
1432 e61a1e0a Juan Quintela
                base_addr = *(void **)base_addr + field->start;
1433 dde0463b Juan Quintela
            }
1434 f752a6aa Juan Quintela
            for (i = 0; i < n_elems; i++) {
1435 e61a1e0a Juan Quintela
                void *addr = base_addr + size * i;
1436 ec245e21 Juan Quintela
1437 19df438b Juan Quintela
                if (field->flags & VMS_ARRAY_OF_POINTER) {
1438 19df438b Juan Quintela
                    addr = *(void **)addr;
1439 19df438b Juan Quintela
                }
1440 ec245e21 Juan Quintela
                if (field->flags & VMS_STRUCT) {
1441 fa3aad24 Juan Quintela
                    ret = vmstate_load_state(f, field->vmsd, addr, field->vmsd->version_id);
1442 ec245e21 Juan Quintela
                } else {
1443 e61a1e0a Juan Quintela
                    ret = field->info->get(f, addr, size);
1444 ec245e21 Juan Quintela
1445 ec245e21 Juan Quintela
                }
1446 f752a6aa Juan Quintela
                if (ret < 0) {
1447 f752a6aa Juan Quintela
                    return ret;
1448 f752a6aa Juan Quintela
                }
1449 9ed7d6ae Juan Quintela
            }
1450 9ed7d6ae Juan Quintela
        }
1451 9ed7d6ae Juan Quintela
        field++;
1452 9ed7d6ae Juan Quintela
    }
1453 811814bd Juan Quintela
    ret = vmstate_subsection_load(f, vmsd, opaque);
1454 811814bd Juan Quintela
    if (ret != 0) {
1455 811814bd Juan Quintela
        return ret;
1456 811814bd Juan Quintela
    }
1457 752ff2fa Juan Quintela
    if (vmsd->post_load) {
1458 e59fb374 Juan Quintela
        return vmsd->post_load(opaque, version_id);
1459 752ff2fa Juan Quintela
    }
1460 9ed7d6ae Juan Quintela
    return 0;
1461 9ed7d6ae Juan Quintela
}
1462 9ed7d6ae Juan Quintela
1463 9ed7d6ae Juan Quintela
void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
1464 84e2e3eb Juan Quintela
                        void *opaque)
1465 9ed7d6ae Juan Quintela
{
1466 9ed7d6ae Juan Quintela
    VMStateField *field = vmsd->fields;
1467 9ed7d6ae Juan Quintela
1468 8fb0791d Juan Quintela
    if (vmsd->pre_save) {
1469 8fb0791d Juan Quintela
        vmsd->pre_save(opaque);
1470 8fb0791d Juan Quintela
    }
1471 9ed7d6ae Juan Quintela
    while(field->name) {
1472 f11f6a5f Juan Quintela
        if (!field->field_exists ||
1473 f11f6a5f Juan Quintela
            field->field_exists(opaque, vmsd->version_id)) {
1474 f11f6a5f Juan Quintela
            void *base_addr = opaque + field->offset;
1475 f11f6a5f Juan Quintela
            int i, n_elems = 1;
1476 e61a1e0a Juan Quintela
            int size = field->size;
1477 dde0463b Juan Quintela
1478 e61a1e0a Juan Quintela
            if (field->flags & VMS_VBUFFER) {
1479 e61a1e0a Juan Quintela
                size = *(int32_t *)(opaque+field->size_offset);
1480 33599e2a Juan Quintela
                if (field->flags & VMS_MULTIPLY) {
1481 33599e2a Juan Quintela
                    size *= field->size;
1482 33599e2a Juan Quintela
                }
1483 e61a1e0a Juan Quintela
            }
1484 f11f6a5f Juan Quintela
            if (field->flags & VMS_ARRAY) {
1485 f11f6a5f Juan Quintela
                n_elems = field->num;
1486 d6698281 Juan Quintela
            } else if (field->flags & VMS_VARRAY_INT32) {
1487 d6698281 Juan Quintela
                n_elems = *(int32_t *)(opaque+field->num_offset);
1488 1329d189 Amos Kong
            } else if (field->flags & VMS_VARRAY_UINT32) {
1489 1329d189 Amos Kong
                n_elems = *(uint32_t *)(opaque+field->num_offset);
1490 bdb4941d Juan Quintela
            } else if (field->flags & VMS_VARRAY_UINT16) {
1491 bdb4941d Juan Quintela
                n_elems = *(uint16_t *)(opaque+field->num_offset);
1492 b784421c Juan Quintela
            } else if (field->flags & VMS_VARRAY_UINT8) {
1493 b784421c Juan Quintela
                n_elems = *(uint8_t *)(opaque+field->num_offset);
1494 f11f6a5f Juan Quintela
            }
1495 f11f6a5f Juan Quintela
            if (field->flags & VMS_POINTER) {
1496 e61a1e0a Juan Quintela
                base_addr = *(void **)base_addr + field->start;
1497 f11f6a5f Juan Quintela
            }
1498 f11f6a5f Juan Quintela
            for (i = 0; i < n_elems; i++) {
1499 e61a1e0a Juan Quintela
                void *addr = base_addr + size * i;
1500 ec245e21 Juan Quintela
1501 8595387e Juan Quintela
                if (field->flags & VMS_ARRAY_OF_POINTER) {
1502 8595387e Juan Quintela
                    addr = *(void **)addr;
1503 8595387e Juan Quintela
                }
1504 f11f6a5f Juan Quintela
                if (field->flags & VMS_STRUCT) {
1505 f11f6a5f Juan Quintela
                    vmstate_save_state(f, field->vmsd, addr);
1506 f11f6a5f Juan Quintela
                } else {
1507 e61a1e0a Juan Quintela
                    field->info->put(f, addr, size);
1508 f11f6a5f Juan Quintela
                }
1509 ec245e21 Juan Quintela
            }
1510 dde0463b Juan Quintela
        }
1511 9ed7d6ae Juan Quintela
        field++;
1512 9ed7d6ae Juan Quintela
    }
1513 811814bd Juan Quintela
    vmstate_subsection_save(f, vmsd, opaque);
1514 9ed7d6ae Juan Quintela
}
1515 9ed7d6ae Juan Quintela
1516 4082be4d Juan Quintela
static int vmstate_load(QEMUFile *f, SaveStateEntry *se, int version_id)
1517 4082be4d Juan Quintela
{
1518 9ed7d6ae Juan Quintela
    if (!se->vmsd) {         /* Old style */
1519 22ea40f4 Juan Quintela
        return se->ops->load_state(f, se->opaque, version_id);
1520 9ed7d6ae Juan Quintela
    }
1521 9ed7d6ae Juan Quintela
    return vmstate_load_state(f, se->vmsd, se->opaque, version_id);
1522 4082be4d Juan Quintela
}
1523 4082be4d Juan Quintela
1524 dc912121 Alex Williamson
static void vmstate_save(QEMUFile *f, SaveStateEntry *se)
1525 4082be4d Juan Quintela
{
1526 9ed7d6ae Juan Quintela
    if (!se->vmsd) {         /* Old style */
1527 22ea40f4 Juan Quintela
        se->ops->save_state(f, se->opaque);
1528 dc912121 Alex Williamson
        return;
1529 9ed7d6ae Juan Quintela
    }
1530 9ed7d6ae Juan Quintela
    vmstate_save_state(f,se->vmsd, se->opaque);
1531 4082be4d Juan Quintela
}
1532 4082be4d Juan Quintela
1533 a672b469 aliguori
#define QEMU_VM_FILE_MAGIC           0x5145564d
1534 a672b469 aliguori
#define QEMU_VM_FILE_VERSION_COMPAT  0x00000002
1535 a672b469 aliguori
#define QEMU_VM_FILE_VERSION         0x00000003
1536 a672b469 aliguori
1537 a672b469 aliguori
#define QEMU_VM_EOF                  0x00
1538 a672b469 aliguori
#define QEMU_VM_SECTION_START        0x01
1539 a672b469 aliguori
#define QEMU_VM_SECTION_PART         0x02
1540 a672b469 aliguori
#define QEMU_VM_SECTION_END          0x03
1541 a672b469 aliguori
#define QEMU_VM_SECTION_FULL         0x04
1542 811814bd Juan Quintela
#define QEMU_VM_SUBSECTION           0x05
1543 a672b469 aliguori
1544 e1c37d0e Luiz Capitulino
bool qemu_savevm_state_blocked(Error **errp)
1545 dc912121 Alex Williamson
{
1546 dc912121 Alex Williamson
    SaveStateEntry *se;
1547 dc912121 Alex Williamson
1548 dc912121 Alex Williamson
    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1549 dc912121 Alex Williamson
        if (se->no_migrate) {
1550 e1c37d0e Luiz Capitulino
            error_set(errp, QERR_MIGRATION_NOT_SUPPORTED, se->idstr);
1551 dc912121 Alex Williamson
            return true;
1552 dc912121 Alex Williamson
        }
1553 dc912121 Alex Williamson
    }
1554 dc912121 Alex Williamson
    return false;
1555 dc912121 Alex Williamson
}
1556 dc912121 Alex Williamson
1557 6607ae23 Isaku Yamahata
int qemu_savevm_state_begin(QEMUFile *f,
1558 6607ae23 Isaku Yamahata
                            const MigrationParams *params)
1559 a672b469 aliguori
{
1560 a672b469 aliguori
    SaveStateEntry *se;
1561 39346385 Juan Quintela
    int ret;
1562 a672b469 aliguori
1563 c163b5ca lirans@il.ibm.com
    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1564 22ea40f4 Juan Quintela
        if (!se->ops || !se->ops->set_params) {
1565 c163b5ca lirans@il.ibm.com
            continue;
1566 6607ae23 Isaku Yamahata
        }
1567 22ea40f4 Juan Quintela
        se->ops->set_params(params, se->opaque);
1568 c163b5ca lirans@il.ibm.com
    }
1569 c163b5ca lirans@il.ibm.com
    
1570 a672b469 aliguori
    qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
1571 a672b469 aliguori
    qemu_put_be32(f, QEMU_VM_FILE_VERSION);
1572 a672b469 aliguori
1573 72cf2d4f Blue Swirl
    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1574 a672b469 aliguori
        int len;
1575 a672b469 aliguori
1576 d1315aac Juan Quintela
        if (!se->ops || !se->ops->save_live_setup) {
1577 a672b469 aliguori
            continue;
1578 22ea40f4 Juan Quintela
        }
1579 6bd68781 Juan Quintela
        if (se->ops && se->ops->is_active) {
1580 6bd68781 Juan Quintela
            if (!se->ops->is_active(se->opaque)) {
1581 6bd68781 Juan Quintela
                continue;
1582 6bd68781 Juan Quintela
            }
1583 6bd68781 Juan Quintela
        }
1584 a672b469 aliguori
        /* Section type */
1585 a672b469 aliguori
        qemu_put_byte(f, QEMU_VM_SECTION_START);
1586 a672b469 aliguori
        qemu_put_be32(f, se->section_id);
1587 a672b469 aliguori
1588 a672b469 aliguori
        /* ID string */
1589 a672b469 aliguori
        len = strlen(se->idstr);
1590 a672b469 aliguori
        qemu_put_byte(f, len);
1591 a672b469 aliguori
        qemu_put_buffer(f, (uint8_t *)se->idstr, len);
1592 a672b469 aliguori
1593 a672b469 aliguori
        qemu_put_be32(f, se->instance_id);
1594 a672b469 aliguori
        qemu_put_be32(f, se->version_id);
1595 a672b469 aliguori
1596 d1315aac Juan Quintela
        ret = se->ops->save_live_setup(f, se->opaque);
1597 2975725f Juan Quintela
        if (ret < 0) {
1598 539de124 Luiz Capitulino
            qemu_savevm_state_cancel(f);
1599 2975725f Juan Quintela
            return ret;
1600 2975725f Juan Quintela
        }
1601 a672b469 aliguori
    }
1602 624b9cc2 Juan Quintela
    ret = qemu_file_get_error(f);
1603 39346385 Juan Quintela
    if (ret != 0) {
1604 539de124 Luiz Capitulino
        qemu_savevm_state_cancel(f);
1605 4ec7fcc7 Jan Kiszka
    }
1606 a672b469 aliguori
1607 39346385 Juan Quintela
    return ret;
1608 39346385 Juan Quintela
1609 a672b469 aliguori
}
1610 a672b469 aliguori
1611 39346385 Juan Quintela
/*
1612 07f35073 Dong Xu Wang
 * this function has three return values:
1613 39346385 Juan Quintela
 *   negative: there was one error, and we have -errno.
1614 39346385 Juan Quintela
 *   0 : We haven't finished, caller have to go again
1615 39346385 Juan Quintela
 *   1 : We have finished, we can go to complete phase
1616 39346385 Juan Quintela
 */
1617 539de124 Luiz Capitulino
int qemu_savevm_state_iterate(QEMUFile *f)
1618 a672b469 aliguori
{
1619 a672b469 aliguori
    SaveStateEntry *se;
1620 a672b469 aliguori
    int ret = 1;
1621 a672b469 aliguori
1622 72cf2d4f Blue Swirl
    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1623 16310a3c Juan Quintela
        if (!se->ops || !se->ops->save_live_iterate) {
1624 a672b469 aliguori
            continue;
1625 22ea40f4 Juan Quintela
        }
1626 6bd68781 Juan Quintela
        if (se->ops && se->ops->is_active) {
1627 6bd68781 Juan Quintela
            if (!se->ops->is_active(se->opaque)) {
1628 6bd68781 Juan Quintela
                continue;
1629 6bd68781 Juan Quintela
            }
1630 6bd68781 Juan Quintela
        }
1631 aac844ed Juan Quintela
        if (qemu_file_rate_limit(f)) {
1632 aac844ed Juan Quintela
            return 0;
1633 aac844ed Juan Quintela
        }
1634 517a13c9 Juan Quintela
        trace_savevm_section_start();
1635 a672b469 aliguori
        /* Section type */
1636 a672b469 aliguori
        qemu_put_byte(f, QEMU_VM_SECTION_PART);
1637 a672b469 aliguori
        qemu_put_be32(f, se->section_id);
1638 a672b469 aliguori
1639 16310a3c Juan Quintela
        ret = se->ops->save_live_iterate(f, se->opaque);
1640 517a13c9 Juan Quintela
        trace_savevm_section_end(se->section_id);
1641 517a13c9 Juan Quintela
1642 2975725f Juan Quintela
        if (ret <= 0) {
1643 90697be8 Jan Kiszka
            /* Do not proceed to the next vmstate before this one reported
1644 90697be8 Jan Kiszka
               completion of the current stage. This serializes the migration
1645 90697be8 Jan Kiszka
               and reduces the probability that a faster changing state is
1646 90697be8 Jan Kiszka
               synchronized over and over again. */
1647 90697be8 Jan Kiszka
            break;
1648 90697be8 Jan Kiszka
        }
1649 a672b469 aliguori
    }
1650 39346385 Juan Quintela
    if (ret != 0) {
1651 39346385 Juan Quintela
        return ret;
1652 39346385 Juan Quintela
    }
1653 624b9cc2 Juan Quintela
    ret = qemu_file_get_error(f);
1654 39346385 Juan Quintela
    if (ret != 0) {
1655 539de124 Luiz Capitulino
        qemu_savevm_state_cancel(f);
1656 4ec7fcc7 Jan Kiszka
    }
1657 39346385 Juan Quintela
    return ret;
1658 a672b469 aliguori
}
1659 a672b469 aliguori
1660 539de124 Luiz Capitulino
int qemu_savevm_state_complete(QEMUFile *f)
1661 a672b469 aliguori
{
1662 a672b469 aliguori
    SaveStateEntry *se;
1663 2975725f Juan Quintela
    int ret;
1664 a672b469 aliguori
1665 ea375f9a Jan Kiszka
    cpu_synchronize_all_states();
1666 ea375f9a Jan Kiszka
1667 72cf2d4f Blue Swirl
    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1668 16310a3c Juan Quintela
        if (!se->ops || !se->ops->save_live_complete) {
1669 a672b469 aliguori
            continue;
1670 22ea40f4 Juan Quintela
        }
1671 6bd68781 Juan Quintela
        if (se->ops && se->ops->is_active) {
1672 6bd68781 Juan Quintela
            if (!se->ops->is_active(se->opaque)) {
1673 6bd68781 Juan Quintela
                continue;
1674 6bd68781 Juan Quintela
            }
1675 6bd68781 Juan Quintela
        }
1676 517a13c9 Juan Quintela
        trace_savevm_section_start();
1677 a672b469 aliguori
        /* Section type */
1678 a672b469 aliguori
        qemu_put_byte(f, QEMU_VM_SECTION_END);
1679 a672b469 aliguori
        qemu_put_be32(f, se->section_id);
1680 a672b469 aliguori
1681 16310a3c Juan Quintela
        ret = se->ops->save_live_complete(f, se->opaque);
1682 517a13c9 Juan Quintela
        trace_savevm_section_end(se->section_id);
1683 2975725f Juan Quintela
        if (ret < 0) {
1684 2975725f Juan Quintela
            return ret;
1685 2975725f Juan Quintela
        }
1686 a672b469 aliguori
    }
1687 a672b469 aliguori
1688 72cf2d4f Blue Swirl
    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1689 a672b469 aliguori
        int len;
1690 a672b469 aliguori
1691 22ea40f4 Juan Quintela
        if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
1692 a672b469 aliguori
            continue;
1693 22ea40f4 Juan Quintela
        }
1694 517a13c9 Juan Quintela
        trace_savevm_section_start();
1695 a672b469 aliguori
        /* Section type */
1696 a672b469 aliguori
        qemu_put_byte(f, QEMU_VM_SECTION_FULL);
1697 a672b469 aliguori
        qemu_put_be32(f, se->section_id);
1698 a672b469 aliguori
1699 a672b469 aliguori
        /* ID string */
1700 a672b469 aliguori
        len = strlen(se->idstr);
1701 a672b469 aliguori
        qemu_put_byte(f, len);
1702 a672b469 aliguori
        qemu_put_buffer(f, (uint8_t *)se->idstr, len);
1703 a672b469 aliguori
1704 a672b469 aliguori
        qemu_put_be32(f, se->instance_id);
1705 a672b469 aliguori
        qemu_put_be32(f, se->version_id);
1706 a672b469 aliguori
1707 dc912121 Alex Williamson
        vmstate_save(f, se);
1708 517a13c9 Juan Quintela
        trace_savevm_section_end(se->section_id);
1709 a672b469 aliguori
    }
1710 a672b469 aliguori
1711 a672b469 aliguori
    qemu_put_byte(f, QEMU_VM_EOF);
1712 a672b469 aliguori
1713 624b9cc2 Juan Quintela
    return qemu_file_get_error(f);
1714 a672b469 aliguori
}
1715 a672b469 aliguori
1716 539de124 Luiz Capitulino
void qemu_savevm_state_cancel(QEMUFile *f)
1717 4ec7fcc7 Jan Kiszka
{
1718 4ec7fcc7 Jan Kiszka
    SaveStateEntry *se;
1719 4ec7fcc7 Jan Kiszka
1720 4ec7fcc7 Jan Kiszka
    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1721 9b5bfab0 Juan Quintela
        if (se->ops && se->ops->cancel) {
1722 9b5bfab0 Juan Quintela
            se->ops->cancel(se->opaque);
1723 4ec7fcc7 Jan Kiszka
        }
1724 4ec7fcc7 Jan Kiszka
    }
1725 4ec7fcc7 Jan Kiszka
}
1726 4ec7fcc7 Jan Kiszka
1727 e1c37d0e Luiz Capitulino
static int qemu_savevm_state(QEMUFile *f)
1728 a672b469 aliguori
{
1729 a672b469 aliguori
    int ret;
1730 6607ae23 Isaku Yamahata
    MigrationParams params = {
1731 6607ae23 Isaku Yamahata
        .blk = 0,
1732 6607ae23 Isaku Yamahata
        .shared = 0
1733 6607ae23 Isaku Yamahata
    };
1734 a672b469 aliguori
1735 e1c37d0e Luiz Capitulino
    if (qemu_savevm_state_blocked(NULL)) {
1736 dc912121 Alex Williamson
        ret = -EINVAL;
1737 dc912121 Alex Williamson
        goto out;
1738 dc912121 Alex Williamson
    }
1739 dc912121 Alex Williamson
1740 6607ae23 Isaku Yamahata
    ret = qemu_savevm_state_begin(f, &params);
1741 a672b469 aliguori
    if (ret < 0)
1742 a672b469 aliguori
        goto out;
1743 a672b469 aliguori
1744 a672b469 aliguori
    do {
1745 539de124 Luiz Capitulino
        ret = qemu_savevm_state_iterate(f);
1746 a672b469 aliguori
        if (ret < 0)
1747 a672b469 aliguori
            goto out;
1748 a672b469 aliguori
    } while (ret == 0);
1749 a672b469 aliguori
1750 539de124 Luiz Capitulino
    ret = qemu_savevm_state_complete(f);
1751 a672b469 aliguori
1752 a672b469 aliguori
out:
1753 39346385 Juan Quintela
    if (ret == 0) {
1754 624b9cc2 Juan Quintela
        ret = qemu_file_get_error(f);
1755 39346385 Juan Quintela
    }
1756 a672b469 aliguori
1757 a672b469 aliguori
    return ret;
1758 a672b469 aliguori
}
1759 a672b469 aliguori
1760 a7ae8355 Stefano Stabellini
static int qemu_save_device_state(QEMUFile *f)
1761 a7ae8355 Stefano Stabellini
{
1762 a7ae8355 Stefano Stabellini
    SaveStateEntry *se;
1763 a7ae8355 Stefano Stabellini
1764 a7ae8355 Stefano Stabellini
    qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
1765 a7ae8355 Stefano Stabellini
    qemu_put_be32(f, QEMU_VM_FILE_VERSION);
1766 a7ae8355 Stefano Stabellini
1767 a7ae8355 Stefano Stabellini
    cpu_synchronize_all_states();
1768 a7ae8355 Stefano Stabellini
1769 a7ae8355 Stefano Stabellini
    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1770 a7ae8355 Stefano Stabellini
        int len;
1771 a7ae8355 Stefano Stabellini
1772 a7ae8355 Stefano Stabellini
        if (se->is_ram) {
1773 a7ae8355 Stefano Stabellini
            continue;
1774 a7ae8355 Stefano Stabellini
        }
1775 22ea40f4 Juan Quintela
        if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
1776 a7ae8355 Stefano Stabellini
            continue;
1777 a7ae8355 Stefano Stabellini
        }
1778 a7ae8355 Stefano Stabellini
1779 a7ae8355 Stefano Stabellini
        /* Section type */
1780 a7ae8355 Stefano Stabellini
        qemu_put_byte(f, QEMU_VM_SECTION_FULL);
1781 a7ae8355 Stefano Stabellini
        qemu_put_be32(f, se->section_id);
1782 a7ae8355 Stefano Stabellini
1783 a7ae8355 Stefano Stabellini
        /* ID string */
1784 a7ae8355 Stefano Stabellini
        len = strlen(se->idstr);
1785 a7ae8355 Stefano Stabellini
        qemu_put_byte(f, len);
1786 a7ae8355 Stefano Stabellini
        qemu_put_buffer(f, (uint8_t *)se->idstr, len);
1787 a7ae8355 Stefano Stabellini
1788 a7ae8355 Stefano Stabellini
        qemu_put_be32(f, se->instance_id);
1789 a7ae8355 Stefano Stabellini
        qemu_put_be32(f, se->version_id);
1790 a7ae8355 Stefano Stabellini
1791 a7ae8355 Stefano Stabellini
        vmstate_save(f, se);
1792 a7ae8355 Stefano Stabellini
    }
1793 a7ae8355 Stefano Stabellini
1794 a7ae8355 Stefano Stabellini
    qemu_put_byte(f, QEMU_VM_EOF);
1795 a7ae8355 Stefano Stabellini
1796 a7ae8355 Stefano Stabellini
    return qemu_file_get_error(f);
1797 a7ae8355 Stefano Stabellini
}
1798 a7ae8355 Stefano Stabellini
1799 a672b469 aliguori
static SaveStateEntry *find_se(const char *idstr, int instance_id)
1800 a672b469 aliguori
{
1801 a672b469 aliguori
    SaveStateEntry *se;
1802 a672b469 aliguori
1803 72cf2d4f Blue Swirl
    QTAILQ_FOREACH(se, &savevm_handlers, entry) {
1804 a672b469 aliguori
        if (!strcmp(se->idstr, idstr) &&
1805 4d2ffa08 Jan Kiszka
            (instance_id == se->instance_id ||
1806 4d2ffa08 Jan Kiszka
             instance_id == se->alias_id))
1807 a672b469 aliguori
            return se;
1808 7685ee6a Alex Williamson
        /* Migrating from an older version? */
1809 7685ee6a Alex Williamson
        if (strstr(se->idstr, idstr) && se->compat) {
1810 7685ee6a Alex Williamson
            if (!strcmp(se->compat->idstr, idstr) &&
1811 7685ee6a Alex Williamson
                (instance_id == se->compat->instance_id ||
1812 7685ee6a Alex Williamson
                 instance_id == se->alias_id))
1813 7685ee6a Alex Williamson
                return se;
1814 7685ee6a Alex Williamson
        }
1815 a672b469 aliguori
    }
1816 a672b469 aliguori
    return NULL;
1817 a672b469 aliguori
}
1818 a672b469 aliguori
1819 811814bd Juan Quintela
static const VMStateDescription *vmstate_get_subsection(const VMStateSubsection *sub, char *idstr)
1820 811814bd Juan Quintela
{
1821 811814bd Juan Quintela
    while(sub && sub->needed) {
1822 811814bd Juan Quintela
        if (strcmp(idstr, sub->vmsd->name) == 0) {
1823 811814bd Juan Quintela
            return sub->vmsd;
1824 811814bd Juan Quintela
        }
1825 811814bd Juan Quintela
        sub++;
1826 811814bd Juan Quintela
    }
1827 811814bd Juan Quintela
    return NULL;
1828 811814bd Juan Quintela
}
1829 811814bd Juan Quintela
1830 811814bd Juan Quintela
static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
1831 811814bd Juan Quintela
                                   void *opaque)
1832 811814bd Juan Quintela
{
1833 c6380724 Juan Quintela
    while (qemu_peek_byte(f, 0) == QEMU_VM_SUBSECTION) {
1834 811814bd Juan Quintela
        char idstr[256];
1835 811814bd Juan Quintela
        int ret;
1836 c6380724 Juan Quintela
        uint8_t version_id, len, size;
1837 811814bd Juan Quintela
        const VMStateDescription *sub_vmsd;
1838 811814bd Juan Quintela
1839 c6380724 Juan Quintela
        len = qemu_peek_byte(f, 1);
1840 c6380724 Juan Quintela
        if (len < strlen(vmsd->name) + 1) {
1841 c6380724 Juan Quintela
            /* subsection name has be be "section_name/a" */
1842 c6380724 Juan Quintela
            return 0;
1843 c6380724 Juan Quintela
        }
1844 c6380724 Juan Quintela
        size = qemu_peek_buffer(f, (uint8_t *)idstr, len, 2);
1845 c6380724 Juan Quintela
        if (size != len) {
1846 c6380724 Juan Quintela
            return 0;
1847 c6380724 Juan Quintela
        }
1848 c6380724 Juan Quintela
        idstr[size] = 0;
1849 811814bd Juan Quintela
1850 c6380724 Juan Quintela
        if (strncmp(vmsd->name, idstr, strlen(vmsd->name)) != 0) {
1851 c6380724 Juan Quintela
            /* it don't have a valid subsection name */
1852 c6380724 Juan Quintela
            return 0;
1853 c6380724 Juan Quintela
        }
1854 3da9eebd Juan Quintela
        sub_vmsd = vmstate_get_subsection(vmsd->subsections, idstr);
1855 811814bd Juan Quintela
        if (sub_vmsd == NULL) {
1856 811814bd Juan Quintela
            return -ENOENT;
1857 811814bd Juan Quintela
        }
1858 c6380724 Juan Quintela
        qemu_file_skip(f, 1); /* subsection */
1859 c6380724 Juan Quintela
        qemu_file_skip(f, 1); /* len */
1860 c6380724 Juan Quintela
        qemu_file_skip(f, len); /* idstr */
1861 c6380724 Juan Quintela
        version_id = qemu_get_be32(f);
1862 c6380724 Juan Quintela
1863 811814bd Juan Quintela
        ret = vmstate_load_state(f, sub_vmsd, opaque, version_id);
1864 811814bd Juan Quintela
        if (ret) {
1865 811814bd Juan Quintela
            return ret;
1866 811814bd Juan Quintela
        }
1867 811814bd Juan Quintela
    }
1868 811814bd Juan Quintela
    return 0;
1869 811814bd Juan Quintela
}
1870 811814bd Juan Quintela
1871 811814bd Juan Quintela
static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
1872 811814bd Juan Quintela
                                    void *opaque)
1873 811814bd Juan Quintela
{
1874 811814bd Juan Quintela
    const VMStateSubsection *sub = vmsd->subsections;
1875 811814bd Juan Quintela
1876 811814bd Juan Quintela
    while (sub && sub->needed) {
1877 811814bd Juan Quintela
        if (sub->needed(opaque)) {
1878 811814bd Juan Quintela
            const VMStateDescription *vmsd = sub->vmsd;
1879 811814bd Juan Quintela
            uint8_t len;
1880 811814bd Juan Quintela
1881 811814bd Juan Quintela
            qemu_put_byte(f, QEMU_VM_SUBSECTION);
1882 811814bd Juan Quintela
            len = strlen(vmsd->name);
1883 811814bd Juan Quintela
            qemu_put_byte(f, len);
1884 811814bd Juan Quintela
            qemu_put_buffer(f, (uint8_t *)vmsd->name, len);
1885 811814bd Juan Quintela
            qemu_put_be32(f, vmsd->version_id);
1886 811814bd Juan Quintela
            vmstate_save_state(f, vmsd, opaque);
1887 811814bd Juan Quintela
        }
1888 811814bd Juan Quintela
        sub++;
1889 811814bd Juan Quintela
    }
1890 811814bd Juan Quintela
}
1891 811814bd Juan Quintela
1892 a672b469 aliguori
typedef struct LoadStateEntry {
1893 72cf2d4f Blue Swirl
    QLIST_ENTRY(LoadStateEntry) entry;
1894 a672b469 aliguori
    SaveStateEntry *se;
1895 a672b469 aliguori
    int section_id;
1896 a672b469 aliguori
    int version_id;
1897 a672b469 aliguori
} LoadStateEntry;
1898 a672b469 aliguori
1899 a672b469 aliguori
int qemu_loadvm_state(QEMUFile *f)
1900 a672b469 aliguori
{
1901 72cf2d4f Blue Swirl
    QLIST_HEAD(, LoadStateEntry) loadvm_handlers =
1902 72cf2d4f Blue Swirl
        QLIST_HEAD_INITIALIZER(loadvm_handlers);
1903 f4dbb8dd Juan Quintela
    LoadStateEntry *le, *new_le;
1904 a672b469 aliguori
    uint8_t section_type;
1905 a672b469 aliguori
    unsigned int v;
1906 a672b469 aliguori
    int ret;
1907 a672b469 aliguori
1908 e1c37d0e Luiz Capitulino
    if (qemu_savevm_state_blocked(NULL)) {
1909 dc912121 Alex Williamson
        return -EINVAL;
1910 dc912121 Alex Williamson
    }
1911 dc912121 Alex Williamson
1912 a672b469 aliguori
    v = qemu_get_be32(f);
1913 a672b469 aliguori
    if (v != QEMU_VM_FILE_MAGIC)
1914 a672b469 aliguori
        return -EINVAL;
1915 a672b469 aliguori
1916 a672b469 aliguori
    v = qemu_get_be32(f);
1917 bbfe1408 Juan Quintela
    if (v == QEMU_VM_FILE_VERSION_COMPAT) {
1918 bbfe1408 Juan Quintela
        fprintf(stderr, "SaveVM v2 format is obsolete and don't work anymore\n");
1919 bbfe1408 Juan Quintela
        return -ENOTSUP;
1920 bbfe1408 Juan Quintela
    }
1921 a672b469 aliguori
    if (v != QEMU_VM_FILE_VERSION)
1922 a672b469 aliguori
        return -ENOTSUP;
1923 a672b469 aliguori
1924 a672b469 aliguori
    while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) {
1925 a672b469 aliguori
        uint32_t instance_id, version_id, section_id;
1926 a672b469 aliguori
        SaveStateEntry *se;
1927 a672b469 aliguori
        char idstr[257];
1928 a672b469 aliguori
        int len;
1929 a672b469 aliguori
1930 a672b469 aliguori
        switch (section_type) {
1931 a672b469 aliguori
        case QEMU_VM_SECTION_START:
1932 a672b469 aliguori
        case QEMU_VM_SECTION_FULL:
1933 a672b469 aliguori
            /* Read section start */
1934 a672b469 aliguori
            section_id = qemu_get_be32(f);
1935 a672b469 aliguori
            len = qemu_get_byte(f);
1936 a672b469 aliguori
            qemu_get_buffer(f, (uint8_t *)idstr, len);
1937 a672b469 aliguori
            idstr[len] = 0;
1938 a672b469 aliguori
            instance_id = qemu_get_be32(f);
1939 a672b469 aliguori
            version_id = qemu_get_be32(f);
1940 a672b469 aliguori
1941 a672b469 aliguori
            /* Find savevm section */
1942 a672b469 aliguori
            se = find_se(idstr, instance_id);
1943 a672b469 aliguori
            if (se == NULL) {
1944 a672b469 aliguori
                fprintf(stderr, "Unknown savevm section or instance '%s' %d\n", idstr, instance_id);
1945 a672b469 aliguori
                ret = -EINVAL;
1946 a672b469 aliguori
                goto out;
1947 a672b469 aliguori
            }
1948 a672b469 aliguori
1949 a672b469 aliguori
            /* Validate version */
1950 a672b469 aliguori
            if (version_id > se->version_id) {
1951 a672b469 aliguori
                fprintf(stderr, "savevm: unsupported version %d for '%s' v%d\n",
1952 a672b469 aliguori
                        version_id, idstr, se->version_id);
1953 a672b469 aliguori
                ret = -EINVAL;
1954 a672b469 aliguori
                goto out;
1955 a672b469 aliguori
            }
1956 a672b469 aliguori
1957 a672b469 aliguori
            /* Add entry */
1958 7267c094 Anthony Liguori
            le = g_malloc0(sizeof(*le));
1959 a672b469 aliguori
1960 a672b469 aliguori
            le->se = se;
1961 a672b469 aliguori
            le->section_id = section_id;
1962 a672b469 aliguori
            le->version_id = version_id;
1963 72cf2d4f Blue Swirl
            QLIST_INSERT_HEAD(&loadvm_handlers, le, entry);
1964 a672b469 aliguori
1965 4082be4d Juan Quintela
            ret = vmstate_load(f, le->se, le->version_id);
1966 b5a22e4a Juan Quintela
            if (ret < 0) {
1967 b5a22e4a Juan Quintela
                fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n",
1968 b5a22e4a Juan Quintela
                        instance_id, idstr);
1969 b5a22e4a Juan Quintela
                goto out;
1970 b5a22e4a Juan Quintela
            }
1971 a672b469 aliguori
            break;
1972 a672b469 aliguori
        case QEMU_VM_SECTION_PART:
1973 a672b469 aliguori
        case QEMU_VM_SECTION_END:
1974 a672b469 aliguori
            section_id = qemu_get_be32(f);
1975 a672b469 aliguori
1976 72cf2d4f Blue Swirl
            QLIST_FOREACH(le, &loadvm_handlers, entry) {
1977 f4dbb8dd Juan Quintela
                if (le->section_id == section_id) {
1978 f4dbb8dd Juan Quintela
                    break;
1979 f4dbb8dd Juan Quintela
                }
1980 f4dbb8dd Juan Quintela
            }
1981 a672b469 aliguori
            if (le == NULL) {
1982 a672b469 aliguori
                fprintf(stderr, "Unknown savevm section %d\n", section_id);
1983 a672b469 aliguori
                ret = -EINVAL;
1984 a672b469 aliguori
                goto out;
1985 a672b469 aliguori
            }
1986 a672b469 aliguori
1987 4082be4d Juan Quintela
            ret = vmstate_load(f, le->se, le->version_id);
1988 b5a22e4a Juan Quintela
            if (ret < 0) {
1989 b5a22e4a Juan Quintela
                fprintf(stderr, "qemu: warning: error while loading state section id %d\n",
1990 b5a22e4a Juan Quintela
                        section_id);
1991 b5a22e4a Juan Quintela
                goto out;
1992 b5a22e4a Juan Quintela
            }
1993 a672b469 aliguori
            break;
1994 a672b469 aliguori
        default:
1995 a672b469 aliguori
            fprintf(stderr, "Unknown savevm section type %d\n", section_type);
1996 a672b469 aliguori
            ret = -EINVAL;
1997 a672b469 aliguori
            goto out;
1998 a672b469 aliguori
        }
1999 a672b469 aliguori
    }
2000 a672b469 aliguori
2001 ea375f9a Jan Kiszka
    cpu_synchronize_all_post_init();
2002 ea375f9a Jan Kiszka
2003 a672b469 aliguori
    ret = 0;
2004 a672b469 aliguori
2005 a672b469 aliguori
out:
2006 72cf2d4f Blue Swirl
    QLIST_FOREACH_SAFE(le, &loadvm_handlers, entry, new_le) {
2007 72cf2d4f Blue Swirl
        QLIST_REMOVE(le, entry);
2008 7267c094 Anthony Liguori
        g_free(le);
2009 a672b469 aliguori
    }
2010 a672b469 aliguori
2011 42802d47 Juan Quintela
    if (ret == 0) {
2012 42802d47 Juan Quintela
        ret = qemu_file_get_error(f);
2013 624b9cc2 Juan Quintela
    }
2014 a672b469 aliguori
2015 a672b469 aliguori
    return ret;
2016 a672b469 aliguori
}
2017 a672b469 aliguori
2018 a672b469 aliguori
static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
2019 a672b469 aliguori
                              const char *name)
2020 a672b469 aliguori
{
2021 a672b469 aliguori
    QEMUSnapshotInfo *sn_tab, *sn;
2022 a672b469 aliguori
    int nb_sns, i, ret;
2023 a672b469 aliguori
2024 a672b469 aliguori
    ret = -ENOENT;
2025 a672b469 aliguori
    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
2026 a672b469 aliguori
    if (nb_sns < 0)
2027 a672b469 aliguori
        return ret;
2028 a672b469 aliguori
    for(i = 0; i < nb_sns; i++) {
2029 a672b469 aliguori
        sn = &sn_tab[i];
2030 a672b469 aliguori
        if (!strcmp(sn->id_str, name) || !strcmp(sn->name, name)) {
2031 a672b469 aliguori
            *sn_info = *sn;
2032 a672b469 aliguori
            ret = 0;
2033 a672b469 aliguori
            break;
2034 a672b469 aliguori
        }
2035 a672b469 aliguori
    }
2036 7267c094 Anthony Liguori
    g_free(sn_tab);
2037 a672b469 aliguori
    return ret;
2038 a672b469 aliguori
}
2039 a672b469 aliguori
2040 cb499fb2 Kevin Wolf
/*
2041 cb499fb2 Kevin Wolf
 * Deletes snapshots of a given name in all opened images.
2042 cb499fb2 Kevin Wolf
 */
2043 cb499fb2 Kevin Wolf
static int del_existing_snapshots(Monitor *mon, const char *name)
2044 cb499fb2 Kevin Wolf
{
2045 cb499fb2 Kevin Wolf
    BlockDriverState *bs;
2046 cb499fb2 Kevin Wolf
    QEMUSnapshotInfo sn1, *snapshot = &sn1;
2047 cb499fb2 Kevin Wolf
    int ret;
2048 cb499fb2 Kevin Wolf
2049 dbc13590 Markus Armbruster
    bs = NULL;
2050 dbc13590 Markus Armbruster
    while ((bs = bdrv_next(bs))) {
2051 cb499fb2 Kevin Wolf
        if (bdrv_can_snapshot(bs) &&
2052 cb499fb2 Kevin Wolf
            bdrv_snapshot_find(bs, snapshot, name) >= 0)
2053 cb499fb2 Kevin Wolf
        {
2054 cb499fb2 Kevin Wolf
            ret = bdrv_snapshot_delete(bs, name);
2055 cb499fb2 Kevin Wolf
            if (ret < 0) {
2056 cb499fb2 Kevin Wolf
                monitor_printf(mon,
2057 cb499fb2 Kevin Wolf
                               "Error while deleting snapshot on '%s'\n",
2058 cb499fb2 Kevin Wolf
                               bdrv_get_device_name(bs));
2059 cb499fb2 Kevin Wolf
                return -1;
2060 cb499fb2 Kevin Wolf
            }
2061 cb499fb2 Kevin Wolf
        }
2062 cb499fb2 Kevin Wolf
    }
2063 cb499fb2 Kevin Wolf
2064 cb499fb2 Kevin Wolf
    return 0;
2065 cb499fb2 Kevin Wolf
}
2066 cb499fb2 Kevin Wolf
2067 d54908a5 Luiz Capitulino
void do_savevm(Monitor *mon, const QDict *qdict)
2068 a672b469 aliguori
{
2069 a672b469 aliguori
    BlockDriverState *bs, *bs1;
2070 a672b469 aliguori
    QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
2071 cb499fb2 Kevin Wolf
    int ret;
2072 a672b469 aliguori
    QEMUFile *f;
2073 a672b469 aliguori
    int saved_vm_running;
2074 c2c9a466 Kevin Wolf
    uint64_t vm_state_size;
2075 a672b469 aliguori
#ifdef _WIN32
2076 a672b469 aliguori
    struct _timeb tb;
2077 7d631a11 Miguel Di Ciurcio Filho
    struct tm *ptm;
2078 a672b469 aliguori
#else
2079 a672b469 aliguori
    struct timeval tv;
2080 7d631a11 Miguel Di Ciurcio Filho
    struct tm tm;
2081 a672b469 aliguori
#endif
2082 d54908a5 Luiz Capitulino
    const char *name = qdict_get_try_str(qdict, "name");
2083 a672b469 aliguori
2084 feeee5ac Miguel Di Ciurcio Filho
    /* Verify if there is a device that doesn't support snapshots and is writable */
2085 dbc13590 Markus Armbruster
    bs = NULL;
2086 dbc13590 Markus Armbruster
    while ((bs = bdrv_next(bs))) {
2087 feeee5ac Miguel Di Ciurcio Filho
2088 07b70bfb Markus Armbruster
        if (!bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
2089 feeee5ac Miguel Di Ciurcio Filho
            continue;
2090 feeee5ac Miguel Di Ciurcio Filho
        }
2091 feeee5ac Miguel Di Ciurcio Filho
2092 feeee5ac Miguel Di Ciurcio Filho
        if (!bdrv_can_snapshot(bs)) {
2093 feeee5ac Miguel Di Ciurcio Filho
            monitor_printf(mon, "Device '%s' is writable but does not support snapshots.\n",
2094 feeee5ac Miguel Di Ciurcio Filho
                               bdrv_get_device_name(bs));
2095 feeee5ac Miguel Di Ciurcio Filho
            return;
2096 feeee5ac Miguel Di Ciurcio Filho
        }
2097 feeee5ac Miguel Di Ciurcio Filho
    }
2098 feeee5ac Miguel Di Ciurcio Filho
2099 f9092b10 Markus Armbruster
    bs = bdrv_snapshots();
2100 a672b469 aliguori
    if (!bs) {
2101 376253ec aliguori
        monitor_printf(mon, "No block device can accept snapshots\n");
2102 a672b469 aliguori
        return;
2103 a672b469 aliguori
    }
2104 a672b469 aliguori
2105 1354869c Luiz Capitulino
    saved_vm_running = runstate_is_running();
2106 0461d5a6 Luiz Capitulino
    vm_stop(RUN_STATE_SAVE_VM);
2107 a672b469 aliguori
2108 cb499fb2 Kevin Wolf
    memset(sn, 0, sizeof(*sn));
2109 a672b469 aliguori
2110 a672b469 aliguori
    /* fill auxiliary fields */
2111 a672b469 aliguori
#ifdef _WIN32
2112 a672b469 aliguori
    _ftime(&tb);
2113 a672b469 aliguori
    sn->date_sec = tb.time;
2114 a672b469 aliguori
    sn->date_nsec = tb.millitm * 1000000;
2115 a672b469 aliguori
#else
2116 a672b469 aliguori
    gettimeofday(&tv, NULL);
2117 a672b469 aliguori
    sn->date_sec = tv.tv_sec;
2118 a672b469 aliguori
    sn->date_nsec = tv.tv_usec * 1000;
2119 a672b469 aliguori
#endif
2120 74475455 Paolo Bonzini
    sn->vm_clock_nsec = qemu_get_clock_ns(vm_clock);
2121 a672b469 aliguori
2122 7d631a11 Miguel Di Ciurcio Filho
    if (name) {
2123 7d631a11 Miguel Di Ciurcio Filho
        ret = bdrv_snapshot_find(bs, old_sn, name);
2124 7d631a11 Miguel Di Ciurcio Filho
        if (ret >= 0) {
2125 7d631a11 Miguel Di Ciurcio Filho
            pstrcpy(sn->name, sizeof(sn->name), old_sn->name);
2126 7d631a11 Miguel Di Ciurcio Filho
            pstrcpy(sn->id_str, sizeof(sn->id_str), old_sn->id_str);
2127 7d631a11 Miguel Di Ciurcio Filho
        } else {
2128 7d631a11 Miguel Di Ciurcio Filho
            pstrcpy(sn->name, sizeof(sn->name), name);
2129 7d631a11 Miguel Di Ciurcio Filho
        }
2130 7d631a11 Miguel Di Ciurcio Filho
    } else {
2131 7d631a11 Miguel Di Ciurcio Filho
#ifdef _WIN32
2132 55dd9ffa Stefan Weil
        time_t t = tb.time;
2133 55dd9ffa Stefan Weil
        ptm = localtime(&t);
2134 7d631a11 Miguel Di Ciurcio Filho
        strftime(sn->name, sizeof(sn->name), "vm-%Y%m%d%H%M%S", ptm);
2135 7d631a11 Miguel Di Ciurcio Filho
#else
2136 d7d9b528 Blue Swirl
        /* cast below needed for OpenBSD where tv_sec is still 'long' */
2137 d7d9b528 Blue Swirl
        localtime_r((const time_t *)&tv.tv_sec, &tm);
2138 7d631a11 Miguel Di Ciurcio Filho
        strftime(sn->name, sizeof(sn->name), "vm-%Y%m%d%H%M%S", &tm);
2139 7d631a11 Miguel Di Ciurcio Filho
#endif
2140 7d631a11 Miguel Di Ciurcio Filho
    }
2141 7d631a11 Miguel Di Ciurcio Filho
2142 cb499fb2 Kevin Wolf
    /* Delete old snapshots of the same name */
2143 f139a412 Marcelo Tosatti
    if (name && del_existing_snapshots(mon, name) < 0) {
2144 cb499fb2 Kevin Wolf
        goto the_end;
2145 cb499fb2 Kevin Wolf
    }
2146 cb499fb2 Kevin Wolf
2147 a672b469 aliguori
    /* save the VM state */
2148 45566e9c Christoph Hellwig
    f = qemu_fopen_bdrv(bs, 1);
2149 a672b469 aliguori
    if (!f) {
2150 376253ec aliguori
        monitor_printf(mon, "Could not open VM state file\n");
2151 a672b469 aliguori
        goto the_end;
2152 a672b469 aliguori
    }
2153 e1c37d0e Luiz Capitulino
    ret = qemu_savevm_state(f);
2154 2d22b18f aliguori
    vm_state_size = qemu_ftell(f);
2155 a672b469 aliguori
    qemu_fclose(f);
2156 a672b469 aliguori
    if (ret < 0) {
2157 376253ec aliguori
        monitor_printf(mon, "Error %d while writing VM\n", ret);
2158 a672b469 aliguori
        goto the_end;
2159 a672b469 aliguori
    }
2160 a672b469 aliguori
2161 a672b469 aliguori
    /* create the snapshots */
2162 a672b469 aliguori
2163 dbc13590 Markus Armbruster
    bs1 = NULL;
2164 dbc13590 Markus Armbruster
    while ((bs1 = bdrv_next(bs1))) {
2165 feeee5ac Miguel Di Ciurcio Filho
        if (bdrv_can_snapshot(bs1)) {
2166 2d22b18f aliguori
            /* Write VM state size only to the image that contains the state */
2167 2d22b18f aliguori
            sn->vm_state_size = (bs == bs1 ? vm_state_size : 0);
2168 a672b469 aliguori
            ret = bdrv_snapshot_create(bs1, sn);
2169 a672b469 aliguori
            if (ret < 0) {
2170 376253ec aliguori
                monitor_printf(mon, "Error while creating snapshot on '%s'\n",
2171 376253ec aliguori
                               bdrv_get_device_name(bs1));
2172 a672b469 aliguori
            }
2173 a672b469 aliguori
        }
2174 a672b469 aliguori
    }
2175 a672b469 aliguori
2176 a672b469 aliguori
 the_end:
2177 a672b469 aliguori
    if (saved_vm_running)
2178 a672b469 aliguori
        vm_start();
2179 a672b469 aliguori
}
2180 a672b469 aliguori
2181 a7ae8355 Stefano Stabellini
void qmp_xen_save_devices_state(const char *filename, Error **errp)
2182 a7ae8355 Stefano Stabellini
{
2183 a7ae8355 Stefano Stabellini
    QEMUFile *f;
2184 a7ae8355 Stefano Stabellini
    int saved_vm_running;
2185 a7ae8355 Stefano Stabellini
    int ret;
2186 a7ae8355 Stefano Stabellini
2187 a7ae8355 Stefano Stabellini
    saved_vm_running = runstate_is_running();
2188 a7ae8355 Stefano Stabellini
    vm_stop(RUN_STATE_SAVE_VM);
2189 a7ae8355 Stefano Stabellini
2190 a7ae8355 Stefano Stabellini
    f = qemu_fopen(filename, "wb");
2191 a7ae8355 Stefano Stabellini
    if (!f) {
2192 a7ae8355 Stefano Stabellini
        error_set(errp, QERR_OPEN_FILE_FAILED, filename);
2193 a7ae8355 Stefano Stabellini
        goto the_end;
2194 a7ae8355 Stefano Stabellini
    }
2195 a7ae8355 Stefano Stabellini
    ret = qemu_save_device_state(f);
2196 a7ae8355 Stefano Stabellini
    qemu_fclose(f);
2197 a7ae8355 Stefano Stabellini
    if (ret < 0) {
2198 a7ae8355 Stefano Stabellini
        error_set(errp, QERR_IO_ERROR);
2199 a7ae8355 Stefano Stabellini
    }
2200 a7ae8355 Stefano Stabellini
2201 a7ae8355 Stefano Stabellini
 the_end:
2202 a7ae8355 Stefano Stabellini
    if (saved_vm_running)
2203 a7ae8355 Stefano Stabellini
        vm_start();
2204 a7ae8355 Stefano Stabellini
    return;
2205 a7ae8355 Stefano Stabellini
}
2206 a7ae8355 Stefano Stabellini
2207 03cd4655 Markus Armbruster
int load_vmstate(const char *name)
2208 a672b469 aliguori
{
2209 f0aa7a8b Miguel Di Ciurcio Filho
    BlockDriverState *bs, *bs_vm_state;
2210 2d22b18f aliguori
    QEMUSnapshotInfo sn;
2211 a672b469 aliguori
    QEMUFile *f;
2212 751c6a17 Gerd Hoffmann
    int ret;
2213 a672b469 aliguori
2214 f0aa7a8b Miguel Di Ciurcio Filho
    bs_vm_state = bdrv_snapshots();
2215 f0aa7a8b Miguel Di Ciurcio Filho
    if (!bs_vm_state) {
2216 f0aa7a8b Miguel Di Ciurcio Filho
        error_report("No block device supports snapshots");
2217 f0aa7a8b Miguel Di Ciurcio Filho
        return -ENOTSUP;
2218 f0aa7a8b Miguel Di Ciurcio Filho
    }
2219 f0aa7a8b Miguel Di Ciurcio Filho
2220 f0aa7a8b Miguel Di Ciurcio Filho
    /* Don't even try to load empty VM states */
2221 f0aa7a8b Miguel Di Ciurcio Filho
    ret = bdrv_snapshot_find(bs_vm_state, &sn, name);
2222 f0aa7a8b Miguel Di Ciurcio Filho
    if (ret < 0) {
2223 f0aa7a8b Miguel Di Ciurcio Filho
        return ret;
2224 f0aa7a8b Miguel Di Ciurcio Filho
    } else if (sn.vm_state_size == 0) {
2225 e11480db Kevin Wolf
        error_report("This is a disk-only snapshot. Revert to it offline "
2226 e11480db Kevin Wolf
            "using qemu-img.");
2227 f0aa7a8b Miguel Di Ciurcio Filho
        return -EINVAL;
2228 f0aa7a8b Miguel Di Ciurcio Filho
    }
2229 f0aa7a8b Miguel Di Ciurcio Filho
2230 f0aa7a8b Miguel Di Ciurcio Filho
    /* Verify if there is any device that doesn't support snapshots and is
2231 f0aa7a8b Miguel Di Ciurcio Filho
    writable and check if the requested snapshot is available too. */
2232 dbc13590 Markus Armbruster
    bs = NULL;
2233 dbc13590 Markus Armbruster
    while ((bs = bdrv_next(bs))) {
2234 feeee5ac Miguel Di Ciurcio Filho
2235 07b70bfb Markus Armbruster
        if (!bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) {
2236 feeee5ac Miguel Di Ciurcio Filho
            continue;
2237 feeee5ac Miguel Di Ciurcio Filho
        }
2238 feeee5ac Miguel Di Ciurcio Filho
2239 feeee5ac Miguel Di Ciurcio Filho
        if (!bdrv_can_snapshot(bs)) {
2240 feeee5ac Miguel Di Ciurcio Filho
            error_report("Device '%s' is writable but does not support snapshots.",
2241 feeee5ac Miguel Di Ciurcio Filho
                               bdrv_get_device_name(bs));
2242 feeee5ac Miguel Di Ciurcio Filho
            return -ENOTSUP;
2243 feeee5ac Miguel Di Ciurcio Filho
        }
2244 feeee5ac Miguel Di Ciurcio Filho
2245 f0aa7a8b Miguel Di Ciurcio Filho
        ret = bdrv_snapshot_find(bs, &sn, name);
2246 f0aa7a8b Miguel Di Ciurcio Filho
        if (ret < 0) {
2247 f0aa7a8b Miguel Di Ciurcio Filho
            error_report("Device '%s' does not have the requested snapshot '%s'",
2248 f0aa7a8b Miguel Di Ciurcio Filho
                           bdrv_get_device_name(bs), name);
2249 f0aa7a8b Miguel Di Ciurcio Filho
            return ret;
2250 f0aa7a8b Miguel Di Ciurcio Filho
        }
2251 a672b469 aliguori
    }
2252 a672b469 aliguori
2253 a672b469 aliguori
    /* Flush all IO requests so they don't interfere with the new state.  */
2254 922453bc Stefan Hajnoczi
    bdrv_drain_all();
2255 a672b469 aliguori
2256 f0aa7a8b Miguel Di Ciurcio Filho
    bs = NULL;
2257 f0aa7a8b Miguel Di Ciurcio Filho
    while ((bs = bdrv_next(bs))) {
2258 f0aa7a8b Miguel Di Ciurcio Filho
        if (bdrv_can_snapshot(bs)) {
2259 f0aa7a8b Miguel Di Ciurcio Filho
            ret = bdrv_snapshot_goto(bs, name);
2260 a672b469 aliguori
            if (ret < 0) {
2261 f0aa7a8b Miguel Di Ciurcio Filho
                error_report("Error %d while activating snapshot '%s' on '%s'",
2262 f0aa7a8b Miguel Di Ciurcio Filho
                             ret, name, bdrv_get_device_name(bs));
2263 f0aa7a8b Miguel Di Ciurcio Filho
                return ret;
2264 a672b469 aliguori
            }
2265 a672b469 aliguori
        }
2266 a672b469 aliguori
    }
2267 a672b469 aliguori
2268 a672b469 aliguori
    /* restore the VM state */
2269 f0aa7a8b Miguel Di Ciurcio Filho
    f = qemu_fopen_bdrv(bs_vm_state, 0);
2270 a672b469 aliguori
    if (!f) {
2271 1ecda02b Markus Armbruster
        error_report("Could not open VM state file");
2272 05f2401e Juan Quintela
        return -EINVAL;
2273 a672b469 aliguori
    }
2274 f0aa7a8b Miguel Di Ciurcio Filho
2275 5a8a49d7 Jan Kiszka
    qemu_system_reset(VMRESET_SILENT);
2276 a672b469 aliguori
    ret = qemu_loadvm_state(f);
2277 f0aa7a8b Miguel Di Ciurcio Filho
2278 a672b469 aliguori
    qemu_fclose(f);
2279 a672b469 aliguori
    if (ret < 0) {
2280 1ecda02b Markus Armbruster
        error_report("Error %d while loading VM state", ret);
2281 05f2401e Juan Quintela
        return ret;
2282 a672b469 aliguori
    }
2283 f0aa7a8b Miguel Di Ciurcio Filho
2284 05f2401e Juan Quintela
    return 0;
2285 7b630349 Juan Quintela
}
2286 7b630349 Juan Quintela
2287 d54908a5 Luiz Capitulino
void do_delvm(Monitor *mon, const QDict *qdict)
2288 a672b469 aliguori
{
2289 a672b469 aliguori
    BlockDriverState *bs, *bs1;
2290 751c6a17 Gerd Hoffmann
    int ret;
2291 d54908a5 Luiz Capitulino
    const char *name = qdict_get_str(qdict, "name");
2292 a672b469 aliguori
2293 f9092b10 Markus Armbruster
    bs = bdrv_snapshots();
2294 a672b469 aliguori
    if (!bs) {
2295 376253ec aliguori
        monitor_printf(mon, "No block device supports snapshots\n");
2296 a672b469 aliguori
        return;
2297 a672b469 aliguori
    }
2298 a672b469 aliguori
2299 dbc13590 Markus Armbruster
    bs1 = NULL;
2300 dbc13590 Markus Armbruster
    while ((bs1 = bdrv_next(bs1))) {
2301 feeee5ac Miguel Di Ciurcio Filho
        if (bdrv_can_snapshot(bs1)) {
2302 a672b469 aliguori
            ret = bdrv_snapshot_delete(bs1, name);
2303 a672b469 aliguori
            if (ret < 0) {
2304 a672b469 aliguori
                if (ret == -ENOTSUP)
2305 376253ec aliguori
                    monitor_printf(mon,
2306 376253ec aliguori
                                   "Snapshots not supported on device '%s'\n",
2307 376253ec aliguori
                                   bdrv_get_device_name(bs1));
2308 a672b469 aliguori
                else
2309 376253ec aliguori
                    monitor_printf(mon, "Error %d while deleting snapshot on "
2310 376253ec aliguori
                                   "'%s'\n", ret, bdrv_get_device_name(bs1));
2311 a672b469 aliguori
            }
2312 a672b469 aliguori
        }
2313 a672b469 aliguori
    }
2314 a672b469 aliguori
}
2315 a672b469 aliguori
2316 376253ec aliguori
void do_info_snapshots(Monitor *mon)
2317 a672b469 aliguori
{
2318 a672b469 aliguori
    BlockDriverState *bs, *bs1;
2319 f9209915 Miguel Di Ciurcio Filho
    QEMUSnapshotInfo *sn_tab, *sn, s, *sn_info = &s;
2320 f9209915 Miguel Di Ciurcio Filho
    int nb_sns, i, ret, available;
2321 f9209915 Miguel Di Ciurcio Filho
    int total;
2322 f9209915 Miguel Di Ciurcio Filho
    int *available_snapshots;
2323 a672b469 aliguori
    char buf[256];
2324 a672b469 aliguori
2325 f9092b10 Markus Armbruster
    bs = bdrv_snapshots();
2326 a672b469 aliguori
    if (!bs) {
2327 376253ec aliguori
        monitor_printf(mon, "No available block device supports snapshots\n");
2328 a672b469 aliguori
        return;
2329 a672b469 aliguori
    }
2330 a672b469 aliguori
2331 a672b469 aliguori
    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
2332 a672b469 aliguori
    if (nb_sns < 0) {
2333 376253ec aliguori
        monitor_printf(mon, "bdrv_snapshot_list: error %d\n", nb_sns);
2334 a672b469 aliguori
        return;
2335 a672b469 aliguori
    }
2336 f9209915 Miguel Di Ciurcio Filho
2337 f9209915 Miguel Di Ciurcio Filho
    if (nb_sns == 0) {
2338 f9209915 Miguel Di Ciurcio Filho
        monitor_printf(mon, "There is no snapshot available.\n");
2339 f9209915 Miguel Di Ciurcio Filho
        return;
2340 f9209915 Miguel Di Ciurcio Filho
    }
2341 f9209915 Miguel Di Ciurcio Filho
2342 7267c094 Anthony Liguori
    available_snapshots = g_malloc0(sizeof(int) * nb_sns);
2343 f9209915 Miguel Di Ciurcio Filho
    total = 0;
2344 f9209915 Miguel Di Ciurcio Filho
    for (i = 0; i < nb_sns; i++) {
2345 a672b469 aliguori
        sn = &sn_tab[i];
2346 f9209915 Miguel Di Ciurcio Filho
        available = 1;
2347 f9209915 Miguel Di Ciurcio Filho
        bs1 = NULL;
2348 f9209915 Miguel Di Ciurcio Filho
2349 f9209915 Miguel Di Ciurcio Filho
        while ((bs1 = bdrv_next(bs1))) {
2350 f9209915 Miguel Di Ciurcio Filho
            if (bdrv_can_snapshot(bs1) && bs1 != bs) {
2351 f9209915 Miguel Di Ciurcio Filho
                ret = bdrv_snapshot_find(bs1, sn_info, sn->id_str);
2352 f9209915 Miguel Di Ciurcio Filho
                if (ret < 0) {
2353 f9209915 Miguel Di Ciurcio Filho
                    available = 0;
2354 f9209915 Miguel Di Ciurcio Filho
                    break;
2355 f9209915 Miguel Di Ciurcio Filho
                }
2356 f9209915 Miguel Di Ciurcio Filho
            }
2357 f9209915 Miguel Di Ciurcio Filho
        }
2358 f9209915 Miguel Di Ciurcio Filho
2359 f9209915 Miguel Di Ciurcio Filho
        if (available) {
2360 f9209915 Miguel Di Ciurcio Filho
            available_snapshots[total] = i;
2361 f9209915 Miguel Di Ciurcio Filho
            total++;
2362 f9209915 Miguel Di Ciurcio Filho
        }
2363 a672b469 aliguori
    }
2364 f9209915 Miguel Di Ciurcio Filho
2365 f9209915 Miguel Di Ciurcio Filho
    if (total > 0) {
2366 f9209915 Miguel Di Ciurcio Filho
        monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
2367 f9209915 Miguel Di Ciurcio Filho
        for (i = 0; i < total; i++) {
2368 f9209915 Miguel Di Ciurcio Filho
            sn = &sn_tab[available_snapshots[i]];
2369 f9209915 Miguel Di Ciurcio Filho
            monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
2370 f9209915 Miguel Di Ciurcio Filho
        }
2371 f9209915 Miguel Di Ciurcio Filho
    } else {
2372 f9209915 Miguel Di Ciurcio Filho
        monitor_printf(mon, "There is no suitable snapshot available\n");
2373 f9209915 Miguel Di Ciurcio Filho
    }
2374 f9209915 Miguel Di Ciurcio Filho
2375 7267c094 Anthony Liguori
    g_free(sn_tab);
2376 7267c094 Anthony Liguori
    g_free(available_snapshots);
2377 f9209915 Miguel Di Ciurcio Filho
2378 a672b469 aliguori
}
2379 c5705a77 Avi Kivity
2380 c5705a77 Avi Kivity
void vmstate_register_ram(MemoryRegion *mr, DeviceState *dev)
2381 c5705a77 Avi Kivity
{
2382 1ddde087 Avi Kivity
    qemu_ram_set_idstr(memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK,
2383 c5705a77 Avi Kivity
                       memory_region_name(mr), dev);
2384 c5705a77 Avi Kivity
}
2385 c5705a77 Avi Kivity
2386 c5705a77 Avi Kivity
void vmstate_unregister_ram(MemoryRegion *mr, DeviceState *dev)
2387 c5705a77 Avi Kivity
{
2388 c5705a77 Avi Kivity
    /* Nothing do to while the implementation is in RAMBlock */
2389 c5705a77 Avi Kivity
}
2390 c5705a77 Avi Kivity
2391 c5705a77 Avi Kivity
void vmstate_register_ram_global(MemoryRegion *mr)
2392 c5705a77 Avi Kivity
{
2393 c5705a77 Avi Kivity
    vmstate_register_ram(mr, NULL);
2394 c5705a77 Avi Kivity
}
2395 302dfbeb Orit Wasserman
2396 302dfbeb Orit Wasserman
/*
2397 302dfbeb Orit Wasserman
  page = zrun nzrun
2398 302dfbeb Orit Wasserman
       | zrun nzrun page
2399 302dfbeb Orit Wasserman

2400 302dfbeb Orit Wasserman
  zrun = length
2401 302dfbeb Orit Wasserman

2402 302dfbeb Orit Wasserman
  nzrun = length byte...
2403 302dfbeb Orit Wasserman

2404 302dfbeb Orit Wasserman
  length = uleb128 encoded integer
2405 302dfbeb Orit Wasserman
 */
2406 302dfbeb Orit Wasserman
int xbzrle_encode_buffer(uint8_t *old_buf, uint8_t *new_buf, int slen,
2407 302dfbeb Orit Wasserman
                         uint8_t *dst, int dlen)
2408 302dfbeb Orit Wasserman
{
2409 302dfbeb Orit Wasserman
    uint32_t zrun_len = 0, nzrun_len = 0;
2410 302dfbeb Orit Wasserman
    int d = 0, i = 0;
2411 302dfbeb Orit Wasserman
    long res, xor;
2412 302dfbeb Orit Wasserman
    uint8_t *nzrun_start = NULL;
2413 302dfbeb Orit Wasserman
2414 302dfbeb Orit Wasserman
    g_assert(!(((uintptr_t)old_buf | (uintptr_t)new_buf | slen) %
2415 302dfbeb Orit Wasserman
               sizeof(long)));
2416 302dfbeb Orit Wasserman
2417 302dfbeb Orit Wasserman
    while (i < slen) {
2418 302dfbeb Orit Wasserman
        /* overflow */
2419 302dfbeb Orit Wasserman
        if (d + 2 > dlen) {
2420 302dfbeb Orit Wasserman
            return -1;
2421 302dfbeb Orit Wasserman
        }
2422 302dfbeb Orit Wasserman
2423 302dfbeb Orit Wasserman
        /* not aligned to sizeof(long) */
2424 302dfbeb Orit Wasserman
        res = (slen - i) % sizeof(long);
2425 302dfbeb Orit Wasserman
        while (res && old_buf[i] == new_buf[i]) {
2426 302dfbeb Orit Wasserman
            zrun_len++;
2427 302dfbeb Orit Wasserman
            i++;
2428 302dfbeb Orit Wasserman
            res--;
2429 302dfbeb Orit Wasserman
        }
2430 302dfbeb Orit Wasserman
2431 302dfbeb Orit Wasserman
        /* word at a time for speed */
2432 302dfbeb Orit Wasserman
        if (!res) {
2433 302dfbeb Orit Wasserman
            while (i < slen &&
2434 302dfbeb Orit Wasserman
                   (*(long *)(old_buf + i)) == (*(long *)(new_buf + i))) {
2435 302dfbeb Orit Wasserman
                i += sizeof(long);
2436 302dfbeb Orit Wasserman
                zrun_len += sizeof(long);
2437 302dfbeb Orit Wasserman
            }
2438 302dfbeb Orit Wasserman
2439 302dfbeb Orit Wasserman
            /* go over the rest */
2440 302dfbeb Orit Wasserman
            while (i < slen && old_buf[i] == new_buf[i]) {
2441 302dfbeb Orit Wasserman
                zrun_len++;
2442 302dfbeb Orit Wasserman
                i++;
2443 302dfbeb Orit Wasserman
            }
2444 302dfbeb Orit Wasserman
        }
2445 302dfbeb Orit Wasserman
2446 302dfbeb Orit Wasserman
        /* buffer unchanged */
2447 302dfbeb Orit Wasserman
        if (zrun_len == slen) {
2448 302dfbeb Orit Wasserman
            return 0;
2449 302dfbeb Orit Wasserman
        }
2450 302dfbeb Orit Wasserman
2451 302dfbeb Orit Wasserman
        /* skip last zero run */
2452 302dfbeb Orit Wasserman
        if (i == slen) {
2453 302dfbeb Orit Wasserman
            return d;
2454 302dfbeb Orit Wasserman
        }
2455 302dfbeb Orit Wasserman
2456 302dfbeb Orit Wasserman
        d += uleb128_encode_small(dst + d, zrun_len);
2457 302dfbeb Orit Wasserman
2458 302dfbeb Orit Wasserman
        zrun_len = 0;
2459 302dfbeb Orit Wasserman
        nzrun_start = new_buf + i;
2460 302dfbeb Orit Wasserman
2461 302dfbeb Orit Wasserman
        /* overflow */
2462 302dfbeb Orit Wasserman
        if (d + 2 > dlen) {
2463 302dfbeb Orit Wasserman
            return -1;
2464 302dfbeb Orit Wasserman
        }
2465 302dfbeb Orit Wasserman
        /* not aligned to sizeof(long) */
2466 302dfbeb Orit Wasserman
        res = (slen - i) % sizeof(long);
2467 302dfbeb Orit Wasserman
        while (res && old_buf[i] != new_buf[i]) {
2468 302dfbeb Orit Wasserman
            i++;
2469 302dfbeb Orit Wasserman
            nzrun_len++;
2470 302dfbeb Orit Wasserman
            res--;
2471 302dfbeb Orit Wasserman
        }
2472 302dfbeb Orit Wasserman
2473 302dfbeb Orit Wasserman
        /* word at a time for speed, use of 32-bit long okay */
2474 302dfbeb Orit Wasserman
        if (!res) {
2475 302dfbeb Orit Wasserman
            /* truncation to 32-bit long okay */
2476 a5b71725 Alexander Graf
            long mask = (long)0x0101010101010101ULL;
2477 302dfbeb Orit Wasserman
            while (i < slen) {
2478 302dfbeb Orit Wasserman
                xor = *(long *)(old_buf + i) ^ *(long *)(new_buf + i);
2479 302dfbeb Orit Wasserman
                if ((xor - mask) & ~xor & (mask << 7)) {
2480 302dfbeb Orit Wasserman
                    /* found the end of an nzrun within the current long */
2481 302dfbeb Orit Wasserman
                    while (old_buf[i] != new_buf[i]) {
2482 302dfbeb Orit Wasserman
                        nzrun_len++;
2483 302dfbeb Orit Wasserman
                        i++;
2484 302dfbeb Orit Wasserman
                    }
2485 302dfbeb Orit Wasserman
                    break;
2486 302dfbeb Orit Wasserman
                } else {
2487 302dfbeb Orit Wasserman
                    i += sizeof(long);
2488 302dfbeb Orit Wasserman
                    nzrun_len += sizeof(long);
2489 302dfbeb Orit Wasserman
                }
2490 302dfbeb Orit Wasserman
            }
2491 302dfbeb Orit Wasserman
        }
2492 302dfbeb Orit Wasserman
2493 302dfbeb Orit Wasserman
        d += uleb128_encode_small(dst + d, nzrun_len);
2494 302dfbeb Orit Wasserman
        /* overflow */
2495 302dfbeb Orit Wasserman
        if (d + nzrun_len > dlen) {
2496 302dfbeb Orit Wasserman
            return -1;
2497 302dfbeb Orit Wasserman
        }
2498 302dfbeb Orit Wasserman
        memcpy(dst + d, nzrun_start, nzrun_len);
2499 302dfbeb Orit Wasserman
        d += nzrun_len;
2500 302dfbeb Orit Wasserman
        nzrun_len = 0;
2501 302dfbeb Orit Wasserman
    }
2502 302dfbeb Orit Wasserman
2503 302dfbeb Orit Wasserman
    return d;
2504 302dfbeb Orit Wasserman
}
2505 302dfbeb Orit Wasserman
2506 302dfbeb Orit Wasserman
int xbzrle_decode_buffer(uint8_t *src, int slen, uint8_t *dst, int dlen)
2507 302dfbeb Orit Wasserman
{
2508 302dfbeb Orit Wasserman
    int i = 0, d = 0;
2509 302dfbeb Orit Wasserman
    int ret;
2510 302dfbeb Orit Wasserman
    uint32_t count = 0;
2511 302dfbeb Orit Wasserman
2512 302dfbeb Orit Wasserman
    while (i < slen) {
2513 302dfbeb Orit Wasserman
2514 302dfbeb Orit Wasserman
        /* zrun */
2515 302dfbeb Orit Wasserman
        if ((slen - i) < 2) {
2516 302dfbeb Orit Wasserman
            return -1;
2517 302dfbeb Orit Wasserman
        }
2518 302dfbeb Orit Wasserman
2519 302dfbeb Orit Wasserman
        ret = uleb128_decode_small(src + i, &count);
2520 302dfbeb Orit Wasserman
        if (ret < 0 || (i && !count)) {
2521 302dfbeb Orit Wasserman
            return -1;
2522 302dfbeb Orit Wasserman
        }
2523 302dfbeb Orit Wasserman
        i += ret;
2524 302dfbeb Orit Wasserman
        d += count;
2525 302dfbeb Orit Wasserman
2526 302dfbeb Orit Wasserman
        /* overflow */
2527 302dfbeb Orit Wasserman
        if (d > dlen) {
2528 302dfbeb Orit Wasserman
            return -1;
2529 302dfbeb Orit Wasserman
        }
2530 302dfbeb Orit Wasserman
2531 302dfbeb Orit Wasserman
        /* nzrun */
2532 302dfbeb Orit Wasserman
        if ((slen - i) < 2) {
2533 302dfbeb Orit Wasserman
            return -1;
2534 302dfbeb Orit Wasserman
        }
2535 302dfbeb Orit Wasserman
2536 302dfbeb Orit Wasserman
        ret = uleb128_decode_small(src + i, &count);
2537 302dfbeb Orit Wasserman
        if (ret < 0 || !count) {
2538 302dfbeb Orit Wasserman
            return -1;
2539 302dfbeb Orit Wasserman
        }
2540 302dfbeb Orit Wasserman
        i += ret;
2541 302dfbeb Orit Wasserman
2542 302dfbeb Orit Wasserman
        /* overflow */
2543 302dfbeb Orit Wasserman
        if (d + count > dlen || i + count > slen) {
2544 302dfbeb Orit Wasserman
            return -1;
2545 302dfbeb Orit Wasserman
        }
2546 302dfbeb Orit Wasserman
2547 302dfbeb Orit Wasserman
        memcpy(dst + d, src + i, count);
2548 302dfbeb Orit Wasserman
        d += count;
2549 302dfbeb Orit Wasserman
        i += count;
2550 302dfbeb Orit Wasserman
    }
2551 302dfbeb Orit Wasserman
2552 302dfbeb Orit Wasserman
    return d;
2553 302dfbeb Orit Wasserman
}