Statistics
| Branch: | Revision:

root / arch_init.c @ 5f8ae8e2

History | View | Annotate | Download (29.2 kB)

1 ad96090a Blue Swirl
/*
2 ad96090a Blue Swirl
 * QEMU System Emulator
3 ad96090a Blue Swirl
 *
4 ad96090a Blue Swirl
 * Copyright (c) 2003-2008 Fabrice Bellard
5 ad96090a Blue Swirl
 *
6 ad96090a Blue Swirl
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 ad96090a Blue Swirl
 * of this software and associated documentation files (the "Software"), to deal
8 ad96090a Blue Swirl
 * in the Software without restriction, including without limitation the rights
9 ad96090a Blue Swirl
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 ad96090a Blue Swirl
 * copies of the Software, and to permit persons to whom the Software is
11 ad96090a Blue Swirl
 * furnished to do so, subject to the following conditions:
12 ad96090a Blue Swirl
 *
13 ad96090a Blue Swirl
 * The above copyright notice and this permission notice shall be included in
14 ad96090a Blue Swirl
 * all copies or substantial portions of the Software.
15 ad96090a Blue Swirl
 *
16 ad96090a Blue Swirl
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 ad96090a Blue Swirl
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 ad96090a Blue Swirl
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 ad96090a Blue Swirl
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 ad96090a Blue Swirl
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 ad96090a Blue Swirl
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 ad96090a Blue Swirl
 * THE SOFTWARE.
23 ad96090a Blue Swirl
 */
24 ad96090a Blue Swirl
#include <stdint.h>
25 ad96090a Blue Swirl
#include <stdarg.h>
26 b2e0a138 Michael S. Tsirkin
#include <stdlib.h>
27 ad96090a Blue Swirl
#ifndef _WIN32
28 1c47cb16 Blue Swirl
#include <sys/types.h>
29 ad96090a Blue Swirl
#include <sys/mman.h>
30 ad96090a Blue Swirl
#endif
31 ad96090a Blue Swirl
#include "config.h"
32 ad96090a Blue Swirl
#include "monitor.h"
33 ad96090a Blue Swirl
#include "sysemu.h"
34 c6bf8e0e Juan Quintela
#include "bitops.h"
35 c6bf8e0e Juan Quintela
#include "bitmap.h"
36 ad96090a Blue Swirl
#include "arch_init.h"
37 ad96090a Blue Swirl
#include "audio/audio.h"
38 ad96090a Blue Swirl
#include "hw/pc.h"
39 ad96090a Blue Swirl
#include "hw/pci.h"
40 ad96090a Blue Swirl
#include "hw/audiodev.h"
41 ad96090a Blue Swirl
#include "kvm.h"
42 ad96090a Blue Swirl
#include "migration.h"
43 ad96090a Blue Swirl
#include "net.h"
44 ad96090a Blue Swirl
#include "gdbstub.h"
45 ad96090a Blue Swirl
#include "hw/smbios.h"
46 86e775c6 Avi Kivity
#include "exec-memory.h"
47 302fe51b Jan Kiszka
#include "hw/pcspk.h"
48 17ad9b35 Orit Wasserman
#include "qemu/page_cache.h"
49 99afc91d Daniel P. Berrange
#include "qmp-commands.h"
50 3c12193d Juan Quintela
#include "trace.h"
51 ad96090a Blue Swirl
52 3a697f69 Orit Wasserman
#ifdef DEBUG_ARCH_INIT
53 3a697f69 Orit Wasserman
#define DPRINTF(fmt, ...) \
54 3a697f69 Orit Wasserman
    do { fprintf(stdout, "arch_init: " fmt, ## __VA_ARGS__); } while (0)
55 3a697f69 Orit Wasserman
#else
56 3a697f69 Orit Wasserman
#define DPRINTF(fmt, ...) \
57 3a697f69 Orit Wasserman
    do { } while (0)
58 3a697f69 Orit Wasserman
#endif
59 3a697f69 Orit Wasserman
60 ad96090a Blue Swirl
#ifdef TARGET_SPARC
61 ad96090a Blue Swirl
int graphic_width = 1024;
62 ad96090a Blue Swirl
int graphic_height = 768;
63 ad96090a Blue Swirl
int graphic_depth = 8;
64 ad96090a Blue Swirl
#else
65 ad96090a Blue Swirl
int graphic_width = 800;
66 ad96090a Blue Swirl
int graphic_height = 600;
67 ad96090a Blue Swirl
int graphic_depth = 15;
68 ad96090a Blue Swirl
#endif
69 ad96090a Blue Swirl
70 ad96090a Blue Swirl
71 ad96090a Blue Swirl
#if defined(TARGET_ALPHA)
72 ad96090a Blue Swirl
#define QEMU_ARCH QEMU_ARCH_ALPHA
73 ad96090a Blue Swirl
#elif defined(TARGET_ARM)
74 ad96090a Blue Swirl
#define QEMU_ARCH QEMU_ARCH_ARM
75 ad96090a Blue Swirl
#elif defined(TARGET_CRIS)
76 ad96090a Blue Swirl
#define QEMU_ARCH QEMU_ARCH_CRIS
77 ad96090a Blue Swirl
#elif defined(TARGET_I386)
78 ad96090a Blue Swirl
#define QEMU_ARCH QEMU_ARCH_I386
79 ad96090a Blue Swirl
#elif defined(TARGET_M68K)
80 ad96090a Blue Swirl
#define QEMU_ARCH QEMU_ARCH_M68K
81 81ea0e13 Michael Walle
#elif defined(TARGET_LM32)
82 81ea0e13 Michael Walle
#define QEMU_ARCH QEMU_ARCH_LM32
83 ad96090a Blue Swirl
#elif defined(TARGET_MICROBLAZE)
84 ad96090a Blue Swirl
#define QEMU_ARCH QEMU_ARCH_MICROBLAZE
85 ad96090a Blue Swirl
#elif defined(TARGET_MIPS)
86 ad96090a Blue Swirl
#define QEMU_ARCH QEMU_ARCH_MIPS
87 e67db06e Jia Liu
#elif defined(TARGET_OPENRISC)
88 e67db06e Jia Liu
#define QEMU_ARCH QEMU_ARCH_OPENRISC
89 ad96090a Blue Swirl
#elif defined(TARGET_PPC)
90 ad96090a Blue Swirl
#define QEMU_ARCH QEMU_ARCH_PPC
91 ad96090a Blue Swirl
#elif defined(TARGET_S390X)
92 ad96090a Blue Swirl
#define QEMU_ARCH QEMU_ARCH_S390X
93 ad96090a Blue Swirl
#elif defined(TARGET_SH4)
94 ad96090a Blue Swirl
#define QEMU_ARCH QEMU_ARCH_SH4
95 ad96090a Blue Swirl
#elif defined(TARGET_SPARC)
96 ad96090a Blue Swirl
#define QEMU_ARCH QEMU_ARCH_SPARC
97 2328826b Max Filippov
#elif defined(TARGET_XTENSA)
98 2328826b Max Filippov
#define QEMU_ARCH QEMU_ARCH_XTENSA
99 4f23a1e6 Guan Xuetao
#elif defined(TARGET_UNICORE32)
100 4f23a1e6 Guan Xuetao
#define QEMU_ARCH QEMU_ARCH_UNICORE32
101 ad96090a Blue Swirl
#endif
102 ad96090a Blue Swirl
103 ad96090a Blue Swirl
const uint32_t arch_type = QEMU_ARCH;
104 ad96090a Blue Swirl
105 ad96090a Blue Swirl
/***********************************************************/
106 ad96090a Blue Swirl
/* ram save/restore */
107 ad96090a Blue Swirl
108 d20878d2 Yoshiaki Tamura
#define RAM_SAVE_FLAG_FULL     0x01 /* Obsolete, not used anymore */
109 d20878d2 Yoshiaki Tamura
#define RAM_SAVE_FLAG_COMPRESS 0x02
110 d20878d2 Yoshiaki Tamura
#define RAM_SAVE_FLAG_MEM_SIZE 0x04
111 d20878d2 Yoshiaki Tamura
#define RAM_SAVE_FLAG_PAGE     0x08
112 d20878d2 Yoshiaki Tamura
#define RAM_SAVE_FLAG_EOS      0x10
113 d20878d2 Yoshiaki Tamura
#define RAM_SAVE_FLAG_CONTINUE 0x20
114 17ad9b35 Orit Wasserman
#define RAM_SAVE_FLAG_XBZRLE   0x40
115 ad96090a Blue Swirl
116 86003615 Paolo Bonzini
#ifdef __ALTIVEC__
117 86003615 Paolo Bonzini
#include <altivec.h>
118 86003615 Paolo Bonzini
#define VECTYPE        vector unsigned char
119 86003615 Paolo Bonzini
#define SPLAT(p)       vec_splat(vec_ld(0, p), 0)
120 86003615 Paolo Bonzini
#define ALL_EQ(v1, v2) vec_all_eq(v1, v2)
121 f283edc4 Andreas Färber
/* altivec.h may redefine the bool macro as vector type.
122 f283edc4 Andreas Färber
 * Reset it to POSIX semantics. */
123 f283edc4 Andreas Färber
#undef bool
124 f283edc4 Andreas Färber
#define bool _Bool
125 86003615 Paolo Bonzini
#elif defined __SSE2__
126 86003615 Paolo Bonzini
#include <emmintrin.h>
127 86003615 Paolo Bonzini
#define VECTYPE        __m128i
128 86003615 Paolo Bonzini
#define SPLAT(p)       _mm_set1_epi8(*(p))
129 86003615 Paolo Bonzini
#define ALL_EQ(v1, v2) (_mm_movemask_epi8(_mm_cmpeq_epi8(v1, v2)) == 0xFFFF)
130 86003615 Paolo Bonzini
#else
131 86003615 Paolo Bonzini
#define VECTYPE        unsigned long
132 86003615 Paolo Bonzini
#define SPLAT(p)       (*(p) * (~0UL / 255))
133 86003615 Paolo Bonzini
#define ALL_EQ(v1, v2) ((v1) == (v2))
134 86003615 Paolo Bonzini
#endif
135 86003615 Paolo Bonzini
136 b5a8fe5e Eduardo Habkost
137 756557de Eduardo Habkost
static struct defconfig_file {
138 756557de Eduardo Habkost
    const char *filename;
139 f29a5614 Eduardo Habkost
    /* Indicates it is an user config file (disabled by -no-user-config) */
140 f29a5614 Eduardo Habkost
    bool userconfig;
141 756557de Eduardo Habkost
} default_config_files[] = {
142 f29a5614 Eduardo Habkost
    { CONFIG_QEMU_CONFDIR "/qemu.conf",                   true },
143 f29a5614 Eduardo Habkost
    { CONFIG_QEMU_CONFDIR "/target-" TARGET_ARCH ".conf", true },
144 756557de Eduardo Habkost
    { NULL }, /* end of list */
145 756557de Eduardo Habkost
};
146 756557de Eduardo Habkost
147 756557de Eduardo Habkost
148 f29a5614 Eduardo Habkost
int qemu_read_default_config_files(bool userconfig)
149 b5a8fe5e Eduardo Habkost
{
150 b5a8fe5e Eduardo Habkost
    int ret;
151 756557de Eduardo Habkost
    struct defconfig_file *f;
152 b5a8fe5e Eduardo Habkost
153 756557de Eduardo Habkost
    for (f = default_config_files; f->filename; f++) {
154 f29a5614 Eduardo Habkost
        if (!userconfig && f->userconfig) {
155 f29a5614 Eduardo Habkost
            continue;
156 f29a5614 Eduardo Habkost
        }
157 756557de Eduardo Habkost
        ret = qemu_read_config_file(f->filename);
158 756557de Eduardo Habkost
        if (ret < 0 && ret != -ENOENT) {
159 756557de Eduardo Habkost
            return ret;
160 756557de Eduardo Habkost
        }
161 b5a8fe5e Eduardo Habkost
    }
162 756557de Eduardo Habkost
    
163 b5a8fe5e Eduardo Habkost
    return 0;
164 b5a8fe5e Eduardo Habkost
}
165 b5a8fe5e Eduardo Habkost
166 86003615 Paolo Bonzini
static int is_dup_page(uint8_t *page)
167 ad96090a Blue Swirl
{
168 86003615 Paolo Bonzini
    VECTYPE *p = (VECTYPE *)page;
169 86003615 Paolo Bonzini
    VECTYPE val = SPLAT(page);
170 ad96090a Blue Swirl
    int i;
171 ad96090a Blue Swirl
172 86003615 Paolo Bonzini
    for (i = 0; i < TARGET_PAGE_SIZE / sizeof(VECTYPE); i++) {
173 86003615 Paolo Bonzini
        if (!ALL_EQ(val, p[i])) {
174 ad96090a Blue Swirl
            return 0;
175 ad96090a Blue Swirl
        }
176 ad96090a Blue Swirl
    }
177 ad96090a Blue Swirl
178 ad96090a Blue Swirl
    return 1;
179 ad96090a Blue Swirl
}
180 ad96090a Blue Swirl
181 17ad9b35 Orit Wasserman
/* struct contains XBZRLE cache and a static page
182 17ad9b35 Orit Wasserman
   used by the compression */
183 17ad9b35 Orit Wasserman
static struct {
184 17ad9b35 Orit Wasserman
    /* buffer used for XBZRLE encoding */
185 17ad9b35 Orit Wasserman
    uint8_t *encoded_buf;
186 17ad9b35 Orit Wasserman
    /* buffer for storing page content */
187 17ad9b35 Orit Wasserman
    uint8_t *current_buf;
188 17ad9b35 Orit Wasserman
    /* buffer used for XBZRLE decoding */
189 17ad9b35 Orit Wasserman
    uint8_t *decoded_buf;
190 17ad9b35 Orit Wasserman
    /* Cache for XBZRLE */
191 17ad9b35 Orit Wasserman
    PageCache *cache;
192 17ad9b35 Orit Wasserman
} XBZRLE = {
193 17ad9b35 Orit Wasserman
    .encoded_buf = NULL,
194 17ad9b35 Orit Wasserman
    .current_buf = NULL,
195 17ad9b35 Orit Wasserman
    .decoded_buf = NULL,
196 17ad9b35 Orit Wasserman
    .cache = NULL,
197 17ad9b35 Orit Wasserman
};
198 17ad9b35 Orit Wasserman
199 9e1ba4cc Orit Wasserman
200 9e1ba4cc Orit Wasserman
int64_t xbzrle_cache_resize(int64_t new_size)
201 9e1ba4cc Orit Wasserman
{
202 9e1ba4cc Orit Wasserman
    if (XBZRLE.cache != NULL) {
203 9e1ba4cc Orit Wasserman
        return cache_resize(XBZRLE.cache, new_size / TARGET_PAGE_SIZE) *
204 9e1ba4cc Orit Wasserman
            TARGET_PAGE_SIZE;
205 9e1ba4cc Orit Wasserman
    }
206 9e1ba4cc Orit Wasserman
    return pow2floor(new_size);
207 9e1ba4cc Orit Wasserman
}
208 9e1ba4cc Orit Wasserman
209 004d4c10 Orit Wasserman
/* accounting for migration statistics */
210 004d4c10 Orit Wasserman
typedef struct AccountingInfo {
211 004d4c10 Orit Wasserman
    uint64_t dup_pages;
212 004d4c10 Orit Wasserman
    uint64_t norm_pages;
213 004d4c10 Orit Wasserman
    uint64_t iterations;
214 f36d55af Orit Wasserman
    uint64_t xbzrle_bytes;
215 f36d55af Orit Wasserman
    uint64_t xbzrle_pages;
216 f36d55af Orit Wasserman
    uint64_t xbzrle_cache_miss;
217 f36d55af Orit Wasserman
    uint64_t xbzrle_overflows;
218 004d4c10 Orit Wasserman
} AccountingInfo;
219 004d4c10 Orit Wasserman
220 004d4c10 Orit Wasserman
static AccountingInfo acct_info;
221 004d4c10 Orit Wasserman
222 004d4c10 Orit Wasserman
static void acct_clear(void)
223 004d4c10 Orit Wasserman
{
224 004d4c10 Orit Wasserman
    memset(&acct_info, 0, sizeof(acct_info));
225 004d4c10 Orit Wasserman
}
226 004d4c10 Orit Wasserman
227 004d4c10 Orit Wasserman
uint64_t dup_mig_bytes_transferred(void)
228 004d4c10 Orit Wasserman
{
229 004d4c10 Orit Wasserman
    return acct_info.dup_pages * TARGET_PAGE_SIZE;
230 004d4c10 Orit Wasserman
}
231 004d4c10 Orit Wasserman
232 004d4c10 Orit Wasserman
uint64_t dup_mig_pages_transferred(void)
233 004d4c10 Orit Wasserman
{
234 004d4c10 Orit Wasserman
    return acct_info.dup_pages;
235 004d4c10 Orit Wasserman
}
236 004d4c10 Orit Wasserman
237 004d4c10 Orit Wasserman
uint64_t norm_mig_bytes_transferred(void)
238 004d4c10 Orit Wasserman
{
239 004d4c10 Orit Wasserman
    return acct_info.norm_pages * TARGET_PAGE_SIZE;
240 004d4c10 Orit Wasserman
}
241 004d4c10 Orit Wasserman
242 004d4c10 Orit Wasserman
uint64_t norm_mig_pages_transferred(void)
243 004d4c10 Orit Wasserman
{
244 004d4c10 Orit Wasserman
    return acct_info.norm_pages;
245 004d4c10 Orit Wasserman
}
246 004d4c10 Orit Wasserman
247 f36d55af Orit Wasserman
uint64_t xbzrle_mig_bytes_transferred(void)
248 f36d55af Orit Wasserman
{
249 f36d55af Orit Wasserman
    return acct_info.xbzrle_bytes;
250 f36d55af Orit Wasserman
}
251 f36d55af Orit Wasserman
252 f36d55af Orit Wasserman
uint64_t xbzrle_mig_pages_transferred(void)
253 f36d55af Orit Wasserman
{
254 f36d55af Orit Wasserman
    return acct_info.xbzrle_pages;
255 f36d55af Orit Wasserman
}
256 f36d55af Orit Wasserman
257 f36d55af Orit Wasserman
uint64_t xbzrle_mig_pages_cache_miss(void)
258 f36d55af Orit Wasserman
{
259 f36d55af Orit Wasserman
    return acct_info.xbzrle_cache_miss;
260 f36d55af Orit Wasserman
}
261 f36d55af Orit Wasserman
262 f36d55af Orit Wasserman
uint64_t xbzrle_mig_pages_overflow(void)
263 f36d55af Orit Wasserman
{
264 f36d55af Orit Wasserman
    return acct_info.xbzrle_overflows;
265 f36d55af Orit Wasserman
}
266 f36d55af Orit Wasserman
267 0c51f43d Orit Wasserman
static void save_block_hdr(QEMUFile *f, RAMBlock *block, ram_addr_t offset,
268 0c51f43d Orit Wasserman
        int cont, int flag)
269 0c51f43d Orit Wasserman
{
270 0c51f43d Orit Wasserman
        qemu_put_be64(f, offset | cont | flag);
271 0c51f43d Orit Wasserman
        if (!cont) {
272 0c51f43d Orit Wasserman
                qemu_put_byte(f, strlen(block->idstr));
273 0c51f43d Orit Wasserman
                qemu_put_buffer(f, (uint8_t *)block->idstr,
274 0c51f43d Orit Wasserman
                                strlen(block->idstr));
275 0c51f43d Orit Wasserman
        }
276 0c51f43d Orit Wasserman
277 0c51f43d Orit Wasserman
}
278 0c51f43d Orit Wasserman
279 17ad9b35 Orit Wasserman
#define ENCODING_FLAG_XBZRLE 0x1
280 17ad9b35 Orit Wasserman
281 17ad9b35 Orit Wasserman
static int save_xbzrle_page(QEMUFile *f, uint8_t *current_data,
282 17ad9b35 Orit Wasserman
                            ram_addr_t current_addr, RAMBlock *block,
283 dd051c72 Juan Quintela
                            ram_addr_t offset, int cont, bool last_stage)
284 17ad9b35 Orit Wasserman
{
285 17ad9b35 Orit Wasserman
    int encoded_len = 0, bytes_sent = -1;
286 17ad9b35 Orit Wasserman
    uint8_t *prev_cached_page;
287 17ad9b35 Orit Wasserman
288 17ad9b35 Orit Wasserman
    if (!cache_is_cached(XBZRLE.cache, current_addr)) {
289 dd051c72 Juan Quintela
        if (!last_stage) {
290 dd051c72 Juan Quintela
            cache_insert(XBZRLE.cache, current_addr,
291 dd051c72 Juan Quintela
                         g_memdup(current_data, TARGET_PAGE_SIZE));
292 dd051c72 Juan Quintela
        }
293 f36d55af Orit Wasserman
        acct_info.xbzrle_cache_miss++;
294 17ad9b35 Orit Wasserman
        return -1;
295 17ad9b35 Orit Wasserman
    }
296 17ad9b35 Orit Wasserman
297 17ad9b35 Orit Wasserman
    prev_cached_page = get_cached_data(XBZRLE.cache, current_addr);
298 17ad9b35 Orit Wasserman
299 17ad9b35 Orit Wasserman
    /* save current buffer into memory */
300 17ad9b35 Orit Wasserman
    memcpy(XBZRLE.current_buf, current_data, TARGET_PAGE_SIZE);
301 17ad9b35 Orit Wasserman
302 17ad9b35 Orit Wasserman
    /* XBZRLE encoding (if there is no overflow) */
303 17ad9b35 Orit Wasserman
    encoded_len = xbzrle_encode_buffer(prev_cached_page, XBZRLE.current_buf,
304 17ad9b35 Orit Wasserman
                                       TARGET_PAGE_SIZE, XBZRLE.encoded_buf,
305 17ad9b35 Orit Wasserman
                                       TARGET_PAGE_SIZE);
306 17ad9b35 Orit Wasserman
    if (encoded_len == 0) {
307 17ad9b35 Orit Wasserman
        DPRINTF("Skipping unmodified page\n");
308 17ad9b35 Orit Wasserman
        return 0;
309 17ad9b35 Orit Wasserman
    } else if (encoded_len == -1) {
310 17ad9b35 Orit Wasserman
        DPRINTF("Overflow\n");
311 f36d55af Orit Wasserman
        acct_info.xbzrle_overflows++;
312 17ad9b35 Orit Wasserman
        /* update data in the cache */
313 17ad9b35 Orit Wasserman
        memcpy(prev_cached_page, current_data, TARGET_PAGE_SIZE);
314 17ad9b35 Orit Wasserman
        return -1;
315 17ad9b35 Orit Wasserman
    }
316 17ad9b35 Orit Wasserman
317 17ad9b35 Orit Wasserman
    /* we need to update the data in the cache, in order to get the same data */
318 dd051c72 Juan Quintela
    if (!last_stage) {
319 dd051c72 Juan Quintela
        memcpy(prev_cached_page, XBZRLE.current_buf, TARGET_PAGE_SIZE);
320 dd051c72 Juan Quintela
    }
321 17ad9b35 Orit Wasserman
322 17ad9b35 Orit Wasserman
    /* Send XBZRLE based compressed page */
323 17ad9b35 Orit Wasserman
    save_block_hdr(f, block, offset, cont, RAM_SAVE_FLAG_XBZRLE);
324 17ad9b35 Orit Wasserman
    qemu_put_byte(f, ENCODING_FLAG_XBZRLE);
325 17ad9b35 Orit Wasserman
    qemu_put_be16(f, encoded_len);
326 17ad9b35 Orit Wasserman
    qemu_put_buffer(f, XBZRLE.encoded_buf, encoded_len);
327 17ad9b35 Orit Wasserman
    bytes_sent = encoded_len + 1 + 2;
328 f36d55af Orit Wasserman
    acct_info.xbzrle_pages++;
329 f36d55af Orit Wasserman
    acct_info.xbzrle_bytes += bytes_sent;
330 17ad9b35 Orit Wasserman
331 17ad9b35 Orit Wasserman
    return bytes_sent;
332 17ad9b35 Orit Wasserman
}
333 17ad9b35 Orit Wasserman
334 760e77ea Alex Williamson
static RAMBlock *last_block;
335 760e77ea Alex Williamson
static ram_addr_t last_offset;
336 c6bf8e0e Juan Quintela
static unsigned long *migration_bitmap;
337 c6bf8e0e Juan Quintela
static uint64_t migration_dirty_pages;
338 760e77ea Alex Williamson
339 69268cde Juan Quintela
static inline bool migration_bitmap_test_and_reset_dirty(MemoryRegion *mr,
340 69268cde Juan Quintela
                                                         ram_addr_t offset)
341 69268cde Juan Quintela
{
342 c6bf8e0e Juan Quintela
    bool ret;
343 c6bf8e0e Juan Quintela
    int nr = (mr->ram_addr + offset) >> TARGET_PAGE_BITS;
344 c6bf8e0e Juan Quintela
345 c6bf8e0e Juan Quintela
    ret = test_and_clear_bit(nr, migration_bitmap);
346 69268cde Juan Quintela
347 69268cde Juan Quintela
    if (ret) {
348 c6bf8e0e Juan Quintela
        migration_dirty_pages--;
349 69268cde Juan Quintela
    }
350 69268cde Juan Quintela
    return ret;
351 69268cde Juan Quintela
}
352 69268cde Juan Quintela
353 c6bf8e0e Juan Quintela
static inline bool migration_bitmap_set_dirty(MemoryRegion *mr,
354 c6bf8e0e Juan Quintela
                                              ram_addr_t offset)
355 e44d26c8 Juan Quintela
{
356 c6bf8e0e Juan Quintela
    bool ret;
357 c6bf8e0e Juan Quintela
    int nr = (mr->ram_addr + offset) >> TARGET_PAGE_BITS;
358 e44d26c8 Juan Quintela
359 c6bf8e0e Juan Quintela
    ret = test_and_set_bit(nr, migration_bitmap);
360 c6bf8e0e Juan Quintela
361 c6bf8e0e Juan Quintela
    if (!ret) {
362 c6bf8e0e Juan Quintela
        migration_dirty_pages++;
363 e44d26c8 Juan Quintela
    }
364 c6bf8e0e Juan Quintela
    return ret;
365 e44d26c8 Juan Quintela
}
366 e44d26c8 Juan Quintela
367 dd2df737 Juan Quintela
static void migration_bitmap_sync(void)
368 dd2df737 Juan Quintela
{
369 c6bf8e0e Juan Quintela
    RAMBlock *block;
370 c6bf8e0e Juan Quintela
    ram_addr_t addr;
371 c6bf8e0e Juan Quintela
    uint64_t num_dirty_pages_init = migration_dirty_pages;
372 8d017193 Juan Quintela
    MigrationState *s = migrate_get_current();
373 8d017193 Juan Quintela
    static int64_t start_time;
374 8d017193 Juan Quintela
    static int64_t num_dirty_pages_period;
375 8d017193 Juan Quintela
    int64_t end_time;
376 8d017193 Juan Quintela
377 8d017193 Juan Quintela
    if (!start_time) {
378 8d017193 Juan Quintela
        start_time = qemu_get_clock_ms(rt_clock);
379 8d017193 Juan Quintela
    }
380 3c12193d Juan Quintela
381 3c12193d Juan Quintela
    trace_migration_bitmap_sync_start();
382 dd2df737 Juan Quintela
    memory_global_sync_dirty_bitmap(get_system_memory());
383 c6bf8e0e Juan Quintela
384 c6bf8e0e Juan Quintela
    QLIST_FOREACH(block, &ram_list.blocks, next) {
385 c6bf8e0e Juan Quintela
        for (addr = 0; addr < block->length; addr += TARGET_PAGE_SIZE) {
386 c6bf8e0e Juan Quintela
            if (memory_region_get_dirty(block->mr, addr, TARGET_PAGE_SIZE,
387 c6bf8e0e Juan Quintela
                                        DIRTY_MEMORY_MIGRATION)) {
388 c6bf8e0e Juan Quintela
                migration_bitmap_set_dirty(block->mr, addr);
389 c6bf8e0e Juan Quintela
            }
390 c6bf8e0e Juan Quintela
        }
391 c6bf8e0e Juan Quintela
        memory_region_reset_dirty(block->mr, 0, block->length,
392 c6bf8e0e Juan Quintela
                                  DIRTY_MEMORY_MIGRATION);
393 c6bf8e0e Juan Quintela
    }
394 c6bf8e0e Juan Quintela
    trace_migration_bitmap_sync_end(migration_dirty_pages
395 3c12193d Juan Quintela
                                    - num_dirty_pages_init);
396 8d017193 Juan Quintela
    num_dirty_pages_period += migration_dirty_pages - num_dirty_pages_init;
397 8d017193 Juan Quintela
    end_time = qemu_get_clock_ms(rt_clock);
398 8d017193 Juan Quintela
399 8d017193 Juan Quintela
    /* more than 1 second = 1000 millisecons */
400 8d017193 Juan Quintela
    if (end_time > start_time + 1000) {
401 8d017193 Juan Quintela
        s->dirty_pages_rate = num_dirty_pages_period * 1000
402 8d017193 Juan Quintela
            / (end_time - start_time);
403 8d017193 Juan Quintela
        start_time = end_time;
404 8d017193 Juan Quintela
        num_dirty_pages_period = 0;
405 8d017193 Juan Quintela
    }
406 dd2df737 Juan Quintela
}
407 dd2df737 Juan Quintela
408 dd2df737 Juan Quintela
409 6c779f22 Orit Wasserman
/*
410 6c779f22 Orit Wasserman
 * ram_save_block: Writes a page of memory to the stream f
411 6c779f22 Orit Wasserman
 *
412 6c779f22 Orit Wasserman
 * Returns:  0: if the page hasn't changed
413 6c779f22 Orit Wasserman
 *          -1: if there are no more dirty pages
414 6c779f22 Orit Wasserman
 *           n: the amount of bytes written in other case
415 6c779f22 Orit Wasserman
 */
416 6c779f22 Orit Wasserman
417 dd051c72 Juan Quintela
static int ram_save_block(QEMUFile *f, bool last_stage)
418 ad96090a Blue Swirl
{
419 e44359c3 Alex Williamson
    RAMBlock *block = last_block;
420 e44359c3 Alex Williamson
    ram_addr_t offset = last_offset;
421 6c779f22 Orit Wasserman
    int bytes_sent = -1;
422 71c510e2 Avi Kivity
    MemoryRegion *mr;
423 17ad9b35 Orit Wasserman
    ram_addr_t current_addr;
424 ad96090a Blue Swirl
425 e44359c3 Alex Williamson
    if (!block)
426 e44359c3 Alex Williamson
        block = QLIST_FIRST(&ram_list.blocks);
427 e44359c3 Alex Williamson
428 e44359c3 Alex Williamson
    do {
429 71c510e2 Avi Kivity
        mr = block->mr;
430 69268cde Juan Quintela
        if (migration_bitmap_test_and_reset_dirty(mr, offset)) {
431 ad96090a Blue Swirl
            uint8_t *p;
432 a55bbe31 Alex Williamson
            int cont = (block == last_block) ? RAM_SAVE_FLAG_CONTINUE : 0;
433 ad96090a Blue Swirl
434 71c510e2 Avi Kivity
            p = memory_region_get_ram_ptr(mr) + offset;
435 ad96090a Blue Swirl
436 86003615 Paolo Bonzini
            if (is_dup_page(p)) {
437 004d4c10 Orit Wasserman
                acct_info.dup_pages++;
438 0c51f43d Orit Wasserman
                save_block_hdr(f, block, offset, cont, RAM_SAVE_FLAG_COMPRESS);
439 ad96090a Blue Swirl
                qemu_put_byte(f, *p);
440 3fc250b4 Pierre Riteau
                bytes_sent = 1;
441 17ad9b35 Orit Wasserman
            } else if (migrate_use_xbzrle()) {
442 17ad9b35 Orit Wasserman
                current_addr = block->offset + offset;
443 17ad9b35 Orit Wasserman
                bytes_sent = save_xbzrle_page(f, p, current_addr, block,
444 dd051c72 Juan Quintela
                                              offset, cont, last_stage);
445 dd051c72 Juan Quintela
                if (!last_stage) {
446 dd051c72 Juan Quintela
                    p = get_cached_data(XBZRLE.cache, current_addr);
447 dd051c72 Juan Quintela
                }
448 17ad9b35 Orit Wasserman
            }
449 17ad9b35 Orit Wasserman
450 17ad9b35 Orit Wasserman
            /* either we didn't send yet (we may have had XBZRLE overflow) */
451 17ad9b35 Orit Wasserman
            if (bytes_sent == -1) {
452 0c51f43d Orit Wasserman
                save_block_hdr(f, block, offset, cont, RAM_SAVE_FLAG_PAGE);
453 ad96090a Blue Swirl
                qemu_put_buffer(f, p, TARGET_PAGE_SIZE);
454 3fc250b4 Pierre Riteau
                bytes_sent = TARGET_PAGE_SIZE;
455 004d4c10 Orit Wasserman
                acct_info.norm_pages++;
456 ad96090a Blue Swirl
            }
457 ad96090a Blue Swirl
458 17ad9b35 Orit Wasserman
            /* if page is unmodified, continue to the next */
459 17ad9b35 Orit Wasserman
            if (bytes_sent != 0) {
460 17ad9b35 Orit Wasserman
                break;
461 17ad9b35 Orit Wasserman
            }
462 ad96090a Blue Swirl
        }
463 e44359c3 Alex Williamson
464 e44359c3 Alex Williamson
        offset += TARGET_PAGE_SIZE;
465 e44359c3 Alex Williamson
        if (offset >= block->length) {
466 e44359c3 Alex Williamson
            offset = 0;
467 e44359c3 Alex Williamson
            block = QLIST_NEXT(block, next);
468 e44359c3 Alex Williamson
            if (!block)
469 e44359c3 Alex Williamson
                block = QLIST_FIRST(&ram_list.blocks);
470 e44359c3 Alex Williamson
        }
471 71c510e2 Avi Kivity
    } while (block != last_block || offset != last_offset);
472 e44359c3 Alex Williamson
473 e44359c3 Alex Williamson
    last_block = block;
474 e44359c3 Alex Williamson
    last_offset = offset;
475 ad96090a Blue Swirl
476 3fc250b4 Pierre Riteau
    return bytes_sent;
477 ad96090a Blue Swirl
}
478 ad96090a Blue Swirl
479 ad96090a Blue Swirl
static uint64_t bytes_transferred;
480 ad96090a Blue Swirl
481 ad96090a Blue Swirl
static ram_addr_t ram_save_remaining(void)
482 ad96090a Blue Swirl
{
483 c6bf8e0e Juan Quintela
    return migration_dirty_pages;
484 ad96090a Blue Swirl
}
485 ad96090a Blue Swirl
486 ad96090a Blue Swirl
uint64_t ram_bytes_remaining(void)
487 ad96090a Blue Swirl
{
488 ad96090a Blue Swirl
    return ram_save_remaining() * TARGET_PAGE_SIZE;
489 ad96090a Blue Swirl
}
490 ad96090a Blue Swirl
491 ad96090a Blue Swirl
uint64_t ram_bytes_transferred(void)
492 ad96090a Blue Swirl
{
493 ad96090a Blue Swirl
    return bytes_transferred;
494 ad96090a Blue Swirl
}
495 ad96090a Blue Swirl
496 ad96090a Blue Swirl
uint64_t ram_bytes_total(void)
497 ad96090a Blue Swirl
{
498 d17b5288 Alex Williamson
    RAMBlock *block;
499 d17b5288 Alex Williamson
    uint64_t total = 0;
500 d17b5288 Alex Williamson
501 d17b5288 Alex Williamson
    QLIST_FOREACH(block, &ram_list.blocks, next)
502 d17b5288 Alex Williamson
        total += block->length;
503 d17b5288 Alex Williamson
504 d17b5288 Alex Williamson
    return total;
505 ad96090a Blue Swirl
}
506 ad96090a Blue Swirl
507 b2e0a138 Michael S. Tsirkin
static int block_compar(const void *a, const void *b)
508 b2e0a138 Michael S. Tsirkin
{
509 b2e0a138 Michael S. Tsirkin
    RAMBlock * const *ablock = a;
510 b2e0a138 Michael S. Tsirkin
    RAMBlock * const *bblock = b;
511 8fec98b4 Avi Kivity
512 8fec98b4 Avi Kivity
    return strcmp((*ablock)->idstr, (*bblock)->idstr);
513 b2e0a138 Michael S. Tsirkin
}
514 b2e0a138 Michael S. Tsirkin
515 b2e0a138 Michael S. Tsirkin
static void sort_ram_list(void)
516 b2e0a138 Michael S. Tsirkin
{
517 b2e0a138 Michael S. Tsirkin
    RAMBlock *block, *nblock, **blocks;
518 b2e0a138 Michael S. Tsirkin
    int n;
519 b2e0a138 Michael S. Tsirkin
    n = 0;
520 b2e0a138 Michael S. Tsirkin
    QLIST_FOREACH(block, &ram_list.blocks, next) {
521 b2e0a138 Michael S. Tsirkin
        ++n;
522 b2e0a138 Michael S. Tsirkin
    }
523 7267c094 Anthony Liguori
    blocks = g_malloc(n * sizeof *blocks);
524 b2e0a138 Michael S. Tsirkin
    n = 0;
525 b2e0a138 Michael S. Tsirkin
    QLIST_FOREACH_SAFE(block, &ram_list.blocks, next, nblock) {
526 b2e0a138 Michael S. Tsirkin
        blocks[n++] = block;
527 b2e0a138 Michael S. Tsirkin
        QLIST_REMOVE(block, next);
528 b2e0a138 Michael S. Tsirkin
    }
529 b2e0a138 Michael S. Tsirkin
    qsort(blocks, n, sizeof *blocks, block_compar);
530 b2e0a138 Michael S. Tsirkin
    while (--n >= 0) {
531 b2e0a138 Michael S. Tsirkin
        QLIST_INSERT_HEAD(&ram_list.blocks, blocks[n], next);
532 b2e0a138 Michael S. Tsirkin
    }
533 7267c094 Anthony Liguori
    g_free(blocks);
534 b2e0a138 Michael S. Tsirkin
}
535 b2e0a138 Michael S. Tsirkin
536 8e21cd32 Orit Wasserman
static void migration_end(void)
537 8e21cd32 Orit Wasserman
{
538 8e21cd32 Orit Wasserman
    memory_global_dirty_log_stop();
539 17ad9b35 Orit Wasserman
540 17ad9b35 Orit Wasserman
    if (migrate_use_xbzrle()) {
541 17ad9b35 Orit Wasserman
        cache_fini(XBZRLE.cache);
542 17ad9b35 Orit Wasserman
        g_free(XBZRLE.cache);
543 17ad9b35 Orit Wasserman
        g_free(XBZRLE.encoded_buf);
544 17ad9b35 Orit Wasserman
        g_free(XBZRLE.current_buf);
545 17ad9b35 Orit Wasserman
        g_free(XBZRLE.decoded_buf);
546 17ad9b35 Orit Wasserman
        XBZRLE.cache = NULL;
547 17ad9b35 Orit Wasserman
    }
548 8e21cd32 Orit Wasserman
}
549 8e21cd32 Orit Wasserman
550 9b5bfab0 Juan Quintela
static void ram_migration_cancel(void *opaque)
551 9b5bfab0 Juan Quintela
{
552 9b5bfab0 Juan Quintela
    migration_end();
553 9b5bfab0 Juan Quintela
}
554 9b5bfab0 Juan Quintela
555 5a170775 Juan Quintela
556 5a170775 Juan Quintela
static void reset_ram_globals(void)
557 5a170775 Juan Quintela
{
558 5a170775 Juan Quintela
    last_block = NULL;
559 5a170775 Juan Quintela
    last_offset = 0;
560 5a170775 Juan Quintela
    sort_ram_list();
561 5a170775 Juan Quintela
}
562 5a170775 Juan Quintela
563 4508bd9e Juan Quintela
#define MAX_WAIT 50 /* ms, half buffered_file limit */
564 4508bd9e Juan Quintela
565 d1315aac Juan Quintela
static int ram_save_setup(QEMUFile *f, void *opaque)
566 ad96090a Blue Swirl
{
567 d1315aac Juan Quintela
    RAMBlock *block;
568 c6bf8e0e Juan Quintela
    int64_t ram_pages = last_ram_offset() >> TARGET_PAGE_BITS;
569 c6bf8e0e Juan Quintela
570 c6bf8e0e Juan Quintela
    migration_bitmap = bitmap_new(ram_pages);
571 c6bf8e0e Juan Quintela
    bitmap_set(migration_bitmap, 1, ram_pages);
572 c6bf8e0e Juan Quintela
    migration_dirty_pages = ram_pages;
573 ad96090a Blue Swirl
574 d1315aac Juan Quintela
    bytes_transferred = 0;
575 5a170775 Juan Quintela
    reset_ram_globals();
576 ad96090a Blue Swirl
577 17ad9b35 Orit Wasserman
    if (migrate_use_xbzrle()) {
578 17ad9b35 Orit Wasserman
        XBZRLE.cache = cache_init(migrate_xbzrle_cache_size() /
579 17ad9b35 Orit Wasserman
                                  TARGET_PAGE_SIZE,
580 17ad9b35 Orit Wasserman
                                  TARGET_PAGE_SIZE);
581 17ad9b35 Orit Wasserman
        if (!XBZRLE.cache) {
582 17ad9b35 Orit Wasserman
            DPRINTF("Error creating cache\n");
583 17ad9b35 Orit Wasserman
            return -1;
584 17ad9b35 Orit Wasserman
        }
585 17ad9b35 Orit Wasserman
        XBZRLE.encoded_buf = g_malloc0(TARGET_PAGE_SIZE);
586 17ad9b35 Orit Wasserman
        XBZRLE.current_buf = g_malloc(TARGET_PAGE_SIZE);
587 004d4c10 Orit Wasserman
        acct_clear();
588 17ad9b35 Orit Wasserman
    }
589 17ad9b35 Orit Wasserman
590 d1315aac Juan Quintela
    memory_global_dirty_log_start();
591 c6bf8e0e Juan Quintela
    migration_bitmap_sync();
592 ad96090a Blue Swirl
593 d1315aac Juan Quintela
    qemu_put_be64(f, ram_bytes_total() | RAM_SAVE_FLAG_MEM_SIZE);
594 97ab12d4 Alex Williamson
595 d1315aac Juan Quintela
    QLIST_FOREACH(block, &ram_list.blocks, next) {
596 d1315aac Juan Quintela
        qemu_put_byte(f, strlen(block->idstr));
597 d1315aac Juan Quintela
        qemu_put_buffer(f, (uint8_t *)block->idstr, strlen(block->idstr));
598 d1315aac Juan Quintela
        qemu_put_be64(f, block->length);
599 ad96090a Blue Swirl
    }
600 ad96090a Blue Swirl
601 d1315aac Juan Quintela
    qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
602 d1315aac Juan Quintela
603 d1315aac Juan Quintela
    return 0;
604 d1315aac Juan Quintela
}
605 d1315aac Juan Quintela
606 16310a3c Juan Quintela
static int ram_save_iterate(QEMUFile *f, void *opaque)
607 d1315aac Juan Quintela
{
608 d1315aac Juan Quintela
    uint64_t bytes_transferred_last;
609 d1315aac Juan Quintela
    double bwidth = 0;
610 d1315aac Juan Quintela
    int ret;
611 d1315aac Juan Quintela
    int i;
612 c00012f6 Juan Quintela
    uint64_t expected_downtime;
613 2c52ddf1 Juan Quintela
    MigrationState *s = migrate_get_current();
614 d1315aac Juan Quintela
615 ad96090a Blue Swirl
    bytes_transferred_last = bytes_transferred;
616 ad96090a Blue Swirl
    bwidth = qemu_get_clock_ns(rt_clock);
617 ad96090a Blue Swirl
618 4508bd9e Juan Quintela
    i = 0;
619 2975725f Juan Quintela
    while ((ret = qemu_file_rate_limit(f)) == 0) {
620 3fc250b4 Pierre Riteau
        int bytes_sent;
621 ad96090a Blue Swirl
622 dd051c72 Juan Quintela
        bytes_sent = ram_save_block(f, false);
623 6c779f22 Orit Wasserman
        /* no more blocks to sent */
624 6c779f22 Orit Wasserman
        if (bytes_sent < 0) {
625 ad96090a Blue Swirl
            break;
626 ad96090a Blue Swirl
        }
627 6c779f22 Orit Wasserman
        bytes_transferred += bytes_sent;
628 004d4c10 Orit Wasserman
        acct_info.iterations++;
629 4508bd9e Juan Quintela
        /* we want to check in the 1st loop, just in case it was the 1st time
630 4508bd9e Juan Quintela
           and we had to sync the dirty bitmap.
631 4508bd9e Juan Quintela
           qemu_get_clock_ns() is a bit expensive, so we only check each some
632 4508bd9e Juan Quintela
           iterations
633 4508bd9e Juan Quintela
        */
634 4508bd9e Juan Quintela
        if ((i & 63) == 0) {
635 4508bd9e Juan Quintela
            uint64_t t1 = (qemu_get_clock_ns(rt_clock) - bwidth) / 1000000;
636 4508bd9e Juan Quintela
            if (t1 > MAX_WAIT) {
637 ef37a699 Igor Mitsyanko
                DPRINTF("big wait: %" PRIu64 " milliseconds, %d iterations\n",
638 4508bd9e Juan Quintela
                        t1, i);
639 4508bd9e Juan Quintela
                break;
640 4508bd9e Juan Quintela
            }
641 4508bd9e Juan Quintela
        }
642 4508bd9e Juan Quintela
        i++;
643 ad96090a Blue Swirl
    }
644 ad96090a Blue Swirl
645 2975725f Juan Quintela
    if (ret < 0) {
646 2975725f Juan Quintela
        return ret;
647 2975725f Juan Quintela
    }
648 2975725f Juan Quintela
649 ad96090a Blue Swirl
    bwidth = qemu_get_clock_ns(rt_clock) - bwidth;
650 ad96090a Blue Swirl
    bwidth = (bytes_transferred - bytes_transferred_last) / bwidth;
651 ad96090a Blue Swirl
652 c00012f6 Juan Quintela
    /* if we haven't transferred anything this round, force
653 c00012f6 Juan Quintela
     * expected_downtime to a very high value, but without
654 c00012f6 Juan Quintela
     * crashing */
655 ad96090a Blue Swirl
    if (bwidth == 0) {
656 ad96090a Blue Swirl
        bwidth = 0.000001;
657 ad96090a Blue Swirl
    }
658 ad96090a Blue Swirl
659 16310a3c Juan Quintela
    qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
660 16310a3c Juan Quintela
661 c00012f6 Juan Quintela
    expected_downtime = ram_save_remaining() * TARGET_PAGE_SIZE / bwidth;
662 c00012f6 Juan Quintela
    DPRINTF("ram_save_live: expected(%" PRIu64 ") <= max(" PRIu64 ")?\n",
663 c00012f6 Juan Quintela
            expected_downtime, migrate_max_downtime());
664 16310a3c Juan Quintela
665 c00012f6 Juan Quintela
    if (expected_downtime <= migrate_max_downtime()) {
666 dd2df737 Juan Quintela
        migration_bitmap_sync();
667 c00012f6 Juan Quintela
        expected_downtime = ram_save_remaining() * TARGET_PAGE_SIZE / bwidth;
668 2c52ddf1 Juan Quintela
        s->expected_downtime = expected_downtime / 1000000; /* ns -> ms */
669 00d94f3f Juan Quintela
670 c00012f6 Juan Quintela
        return expected_downtime <= migrate_max_downtime();
671 00d94f3f Juan Quintela
    }
672 00d94f3f Juan Quintela
    return 0;
673 16310a3c Juan Quintela
}
674 16310a3c Juan Quintela
675 16310a3c Juan Quintela
static int ram_save_complete(QEMUFile *f, void *opaque)
676 16310a3c Juan Quintela
{
677 dd2df737 Juan Quintela
    migration_bitmap_sync();
678 16310a3c Juan Quintela
679 ad96090a Blue Swirl
    /* try transferring iterative blocks of memory */
680 3a697f69 Orit Wasserman
681 16310a3c Juan Quintela
    /* flush all remaining blocks regardless of rate limiting */
682 6c779f22 Orit Wasserman
    while (true) {
683 3fc250b4 Pierre Riteau
        int bytes_sent;
684 3fc250b4 Pierre Riteau
685 dd051c72 Juan Quintela
        bytes_sent = ram_save_block(f, true);
686 6c779f22 Orit Wasserman
        /* no more blocks to sent */
687 6c779f22 Orit Wasserman
        if (bytes_sent < 0) {
688 6c779f22 Orit Wasserman
            break;
689 ad96090a Blue Swirl
        }
690 16310a3c Juan Quintela
        bytes_transferred += bytes_sent;
691 ad96090a Blue Swirl
    }
692 16310a3c Juan Quintela
    memory_global_dirty_log_stop();
693 ad96090a Blue Swirl
694 ad96090a Blue Swirl
    qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
695 ad96090a Blue Swirl
696 c6bf8e0e Juan Quintela
    g_free(migration_bitmap);
697 c6bf8e0e Juan Quintela
    migration_bitmap = NULL;
698 c6bf8e0e Juan Quintela
699 5b3c9638 Juan Quintela
    return 0;
700 ad96090a Blue Swirl
}
701 ad96090a Blue Swirl
702 17ad9b35 Orit Wasserman
static int load_xbzrle(QEMUFile *f, ram_addr_t addr, void *host)
703 17ad9b35 Orit Wasserman
{
704 17ad9b35 Orit Wasserman
    int ret, rc = 0;
705 17ad9b35 Orit Wasserman
    unsigned int xh_len;
706 17ad9b35 Orit Wasserman
    int xh_flags;
707 17ad9b35 Orit Wasserman
708 17ad9b35 Orit Wasserman
    if (!XBZRLE.decoded_buf) {
709 17ad9b35 Orit Wasserman
        XBZRLE.decoded_buf = g_malloc(TARGET_PAGE_SIZE);
710 17ad9b35 Orit Wasserman
    }
711 17ad9b35 Orit Wasserman
712 17ad9b35 Orit Wasserman
    /* extract RLE header */
713 17ad9b35 Orit Wasserman
    xh_flags = qemu_get_byte(f);
714 17ad9b35 Orit Wasserman
    xh_len = qemu_get_be16(f);
715 17ad9b35 Orit Wasserman
716 17ad9b35 Orit Wasserman
    if (xh_flags != ENCODING_FLAG_XBZRLE) {
717 17ad9b35 Orit Wasserman
        fprintf(stderr, "Failed to load XBZRLE page - wrong compression!\n");
718 17ad9b35 Orit Wasserman
        return -1;
719 17ad9b35 Orit Wasserman
    }
720 17ad9b35 Orit Wasserman
721 17ad9b35 Orit Wasserman
    if (xh_len > TARGET_PAGE_SIZE) {
722 17ad9b35 Orit Wasserman
        fprintf(stderr, "Failed to load XBZRLE page - len overflow!\n");
723 17ad9b35 Orit Wasserman
        return -1;
724 17ad9b35 Orit Wasserman
    }
725 17ad9b35 Orit Wasserman
    /* load data and decode */
726 17ad9b35 Orit Wasserman
    qemu_get_buffer(f, XBZRLE.decoded_buf, xh_len);
727 17ad9b35 Orit Wasserman
728 17ad9b35 Orit Wasserman
    /* decode RLE */
729 17ad9b35 Orit Wasserman
    ret = xbzrle_decode_buffer(XBZRLE.decoded_buf, xh_len, host,
730 17ad9b35 Orit Wasserman
                               TARGET_PAGE_SIZE);
731 17ad9b35 Orit Wasserman
    if (ret == -1) {
732 17ad9b35 Orit Wasserman
        fprintf(stderr, "Failed to load XBZRLE page - decode error!\n");
733 17ad9b35 Orit Wasserman
        rc = -1;
734 17ad9b35 Orit Wasserman
    } else  if (ret > TARGET_PAGE_SIZE) {
735 17ad9b35 Orit Wasserman
        fprintf(stderr, "Failed to load XBZRLE page - size %d exceeds %d!\n",
736 17ad9b35 Orit Wasserman
                ret, TARGET_PAGE_SIZE);
737 17ad9b35 Orit Wasserman
        abort();
738 17ad9b35 Orit Wasserman
    }
739 17ad9b35 Orit Wasserman
740 17ad9b35 Orit Wasserman
    return rc;
741 17ad9b35 Orit Wasserman
}
742 17ad9b35 Orit Wasserman
743 a55bbe31 Alex Williamson
static inline void *host_from_stream_offset(QEMUFile *f,
744 a55bbe31 Alex Williamson
                                            ram_addr_t offset,
745 a55bbe31 Alex Williamson
                                            int flags)
746 a55bbe31 Alex Williamson
{
747 a55bbe31 Alex Williamson
    static RAMBlock *block = NULL;
748 a55bbe31 Alex Williamson
    char id[256];
749 a55bbe31 Alex Williamson
    uint8_t len;
750 a55bbe31 Alex Williamson
751 a55bbe31 Alex Williamson
    if (flags & RAM_SAVE_FLAG_CONTINUE) {
752 a55bbe31 Alex Williamson
        if (!block) {
753 a55bbe31 Alex Williamson
            fprintf(stderr, "Ack, bad migration stream!\n");
754 a55bbe31 Alex Williamson
            return NULL;
755 a55bbe31 Alex Williamson
        }
756 a55bbe31 Alex Williamson
757 dc94a7ed Avi Kivity
        return memory_region_get_ram_ptr(block->mr) + offset;
758 a55bbe31 Alex Williamson
    }
759 a55bbe31 Alex Williamson
760 a55bbe31 Alex Williamson
    len = qemu_get_byte(f);
761 a55bbe31 Alex Williamson
    qemu_get_buffer(f, (uint8_t *)id, len);
762 a55bbe31 Alex Williamson
    id[len] = 0;
763 a55bbe31 Alex Williamson
764 a55bbe31 Alex Williamson
    QLIST_FOREACH(block, &ram_list.blocks, next) {
765 a55bbe31 Alex Williamson
        if (!strncmp(id, block->idstr, sizeof(id)))
766 dc94a7ed Avi Kivity
            return memory_region_get_ram_ptr(block->mr) + offset;
767 a55bbe31 Alex Williamson
    }
768 a55bbe31 Alex Williamson
769 a55bbe31 Alex Williamson
    fprintf(stderr, "Can't find block %s!\n", id);
770 a55bbe31 Alex Williamson
    return NULL;
771 a55bbe31 Alex Williamson
}
772 a55bbe31 Alex Williamson
773 7908c78d Juan Quintela
static int ram_load(QEMUFile *f, void *opaque, int version_id)
774 ad96090a Blue Swirl
{
775 ad96090a Blue Swirl
    ram_addr_t addr;
776 3a697f69 Orit Wasserman
    int flags, ret = 0;
777 42802d47 Juan Quintela
    int error;
778 3a697f69 Orit Wasserman
    static uint64_t seq_iter;
779 3a697f69 Orit Wasserman
780 3a697f69 Orit Wasserman
    seq_iter++;
781 ad96090a Blue Swirl
782 f09f2189 Avi Kivity
    if (version_id < 4 || version_id > 4) {
783 ad96090a Blue Swirl
        return -EINVAL;
784 ad96090a Blue Swirl
    }
785 ad96090a Blue Swirl
786 ad96090a Blue Swirl
    do {
787 ad96090a Blue Swirl
        addr = qemu_get_be64(f);
788 ad96090a Blue Swirl
789 ad96090a Blue Swirl
        flags = addr & ~TARGET_PAGE_MASK;
790 ad96090a Blue Swirl
        addr &= TARGET_PAGE_MASK;
791 ad96090a Blue Swirl
792 ad96090a Blue Swirl
        if (flags & RAM_SAVE_FLAG_MEM_SIZE) {
793 f09f2189 Avi Kivity
            if (version_id == 4) {
794 97ab12d4 Alex Williamson
                /* Synchronize RAM block list */
795 97ab12d4 Alex Williamson
                char id[256];
796 97ab12d4 Alex Williamson
                ram_addr_t length;
797 97ab12d4 Alex Williamson
                ram_addr_t total_ram_bytes = addr;
798 97ab12d4 Alex Williamson
799 97ab12d4 Alex Williamson
                while (total_ram_bytes) {
800 97ab12d4 Alex Williamson
                    RAMBlock *block;
801 97ab12d4 Alex Williamson
                    uint8_t len;
802 97ab12d4 Alex Williamson
803 97ab12d4 Alex Williamson
                    len = qemu_get_byte(f);
804 97ab12d4 Alex Williamson
                    qemu_get_buffer(f, (uint8_t *)id, len);
805 97ab12d4 Alex Williamson
                    id[len] = 0;
806 97ab12d4 Alex Williamson
                    length = qemu_get_be64(f);
807 97ab12d4 Alex Williamson
808 97ab12d4 Alex Williamson
                    QLIST_FOREACH(block, &ram_list.blocks, next) {
809 97ab12d4 Alex Williamson
                        if (!strncmp(id, block->idstr, sizeof(id))) {
810 3a697f69 Orit Wasserman
                            if (block->length != length) {
811 3a697f69 Orit Wasserman
                                ret =  -EINVAL;
812 3a697f69 Orit Wasserman
                                goto done;
813 3a697f69 Orit Wasserman
                            }
814 97ab12d4 Alex Williamson
                            break;
815 97ab12d4 Alex Williamson
                        }
816 97ab12d4 Alex Williamson
                    }
817 97ab12d4 Alex Williamson
818 97ab12d4 Alex Williamson
                    if (!block) {
819 fb787f81 Alex Williamson
                        fprintf(stderr, "Unknown ramblock \"%s\", cannot "
820 fb787f81 Alex Williamson
                                "accept migration\n", id);
821 3a697f69 Orit Wasserman
                        ret = -EINVAL;
822 3a697f69 Orit Wasserman
                        goto done;
823 97ab12d4 Alex Williamson
                    }
824 97ab12d4 Alex Williamson
825 97ab12d4 Alex Williamson
                    total_ram_bytes -= length;
826 97ab12d4 Alex Williamson
                }
827 ad96090a Blue Swirl
            }
828 ad96090a Blue Swirl
        }
829 ad96090a Blue Swirl
830 ad96090a Blue Swirl
        if (flags & RAM_SAVE_FLAG_COMPRESS) {
831 97ab12d4 Alex Williamson
            void *host;
832 97ab12d4 Alex Williamson
            uint8_t ch;
833 97ab12d4 Alex Williamson
834 f09f2189 Avi Kivity
            host = host_from_stream_offset(f, addr, flags);
835 492fb99c Michael S. Tsirkin
            if (!host) {
836 492fb99c Michael S. Tsirkin
                return -EINVAL;
837 492fb99c Michael S. Tsirkin
            }
838 97ab12d4 Alex Williamson
839 97ab12d4 Alex Williamson
            ch = qemu_get_byte(f);
840 97ab12d4 Alex Williamson
            memset(host, ch, TARGET_PAGE_SIZE);
841 ad96090a Blue Swirl
#ifndef _WIN32
842 ad96090a Blue Swirl
            if (ch == 0 &&
843 ad96090a Blue Swirl
                (!kvm_enabled() || kvm_has_sync_mmu())) {
844 e78815a5 Andreas Färber
                qemu_madvise(host, TARGET_PAGE_SIZE, QEMU_MADV_DONTNEED);
845 ad96090a Blue Swirl
            }
846 ad96090a Blue Swirl
#endif
847 ad96090a Blue Swirl
        } else if (flags & RAM_SAVE_FLAG_PAGE) {
848 97ab12d4 Alex Williamson
            void *host;
849 97ab12d4 Alex Williamson
850 f09f2189 Avi Kivity
            host = host_from_stream_offset(f, addr, flags);
851 0ff1f9f5 Orit Wasserman
            if (!host) {
852 0ff1f9f5 Orit Wasserman
                return -EINVAL;
853 0ff1f9f5 Orit Wasserman
            }
854 97ab12d4 Alex Williamson
855 97ab12d4 Alex Williamson
            qemu_get_buffer(f, host, TARGET_PAGE_SIZE);
856 17ad9b35 Orit Wasserman
        } else if (flags & RAM_SAVE_FLAG_XBZRLE) {
857 17ad9b35 Orit Wasserman
            if (!migrate_use_xbzrle()) {
858 17ad9b35 Orit Wasserman
                return -EINVAL;
859 17ad9b35 Orit Wasserman
            }
860 17ad9b35 Orit Wasserman
            void *host = host_from_stream_offset(f, addr, flags);
861 17ad9b35 Orit Wasserman
            if (!host) {
862 17ad9b35 Orit Wasserman
                return -EINVAL;
863 17ad9b35 Orit Wasserman
            }
864 17ad9b35 Orit Wasserman
865 17ad9b35 Orit Wasserman
            if (load_xbzrle(f, addr, host) < 0) {
866 17ad9b35 Orit Wasserman
                ret = -EINVAL;
867 17ad9b35 Orit Wasserman
                goto done;
868 17ad9b35 Orit Wasserman
            }
869 ad96090a Blue Swirl
        }
870 42802d47 Juan Quintela
        error = qemu_file_get_error(f);
871 42802d47 Juan Quintela
        if (error) {
872 3a697f69 Orit Wasserman
            ret = error;
873 3a697f69 Orit Wasserman
            goto done;
874 ad96090a Blue Swirl
        }
875 ad96090a Blue Swirl
    } while (!(flags & RAM_SAVE_FLAG_EOS));
876 ad96090a Blue Swirl
877 3a697f69 Orit Wasserman
done:
878 ef37a699 Igor Mitsyanko
    DPRINTF("Completed load of VM with exit code %d seq iteration "
879 ef37a699 Igor Mitsyanko
            "%" PRIu64 "\n", ret, seq_iter);
880 3a697f69 Orit Wasserman
    return ret;
881 ad96090a Blue Swirl
}
882 ad96090a Blue Swirl
883 7908c78d Juan Quintela
SaveVMHandlers savevm_ram_handlers = {
884 d1315aac Juan Quintela
    .save_live_setup = ram_save_setup,
885 16310a3c Juan Quintela
    .save_live_iterate = ram_save_iterate,
886 16310a3c Juan Quintela
    .save_live_complete = ram_save_complete,
887 7908c78d Juan Quintela
    .load_state = ram_load,
888 9b5bfab0 Juan Quintela
    .cancel = ram_migration_cancel,
889 7908c78d Juan Quintela
};
890 7908c78d Juan Quintela
891 ad96090a Blue Swirl
#ifdef HAS_AUDIO
892 0dfa5ef9 Isaku Yamahata
struct soundhw {
893 0dfa5ef9 Isaku Yamahata
    const char *name;
894 0dfa5ef9 Isaku Yamahata
    const char *descr;
895 0dfa5ef9 Isaku Yamahata
    int enabled;
896 0dfa5ef9 Isaku Yamahata
    int isa;
897 0dfa5ef9 Isaku Yamahata
    union {
898 4a0f031d Hervé Poussineau
        int (*init_isa) (ISABus *bus);
899 0dfa5ef9 Isaku Yamahata
        int (*init_pci) (PCIBus *bus);
900 0dfa5ef9 Isaku Yamahata
    } init;
901 0dfa5ef9 Isaku Yamahata
};
902 0dfa5ef9 Isaku Yamahata
903 0dfa5ef9 Isaku Yamahata
static struct soundhw soundhw[] = {
904 ad96090a Blue Swirl
#ifdef HAS_AUDIO_CHOICE
905 da12872a Hervé Poussineau
#ifdef CONFIG_PCSPK
906 ad96090a Blue Swirl
    {
907 ad96090a Blue Swirl
        "pcspk",
908 ad96090a Blue Swirl
        "PC speaker",
909 ad96090a Blue Swirl
        0,
910 ad96090a Blue Swirl
        1,
911 ad96090a Blue Swirl
        { .init_isa = pcspk_audio_init }
912 ad96090a Blue Swirl
    },
913 ad96090a Blue Swirl
#endif
914 ad96090a Blue Swirl
915 ad96090a Blue Swirl
#ifdef CONFIG_SB16
916 ad96090a Blue Swirl
    {
917 ad96090a Blue Swirl
        "sb16",
918 ad96090a Blue Swirl
        "Creative Sound Blaster 16",
919 ad96090a Blue Swirl
        0,
920 ad96090a Blue Swirl
        1,
921 ad96090a Blue Swirl
        { .init_isa = SB16_init }
922 ad96090a Blue Swirl
    },
923 ad96090a Blue Swirl
#endif
924 ad96090a Blue Swirl
925 ad96090a Blue Swirl
#ifdef CONFIG_CS4231A
926 ad96090a Blue Swirl
    {
927 ad96090a Blue Swirl
        "cs4231a",
928 ad96090a Blue Swirl
        "CS4231A",
929 ad96090a Blue Swirl
        0,
930 ad96090a Blue Swirl
        1,
931 ad96090a Blue Swirl
        { .init_isa = cs4231a_init }
932 ad96090a Blue Swirl
    },
933 ad96090a Blue Swirl
#endif
934 ad96090a Blue Swirl
935 ad96090a Blue Swirl
#ifdef CONFIG_ADLIB
936 ad96090a Blue Swirl
    {
937 ad96090a Blue Swirl
        "adlib",
938 ad96090a Blue Swirl
#ifdef HAS_YMF262
939 ad96090a Blue Swirl
        "Yamaha YMF262 (OPL3)",
940 ad96090a Blue Swirl
#else
941 ad96090a Blue Swirl
        "Yamaha YM3812 (OPL2)",
942 ad96090a Blue Swirl
#endif
943 ad96090a Blue Swirl
        0,
944 ad96090a Blue Swirl
        1,
945 ad96090a Blue Swirl
        { .init_isa = Adlib_init }
946 ad96090a Blue Swirl
    },
947 ad96090a Blue Swirl
#endif
948 ad96090a Blue Swirl
949 ad96090a Blue Swirl
#ifdef CONFIG_GUS
950 ad96090a Blue Swirl
    {
951 ad96090a Blue Swirl
        "gus",
952 ad96090a Blue Swirl
        "Gravis Ultrasound GF1",
953 ad96090a Blue Swirl
        0,
954 ad96090a Blue Swirl
        1,
955 ad96090a Blue Swirl
        { .init_isa = GUS_init }
956 ad96090a Blue Swirl
    },
957 ad96090a Blue Swirl
#endif
958 ad96090a Blue Swirl
959 ad96090a Blue Swirl
#ifdef CONFIG_AC97
960 ad96090a Blue Swirl
    {
961 ad96090a Blue Swirl
        "ac97",
962 ad96090a Blue Swirl
        "Intel 82801AA AC97 Audio",
963 ad96090a Blue Swirl
        0,
964 ad96090a Blue Swirl
        0,
965 ad96090a Blue Swirl
        { .init_pci = ac97_init }
966 ad96090a Blue Swirl
    },
967 ad96090a Blue Swirl
#endif
968 ad96090a Blue Swirl
969 ad96090a Blue Swirl
#ifdef CONFIG_ES1370
970 ad96090a Blue Swirl
    {
971 ad96090a Blue Swirl
        "es1370",
972 ad96090a Blue Swirl
        "ENSONIQ AudioPCI ES1370",
973 ad96090a Blue Swirl
        0,
974 ad96090a Blue Swirl
        0,
975 ad96090a Blue Swirl
        { .init_pci = es1370_init }
976 ad96090a Blue Swirl
    },
977 ad96090a Blue Swirl
#endif
978 ad96090a Blue Swirl
979 d61a4ce8 Gerd Hoffmann
#ifdef CONFIG_HDA
980 d61a4ce8 Gerd Hoffmann
    {
981 d61a4ce8 Gerd Hoffmann
        "hda",
982 d61a4ce8 Gerd Hoffmann
        "Intel HD Audio",
983 d61a4ce8 Gerd Hoffmann
        0,
984 d61a4ce8 Gerd Hoffmann
        0,
985 d61a4ce8 Gerd Hoffmann
        { .init_pci = intel_hda_and_codec_init }
986 d61a4ce8 Gerd Hoffmann
    },
987 d61a4ce8 Gerd Hoffmann
#endif
988 d61a4ce8 Gerd Hoffmann
989 ad96090a Blue Swirl
#endif /* HAS_AUDIO_CHOICE */
990 ad96090a Blue Swirl
991 ad96090a Blue Swirl
    { NULL, NULL, 0, 0, { NULL } }
992 ad96090a Blue Swirl
};
993 ad96090a Blue Swirl
994 ad96090a Blue Swirl
void select_soundhw(const char *optarg)
995 ad96090a Blue Swirl
{
996 ad96090a Blue Swirl
    struct soundhw *c;
997 ad96090a Blue Swirl
998 c8057f95 Peter Maydell
    if (is_help_option(optarg)) {
999 ad96090a Blue Swirl
    show_valid_cards:
1000 ad96090a Blue Swirl
1001 55d4fd3c Peter Maydell
#ifdef HAS_AUDIO_CHOICE
1002 ad96090a Blue Swirl
        printf("Valid sound card names (comma separated):\n");
1003 ad96090a Blue Swirl
        for (c = soundhw; c->name; ++c) {
1004 ad96090a Blue Swirl
            printf ("%-11s %s\n", c->name, c->descr);
1005 ad96090a Blue Swirl
        }
1006 ad96090a Blue Swirl
        printf("\n-soundhw all will enable all of the above\n");
1007 55d4fd3c Peter Maydell
#else
1008 55d4fd3c Peter Maydell
        printf("Machine has no user-selectable audio hardware "
1009 55d4fd3c Peter Maydell
               "(it may or may not have always-present audio hardware).\n");
1010 55d4fd3c Peter Maydell
#endif
1011 c8057f95 Peter Maydell
        exit(!is_help_option(optarg));
1012 ad96090a Blue Swirl
    }
1013 ad96090a Blue Swirl
    else {
1014 ad96090a Blue Swirl
        size_t l;
1015 ad96090a Blue Swirl
        const char *p;
1016 ad96090a Blue Swirl
        char *e;
1017 ad96090a Blue Swirl
        int bad_card = 0;
1018 ad96090a Blue Swirl
1019 ad96090a Blue Swirl
        if (!strcmp(optarg, "all")) {
1020 ad96090a Blue Swirl
            for (c = soundhw; c->name; ++c) {
1021 ad96090a Blue Swirl
                c->enabled = 1;
1022 ad96090a Blue Swirl
            }
1023 ad96090a Blue Swirl
            return;
1024 ad96090a Blue Swirl
        }
1025 ad96090a Blue Swirl
1026 ad96090a Blue Swirl
        p = optarg;
1027 ad96090a Blue Swirl
        while (*p) {
1028 ad96090a Blue Swirl
            e = strchr(p, ',');
1029 ad96090a Blue Swirl
            l = !e ? strlen(p) : (size_t) (e - p);
1030 ad96090a Blue Swirl
1031 ad96090a Blue Swirl
            for (c = soundhw; c->name; ++c) {
1032 ad96090a Blue Swirl
                if (!strncmp(c->name, p, l) && !c->name[l]) {
1033 ad96090a Blue Swirl
                    c->enabled = 1;
1034 ad96090a Blue Swirl
                    break;
1035 ad96090a Blue Swirl
                }
1036 ad96090a Blue Swirl
            }
1037 ad96090a Blue Swirl
1038 ad96090a Blue Swirl
            if (!c->name) {
1039 ad96090a Blue Swirl
                if (l > 80) {
1040 ad96090a Blue Swirl
                    fprintf(stderr,
1041 ad96090a Blue Swirl
                            "Unknown sound card name (too big to show)\n");
1042 ad96090a Blue Swirl
                }
1043 ad96090a Blue Swirl
                else {
1044 ad96090a Blue Swirl
                    fprintf(stderr, "Unknown sound card name `%.*s'\n",
1045 ad96090a Blue Swirl
                            (int) l, p);
1046 ad96090a Blue Swirl
                }
1047 ad96090a Blue Swirl
                bad_card = 1;
1048 ad96090a Blue Swirl
            }
1049 ad96090a Blue Swirl
            p += l + (e != NULL);
1050 ad96090a Blue Swirl
        }
1051 ad96090a Blue Swirl
1052 ad96090a Blue Swirl
        if (bad_card) {
1053 ad96090a Blue Swirl
            goto show_valid_cards;
1054 ad96090a Blue Swirl
        }
1055 ad96090a Blue Swirl
    }
1056 ad96090a Blue Swirl
}
1057 0dfa5ef9 Isaku Yamahata
1058 4a0f031d Hervé Poussineau
void audio_init(ISABus *isa_bus, PCIBus *pci_bus)
1059 0dfa5ef9 Isaku Yamahata
{
1060 0dfa5ef9 Isaku Yamahata
    struct soundhw *c;
1061 0dfa5ef9 Isaku Yamahata
1062 0dfa5ef9 Isaku Yamahata
    for (c = soundhw; c->name; ++c) {
1063 0dfa5ef9 Isaku Yamahata
        if (c->enabled) {
1064 0dfa5ef9 Isaku Yamahata
            if (c->isa) {
1065 4a0f031d Hervé Poussineau
                if (isa_bus) {
1066 4a0f031d Hervé Poussineau
                    c->init.init_isa(isa_bus);
1067 0dfa5ef9 Isaku Yamahata
                }
1068 0dfa5ef9 Isaku Yamahata
            } else {
1069 0dfa5ef9 Isaku Yamahata
                if (pci_bus) {
1070 0dfa5ef9 Isaku Yamahata
                    c->init.init_pci(pci_bus);
1071 0dfa5ef9 Isaku Yamahata
                }
1072 0dfa5ef9 Isaku Yamahata
            }
1073 0dfa5ef9 Isaku Yamahata
        }
1074 0dfa5ef9 Isaku Yamahata
    }
1075 0dfa5ef9 Isaku Yamahata
}
1076 ad96090a Blue Swirl
#else
1077 ad96090a Blue Swirl
void select_soundhw(const char *optarg)
1078 ad96090a Blue Swirl
{
1079 ad96090a Blue Swirl
}
1080 4a0f031d Hervé Poussineau
void audio_init(ISABus *isa_bus, PCIBus *pci_bus)
1081 0dfa5ef9 Isaku Yamahata
{
1082 0dfa5ef9 Isaku Yamahata
}
1083 ad96090a Blue Swirl
#endif
1084 ad96090a Blue Swirl
1085 ad96090a Blue Swirl
int qemu_uuid_parse(const char *str, uint8_t *uuid)
1086 ad96090a Blue Swirl
{
1087 ad96090a Blue Swirl
    int ret;
1088 ad96090a Blue Swirl
1089 ad96090a Blue Swirl
    if (strlen(str) != 36) {
1090 ad96090a Blue Swirl
        return -1;
1091 ad96090a Blue Swirl
    }
1092 ad96090a Blue Swirl
1093 ad96090a Blue Swirl
    ret = sscanf(str, UUID_FMT, &uuid[0], &uuid[1], &uuid[2], &uuid[3],
1094 ad96090a Blue Swirl
                 &uuid[4], &uuid[5], &uuid[6], &uuid[7], &uuid[8], &uuid[9],
1095 ad96090a Blue Swirl
                 &uuid[10], &uuid[11], &uuid[12], &uuid[13], &uuid[14],
1096 ad96090a Blue Swirl
                 &uuid[15]);
1097 ad96090a Blue Swirl
1098 ad96090a Blue Swirl
    if (ret != 16) {
1099 ad96090a Blue Swirl
        return -1;
1100 ad96090a Blue Swirl
    }
1101 ad96090a Blue Swirl
#ifdef TARGET_I386
1102 ad96090a Blue Swirl
    smbios_add_field(1, offsetof(struct smbios_type_1, uuid), 16, uuid);
1103 ad96090a Blue Swirl
#endif
1104 ad96090a Blue Swirl
    return 0;
1105 ad96090a Blue Swirl
}
1106 ad96090a Blue Swirl
1107 ad96090a Blue Swirl
void do_acpitable_option(const char *optarg)
1108 ad96090a Blue Swirl
{
1109 ad96090a Blue Swirl
#ifdef TARGET_I386
1110 ad96090a Blue Swirl
    if (acpi_table_add(optarg) < 0) {
1111 ad96090a Blue Swirl
        fprintf(stderr, "Wrong acpi table provided\n");
1112 ad96090a Blue Swirl
        exit(1);
1113 ad96090a Blue Swirl
    }
1114 ad96090a Blue Swirl
#endif
1115 ad96090a Blue Swirl
}
1116 ad96090a Blue Swirl
1117 ad96090a Blue Swirl
void do_smbios_option(const char *optarg)
1118 ad96090a Blue Swirl
{
1119 ad96090a Blue Swirl
#ifdef TARGET_I386
1120 ad96090a Blue Swirl
    if (smbios_entry_add(optarg) < 0) {
1121 ad96090a Blue Swirl
        fprintf(stderr, "Wrong smbios provided\n");
1122 ad96090a Blue Swirl
        exit(1);
1123 ad96090a Blue Swirl
    }
1124 ad96090a Blue Swirl
#endif
1125 ad96090a Blue Swirl
}
1126 ad96090a Blue Swirl
1127 ad96090a Blue Swirl
void cpudef_init(void)
1128 ad96090a Blue Swirl
{
1129 ad96090a Blue Swirl
#if defined(cpudef_setup)
1130 ad96090a Blue Swirl
    cpudef_setup(); /* parse cpu definitions in target config file */
1131 ad96090a Blue Swirl
#endif
1132 ad96090a Blue Swirl
}
1133 ad96090a Blue Swirl
1134 ad96090a Blue Swirl
int audio_available(void)
1135 ad96090a Blue Swirl
{
1136 ad96090a Blue Swirl
#ifdef HAS_AUDIO
1137 ad96090a Blue Swirl
    return 1;
1138 ad96090a Blue Swirl
#else
1139 ad96090a Blue Swirl
    return 0;
1140 ad96090a Blue Swirl
#endif
1141 ad96090a Blue Swirl
}
1142 ad96090a Blue Swirl
1143 303d4e86 Anthony PERARD
int tcg_available(void)
1144 303d4e86 Anthony PERARD
{
1145 303d4e86 Anthony PERARD
    return 1;
1146 303d4e86 Anthony PERARD
}
1147 303d4e86 Anthony PERARD
1148 ad96090a Blue Swirl
int kvm_available(void)
1149 ad96090a Blue Swirl
{
1150 ad96090a Blue Swirl
#ifdef CONFIG_KVM
1151 ad96090a Blue Swirl
    return 1;
1152 ad96090a Blue Swirl
#else
1153 ad96090a Blue Swirl
    return 0;
1154 ad96090a Blue Swirl
#endif
1155 ad96090a Blue Swirl
}
1156 ad96090a Blue Swirl
1157 ad96090a Blue Swirl
int xen_available(void)
1158 ad96090a Blue Swirl
{
1159 ad96090a Blue Swirl
#ifdef CONFIG_XEN
1160 ad96090a Blue Swirl
    return 1;
1161 ad96090a Blue Swirl
#else
1162 ad96090a Blue Swirl
    return 0;
1163 ad96090a Blue Swirl
#endif
1164 ad96090a Blue Swirl
}
1165 99afc91d Daniel P. Berrange
1166 99afc91d Daniel P. Berrange
1167 99afc91d Daniel P. Berrange
TargetInfo *qmp_query_target(Error **errp)
1168 99afc91d Daniel P. Berrange
{
1169 99afc91d Daniel P. Berrange
    TargetInfo *info = g_malloc0(sizeof(*info));
1170 99afc91d Daniel P. Berrange
1171 99afc91d Daniel P. Berrange
    info->arch = TARGET_TYPE;
1172 99afc91d Daniel P. Berrange
1173 99afc91d Daniel P. Berrange
    return info;
1174 99afc91d Daniel P. Berrange
}