Statistics
| Branch: | Revision:

root / kvm-all.c @ ea375f9a

History | View | Annotate | Download (29 kB)

1 05330448 aliguori
/*
2 05330448 aliguori
 * QEMU KVM support
3 05330448 aliguori
 *
4 05330448 aliguori
 * Copyright IBM, Corp. 2008
5 5832d1f2 aliguori
 *           Red Hat, Inc. 2008
6 05330448 aliguori
 *
7 05330448 aliguori
 * Authors:
8 05330448 aliguori
 *  Anthony Liguori   <aliguori@us.ibm.com>
9 5832d1f2 aliguori
 *  Glauber Costa     <gcosta@redhat.com>
10 05330448 aliguori
 *
11 05330448 aliguori
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
12 05330448 aliguori
 * See the COPYING file in the top-level directory.
13 05330448 aliguori
 *
14 05330448 aliguori
 */
15 05330448 aliguori
16 05330448 aliguori
#include <sys/types.h>
17 05330448 aliguori
#include <sys/ioctl.h>
18 05330448 aliguori
#include <sys/mman.h>
19 984b5181 aliguori
#include <stdarg.h>
20 05330448 aliguori
21 05330448 aliguori
#include <linux/kvm.h>
22 05330448 aliguori
23 05330448 aliguori
#include "qemu-common.h"
24 85199474 Marcelo Tosatti
#include "qemu-barrier.h"
25 05330448 aliguori
#include "sysemu.h"
26 d33a1810 Jan Kiszka
#include "hw/hw.h"
27 e22a25c9 aliguori
#include "gdbstub.h"
28 05330448 aliguori
#include "kvm.h"
29 05330448 aliguori
30 f65ed4c1 aliguori
/* KVM uses PAGE_SIZE in it's definition of COALESCED_MMIO_MAX */
31 f65ed4c1 aliguori
#define PAGE_SIZE TARGET_PAGE_SIZE
32 f65ed4c1 aliguori
33 05330448 aliguori
//#define DEBUG_KVM
34 05330448 aliguori
35 05330448 aliguori
#ifdef DEBUG_KVM
36 05330448 aliguori
#define dprintf(fmt, ...) \
37 05330448 aliguori
    do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
38 05330448 aliguori
#else
39 05330448 aliguori
#define dprintf(fmt, ...) \
40 05330448 aliguori
    do { } while (0)
41 05330448 aliguori
#endif
42 05330448 aliguori
43 34fc643f aliguori
typedef struct KVMSlot
44 34fc643f aliguori
{
45 c227f099 Anthony Liguori
    target_phys_addr_t start_addr;
46 c227f099 Anthony Liguori
    ram_addr_t memory_size;
47 c227f099 Anthony Liguori
    ram_addr_t phys_offset;
48 34fc643f aliguori
    int slot;
49 34fc643f aliguori
    int flags;
50 34fc643f aliguori
} KVMSlot;
51 05330448 aliguori
52 5832d1f2 aliguori
typedef struct kvm_dirty_log KVMDirtyLog;
53 5832d1f2 aliguori
54 05330448 aliguori
int kvm_allowed = 0;
55 05330448 aliguori
56 05330448 aliguori
struct KVMState
57 05330448 aliguori
{
58 05330448 aliguori
    KVMSlot slots[32];
59 05330448 aliguori
    int fd;
60 05330448 aliguori
    int vmfd;
61 f65ed4c1 aliguori
    int coalesced_mmio;
62 62a2744c Sheng Yang
#ifdef KVM_CAP_COALESCED_MMIO
63 62a2744c Sheng Yang
    struct kvm_coalesced_mmio_ring *coalesced_mmio_ring;
64 62a2744c Sheng Yang
#endif
65 e69917e2 Jan Kiszka
    int broken_set_mem_region;
66 4495d6a7 Jan Kiszka
    int migration_log;
67 a0fb002c Jan Kiszka
    int vcpu_events;
68 b0b1d690 Jan Kiszka
    int robust_singlestep;
69 e22a25c9 aliguori
#ifdef KVM_CAP_SET_GUEST_DEBUG
70 e22a25c9 aliguori
    struct kvm_sw_breakpoint_head kvm_sw_breakpoints;
71 e22a25c9 aliguori
#endif
72 6f725c13 Glauber Costa
    int irqchip_in_kernel;
73 6f725c13 Glauber Costa
    int pit_in_kernel;
74 05330448 aliguori
};
75 05330448 aliguori
76 05330448 aliguori
static KVMState *kvm_state;
77 05330448 aliguori
78 05330448 aliguori
static KVMSlot *kvm_alloc_slot(KVMState *s)
79 05330448 aliguori
{
80 05330448 aliguori
    int i;
81 05330448 aliguori
82 05330448 aliguori
    for (i = 0; i < ARRAY_SIZE(s->slots); i++) {
83 62d60e8c aliguori
        /* KVM private memory slots */
84 62d60e8c aliguori
        if (i >= 8 && i < 12)
85 62d60e8c aliguori
            continue;
86 05330448 aliguori
        if (s->slots[i].memory_size == 0)
87 05330448 aliguori
            return &s->slots[i];
88 05330448 aliguori
    }
89 05330448 aliguori
90 d3f8d37f aliguori
    fprintf(stderr, "%s: no free slot available\n", __func__);
91 d3f8d37f aliguori
    abort();
92 d3f8d37f aliguori
}
93 d3f8d37f aliguori
94 d3f8d37f aliguori
static KVMSlot *kvm_lookup_matching_slot(KVMState *s,
95 c227f099 Anthony Liguori
                                         target_phys_addr_t start_addr,
96 c227f099 Anthony Liguori
                                         target_phys_addr_t end_addr)
97 d3f8d37f aliguori
{
98 d3f8d37f aliguori
    int i;
99 d3f8d37f aliguori
100 d3f8d37f aliguori
    for (i = 0; i < ARRAY_SIZE(s->slots); i++) {
101 d3f8d37f aliguori
        KVMSlot *mem = &s->slots[i];
102 d3f8d37f aliguori
103 d3f8d37f aliguori
        if (start_addr == mem->start_addr &&
104 d3f8d37f aliguori
            end_addr == mem->start_addr + mem->memory_size) {
105 d3f8d37f aliguori
            return mem;
106 d3f8d37f aliguori
        }
107 d3f8d37f aliguori
    }
108 d3f8d37f aliguori
109 05330448 aliguori
    return NULL;
110 05330448 aliguori
}
111 05330448 aliguori
112 6152e2ae aliguori
/*
113 6152e2ae aliguori
 * Find overlapping slot with lowest start address
114 6152e2ae aliguori
 */
115 6152e2ae aliguori
static KVMSlot *kvm_lookup_overlapping_slot(KVMState *s,
116 c227f099 Anthony Liguori
                                            target_phys_addr_t start_addr,
117 c227f099 Anthony Liguori
                                            target_phys_addr_t end_addr)
118 05330448 aliguori
{
119 6152e2ae aliguori
    KVMSlot *found = NULL;
120 05330448 aliguori
    int i;
121 05330448 aliguori
122 05330448 aliguori
    for (i = 0; i < ARRAY_SIZE(s->slots); i++) {
123 05330448 aliguori
        KVMSlot *mem = &s->slots[i];
124 05330448 aliguori
125 6152e2ae aliguori
        if (mem->memory_size == 0 ||
126 6152e2ae aliguori
            (found && found->start_addr < mem->start_addr)) {
127 6152e2ae aliguori
            continue;
128 6152e2ae aliguori
        }
129 6152e2ae aliguori
130 6152e2ae aliguori
        if (end_addr > mem->start_addr &&
131 6152e2ae aliguori
            start_addr < mem->start_addr + mem->memory_size) {
132 6152e2ae aliguori
            found = mem;
133 6152e2ae aliguori
        }
134 05330448 aliguori
    }
135 05330448 aliguori
136 6152e2ae aliguori
    return found;
137 05330448 aliguori
}
138 05330448 aliguori
139 5832d1f2 aliguori
static int kvm_set_user_memory_region(KVMState *s, KVMSlot *slot)
140 5832d1f2 aliguori
{
141 5832d1f2 aliguori
    struct kvm_userspace_memory_region mem;
142 5832d1f2 aliguori
143 5832d1f2 aliguori
    mem.slot = slot->slot;
144 5832d1f2 aliguori
    mem.guest_phys_addr = slot->start_addr;
145 5832d1f2 aliguori
    mem.memory_size = slot->memory_size;
146 5579c7f3 pbrook
    mem.userspace_addr = (unsigned long)qemu_get_ram_ptr(slot->phys_offset);
147 5832d1f2 aliguori
    mem.flags = slot->flags;
148 4495d6a7 Jan Kiszka
    if (s->migration_log) {
149 4495d6a7 Jan Kiszka
        mem.flags |= KVM_MEM_LOG_DIRTY_PAGES;
150 4495d6a7 Jan Kiszka
    }
151 5832d1f2 aliguori
    return kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, &mem);
152 5832d1f2 aliguori
}
153 5832d1f2 aliguori
154 8d2ba1fb Jan Kiszka
static void kvm_reset_vcpu(void *opaque)
155 8d2ba1fb Jan Kiszka
{
156 8d2ba1fb Jan Kiszka
    CPUState *env = opaque;
157 8d2ba1fb Jan Kiszka
158 caa5af0f Jan Kiszka
    kvm_arch_reset_vcpu(env);
159 8d2ba1fb Jan Kiszka
}
160 5832d1f2 aliguori
161 6f725c13 Glauber Costa
int kvm_irqchip_in_kernel(void)
162 6f725c13 Glauber Costa
{
163 6f725c13 Glauber Costa
    return kvm_state->irqchip_in_kernel;
164 6f725c13 Glauber Costa
}
165 6f725c13 Glauber Costa
166 6f725c13 Glauber Costa
int kvm_pit_in_kernel(void)
167 6f725c13 Glauber Costa
{
168 6f725c13 Glauber Costa
    return kvm_state->pit_in_kernel;
169 6f725c13 Glauber Costa
}
170 6f725c13 Glauber Costa
171 6f725c13 Glauber Costa
172 05330448 aliguori
int kvm_init_vcpu(CPUState *env)
173 05330448 aliguori
{
174 05330448 aliguori
    KVMState *s = kvm_state;
175 05330448 aliguori
    long mmap_size;
176 05330448 aliguori
    int ret;
177 05330448 aliguori
178 05330448 aliguori
    dprintf("kvm_init_vcpu\n");
179 05330448 aliguori
180 984b5181 aliguori
    ret = kvm_vm_ioctl(s, KVM_CREATE_VCPU, env->cpu_index);
181 05330448 aliguori
    if (ret < 0) {
182 05330448 aliguori
        dprintf("kvm_create_vcpu failed\n");
183 05330448 aliguori
        goto err;
184 05330448 aliguori
    }
185 05330448 aliguori
186 05330448 aliguori
    env->kvm_fd = ret;
187 05330448 aliguori
    env->kvm_state = s;
188 05330448 aliguori
189 05330448 aliguori
    mmap_size = kvm_ioctl(s, KVM_GET_VCPU_MMAP_SIZE, 0);
190 05330448 aliguori
    if (mmap_size < 0) {
191 05330448 aliguori
        dprintf("KVM_GET_VCPU_MMAP_SIZE failed\n");
192 05330448 aliguori
        goto err;
193 05330448 aliguori
    }
194 05330448 aliguori
195 05330448 aliguori
    env->kvm_run = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED,
196 05330448 aliguori
                        env->kvm_fd, 0);
197 05330448 aliguori
    if (env->kvm_run == MAP_FAILED) {
198 05330448 aliguori
        ret = -errno;
199 05330448 aliguori
        dprintf("mmap'ing vcpu state failed\n");
200 05330448 aliguori
        goto err;
201 05330448 aliguori
    }
202 05330448 aliguori
203 62a2744c Sheng Yang
#ifdef KVM_CAP_COALESCED_MMIO
204 62a2744c Sheng Yang
    if (s->coalesced_mmio && !s->coalesced_mmio_ring)
205 62a2744c Sheng Yang
        s->coalesced_mmio_ring = (void *) env->kvm_run +
206 62a2744c Sheng Yang
                s->coalesced_mmio * PAGE_SIZE;
207 62a2744c Sheng Yang
#endif
208 62a2744c Sheng Yang
209 05330448 aliguori
    ret = kvm_arch_init_vcpu(env);
210 8d2ba1fb Jan Kiszka
    if (ret == 0) {
211 a08d4367 Jan Kiszka
        qemu_register_reset(kvm_reset_vcpu, env);
212 caa5af0f Jan Kiszka
        kvm_arch_reset_vcpu(env);
213 8d2ba1fb Jan Kiszka
    }
214 05330448 aliguori
err:
215 05330448 aliguori
    return ret;
216 05330448 aliguori
}
217 05330448 aliguori
218 5832d1f2 aliguori
/*
219 5832d1f2 aliguori
 * dirty pages logging control
220 5832d1f2 aliguori
 */
221 c227f099 Anthony Liguori
static int kvm_dirty_pages_log_change(target_phys_addr_t phys_addr,
222 c227f099 Anthony Liguori
                                      ram_addr_t size, int flags, int mask)
223 5832d1f2 aliguori
{
224 5832d1f2 aliguori
    KVMState *s = kvm_state;
225 d3f8d37f aliguori
    KVMSlot *mem = kvm_lookup_matching_slot(s, phys_addr, phys_addr + size);
226 4495d6a7 Jan Kiszka
    int old_flags;
227 4495d6a7 Jan Kiszka
228 5832d1f2 aliguori
    if (mem == NULL)  {
229 d3f8d37f aliguori
            fprintf(stderr, "BUG: %s: invalid parameters " TARGET_FMT_plx "-"
230 d3f8d37f aliguori
                    TARGET_FMT_plx "\n", __func__, phys_addr,
231 c227f099 Anthony Liguori
                    (target_phys_addr_t)(phys_addr + size - 1));
232 5832d1f2 aliguori
            return -EINVAL;
233 5832d1f2 aliguori
    }
234 5832d1f2 aliguori
235 4495d6a7 Jan Kiszka
    old_flags = mem->flags;
236 5832d1f2 aliguori
237 4495d6a7 Jan Kiszka
    flags = (mem->flags & ~mask) | flags;
238 5832d1f2 aliguori
    mem->flags = flags;
239 5832d1f2 aliguori
240 4495d6a7 Jan Kiszka
    /* If nothing changed effectively, no need to issue ioctl */
241 4495d6a7 Jan Kiszka
    if (s->migration_log) {
242 4495d6a7 Jan Kiszka
        flags |= KVM_MEM_LOG_DIRTY_PAGES;
243 4495d6a7 Jan Kiszka
    }
244 4495d6a7 Jan Kiszka
    if (flags == old_flags) {
245 4495d6a7 Jan Kiszka
            return 0;
246 4495d6a7 Jan Kiszka
    }
247 4495d6a7 Jan Kiszka
248 5832d1f2 aliguori
    return kvm_set_user_memory_region(s, mem);
249 5832d1f2 aliguori
}
250 5832d1f2 aliguori
251 c227f099 Anthony Liguori
int kvm_log_start(target_phys_addr_t phys_addr, ram_addr_t size)
252 5832d1f2 aliguori
{
253 d3f8d37f aliguori
        return kvm_dirty_pages_log_change(phys_addr, size,
254 5832d1f2 aliguori
                                          KVM_MEM_LOG_DIRTY_PAGES,
255 5832d1f2 aliguori
                                          KVM_MEM_LOG_DIRTY_PAGES);
256 5832d1f2 aliguori
}
257 5832d1f2 aliguori
258 c227f099 Anthony Liguori
int kvm_log_stop(target_phys_addr_t phys_addr, ram_addr_t size)
259 5832d1f2 aliguori
{
260 d3f8d37f aliguori
        return kvm_dirty_pages_log_change(phys_addr, size,
261 5832d1f2 aliguori
                                          0,
262 5832d1f2 aliguori
                                          KVM_MEM_LOG_DIRTY_PAGES);
263 5832d1f2 aliguori
}
264 5832d1f2 aliguori
265 7b8f3b78 Michael S. Tsirkin
static int kvm_set_migration_log(int enable)
266 4495d6a7 Jan Kiszka
{
267 4495d6a7 Jan Kiszka
    KVMState *s = kvm_state;
268 4495d6a7 Jan Kiszka
    KVMSlot *mem;
269 4495d6a7 Jan Kiszka
    int i, err;
270 4495d6a7 Jan Kiszka
271 4495d6a7 Jan Kiszka
    s->migration_log = enable;
272 4495d6a7 Jan Kiszka
273 4495d6a7 Jan Kiszka
    for (i = 0; i < ARRAY_SIZE(s->slots); i++) {
274 4495d6a7 Jan Kiszka
        mem = &s->slots[i];
275 4495d6a7 Jan Kiszka
276 4495d6a7 Jan Kiszka
        if (!!(mem->flags & KVM_MEM_LOG_DIRTY_PAGES) == enable) {
277 4495d6a7 Jan Kiszka
            continue;
278 4495d6a7 Jan Kiszka
        }
279 4495d6a7 Jan Kiszka
        err = kvm_set_user_memory_region(s, mem);
280 4495d6a7 Jan Kiszka
        if (err) {
281 4495d6a7 Jan Kiszka
            return err;
282 4495d6a7 Jan Kiszka
        }
283 4495d6a7 Jan Kiszka
    }
284 4495d6a7 Jan Kiszka
    return 0;
285 4495d6a7 Jan Kiszka
}
286 4495d6a7 Jan Kiszka
287 96c1606b Alexander Graf
static int test_le_bit(unsigned long nr, unsigned char *addr)
288 96c1606b Alexander Graf
{
289 96c1606b Alexander Graf
    return (addr[nr >> 3] >> (nr & 7)) & 1;
290 96c1606b Alexander Graf
}
291 96c1606b Alexander Graf
292 5832d1f2 aliguori
/**
293 5832d1f2 aliguori
 * kvm_physical_sync_dirty_bitmap - Grab dirty bitmap from kernel space
294 5832d1f2 aliguori
 * This function updates qemu's dirty bitmap using cpu_physical_memory_set_dirty().
295 5832d1f2 aliguori
 * This means all bits are set to dirty.
296 5832d1f2 aliguori
 *
297 d3f8d37f aliguori
 * @start_add: start of logged region.
298 5832d1f2 aliguori
 * @end_addr: end of logged region.
299 5832d1f2 aliguori
 */
300 7b8f3b78 Michael S. Tsirkin
static int kvm_physical_sync_dirty_bitmap(target_phys_addr_t start_addr,
301 7b8f3b78 Michael S. Tsirkin
                                          target_phys_addr_t end_addr)
302 5832d1f2 aliguori
{
303 5832d1f2 aliguori
    KVMState *s = kvm_state;
304 151f7749 Jan Kiszka
    unsigned long size, allocated_size = 0;
305 c227f099 Anthony Liguori
    target_phys_addr_t phys_addr;
306 c227f099 Anthony Liguori
    ram_addr_t addr;
307 151f7749 Jan Kiszka
    KVMDirtyLog d;
308 151f7749 Jan Kiszka
    KVMSlot *mem;
309 151f7749 Jan Kiszka
    int ret = 0;
310 5832d1f2 aliguori
311 151f7749 Jan Kiszka
    d.dirty_bitmap = NULL;
312 151f7749 Jan Kiszka
    while (start_addr < end_addr) {
313 151f7749 Jan Kiszka
        mem = kvm_lookup_overlapping_slot(s, start_addr, end_addr);
314 151f7749 Jan Kiszka
        if (mem == NULL) {
315 151f7749 Jan Kiszka
            break;
316 151f7749 Jan Kiszka
        }
317 5832d1f2 aliguori
318 151f7749 Jan Kiszka
        size = ((mem->memory_size >> TARGET_PAGE_BITS) + 7) / 8;
319 151f7749 Jan Kiszka
        if (!d.dirty_bitmap) {
320 151f7749 Jan Kiszka
            d.dirty_bitmap = qemu_malloc(size);
321 151f7749 Jan Kiszka
        } else if (size > allocated_size) {
322 151f7749 Jan Kiszka
            d.dirty_bitmap = qemu_realloc(d.dirty_bitmap, size);
323 151f7749 Jan Kiszka
        }
324 151f7749 Jan Kiszka
        allocated_size = size;
325 151f7749 Jan Kiszka
        memset(d.dirty_bitmap, 0, allocated_size);
326 5832d1f2 aliguori
327 151f7749 Jan Kiszka
        d.slot = mem->slot;
328 5832d1f2 aliguori
329 6e489f3f Anthony Liguori
        if (kvm_vm_ioctl(s, KVM_GET_DIRTY_LOG, &d) == -1) {
330 151f7749 Jan Kiszka
            dprintf("ioctl failed %d\n", errno);
331 151f7749 Jan Kiszka
            ret = -1;
332 151f7749 Jan Kiszka
            break;
333 151f7749 Jan Kiszka
        }
334 5832d1f2 aliguori
335 151f7749 Jan Kiszka
        for (phys_addr = mem->start_addr, addr = mem->phys_offset;
336 151f7749 Jan Kiszka
             phys_addr < mem->start_addr + mem->memory_size;
337 151f7749 Jan Kiszka
             phys_addr += TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
338 96c1606b Alexander Graf
            unsigned char *bitmap = (unsigned char *)d.dirty_bitmap;
339 151f7749 Jan Kiszka
            unsigned nr = (phys_addr - mem->start_addr) >> TARGET_PAGE_BITS;
340 151f7749 Jan Kiszka
341 96c1606b Alexander Graf
            if (test_le_bit(nr, bitmap)) {
342 151f7749 Jan Kiszka
                cpu_physical_memory_set_dirty(addr);
343 151f7749 Jan Kiszka
            }
344 151f7749 Jan Kiszka
        }
345 151f7749 Jan Kiszka
        start_addr = phys_addr;
346 5832d1f2 aliguori
    }
347 5832d1f2 aliguori
    qemu_free(d.dirty_bitmap);
348 151f7749 Jan Kiszka
349 151f7749 Jan Kiszka
    return ret;
350 5832d1f2 aliguori
}
351 5832d1f2 aliguori
352 c227f099 Anthony Liguori
int kvm_coalesce_mmio_region(target_phys_addr_t start, ram_addr_t size)
353 f65ed4c1 aliguori
{
354 f65ed4c1 aliguori
    int ret = -ENOSYS;
355 f65ed4c1 aliguori
#ifdef KVM_CAP_COALESCED_MMIO
356 f65ed4c1 aliguori
    KVMState *s = kvm_state;
357 f65ed4c1 aliguori
358 f65ed4c1 aliguori
    if (s->coalesced_mmio) {
359 f65ed4c1 aliguori
        struct kvm_coalesced_mmio_zone zone;
360 f65ed4c1 aliguori
361 f65ed4c1 aliguori
        zone.addr = start;
362 f65ed4c1 aliguori
        zone.size = size;
363 f65ed4c1 aliguori
364 f65ed4c1 aliguori
        ret = kvm_vm_ioctl(s, KVM_REGISTER_COALESCED_MMIO, &zone);
365 f65ed4c1 aliguori
    }
366 f65ed4c1 aliguori
#endif
367 f65ed4c1 aliguori
368 f65ed4c1 aliguori
    return ret;
369 f65ed4c1 aliguori
}
370 f65ed4c1 aliguori
371 c227f099 Anthony Liguori
int kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size)
372 f65ed4c1 aliguori
{
373 f65ed4c1 aliguori
    int ret = -ENOSYS;
374 f65ed4c1 aliguori
#ifdef KVM_CAP_COALESCED_MMIO
375 f65ed4c1 aliguori
    KVMState *s = kvm_state;
376 f65ed4c1 aliguori
377 f65ed4c1 aliguori
    if (s->coalesced_mmio) {
378 f65ed4c1 aliguori
        struct kvm_coalesced_mmio_zone zone;
379 f65ed4c1 aliguori
380 f65ed4c1 aliguori
        zone.addr = start;
381 f65ed4c1 aliguori
        zone.size = size;
382 f65ed4c1 aliguori
383 f65ed4c1 aliguori
        ret = kvm_vm_ioctl(s, KVM_UNREGISTER_COALESCED_MMIO, &zone);
384 f65ed4c1 aliguori
    }
385 f65ed4c1 aliguori
#endif
386 f65ed4c1 aliguori
387 f65ed4c1 aliguori
    return ret;
388 f65ed4c1 aliguori
}
389 f65ed4c1 aliguori
390 ad7b8b33 Anthony Liguori
int kvm_check_extension(KVMState *s, unsigned int extension)
391 ad7b8b33 Anthony Liguori
{
392 ad7b8b33 Anthony Liguori
    int ret;
393 ad7b8b33 Anthony Liguori
394 ad7b8b33 Anthony Liguori
    ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, extension);
395 ad7b8b33 Anthony Liguori
    if (ret < 0) {
396 ad7b8b33 Anthony Liguori
        ret = 0;
397 ad7b8b33 Anthony Liguori
    }
398 ad7b8b33 Anthony Liguori
399 ad7b8b33 Anthony Liguori
    return ret;
400 ad7b8b33 Anthony Liguori
}
401 ad7b8b33 Anthony Liguori
402 7b8f3b78 Michael S. Tsirkin
static void kvm_set_phys_mem(target_phys_addr_t start_addr,
403 7b8f3b78 Michael S. Tsirkin
                             ram_addr_t size,
404 7b8f3b78 Michael S. Tsirkin
                             ram_addr_t phys_offset)
405 46dbef6a Michael S. Tsirkin
{
406 46dbef6a Michael S. Tsirkin
    KVMState *s = kvm_state;
407 46dbef6a Michael S. Tsirkin
    ram_addr_t flags = phys_offset & ~TARGET_PAGE_MASK;
408 46dbef6a Michael S. Tsirkin
    KVMSlot *mem, old;
409 46dbef6a Michael S. Tsirkin
    int err;
410 46dbef6a Michael S. Tsirkin
411 46dbef6a Michael S. Tsirkin
    if (start_addr & ~TARGET_PAGE_MASK) {
412 46dbef6a Michael S. Tsirkin
        if (flags >= IO_MEM_UNASSIGNED) {
413 46dbef6a Michael S. Tsirkin
            if (!kvm_lookup_overlapping_slot(s, start_addr,
414 46dbef6a Michael S. Tsirkin
                                             start_addr + size)) {
415 46dbef6a Michael S. Tsirkin
                return;
416 46dbef6a Michael S. Tsirkin
            }
417 46dbef6a Michael S. Tsirkin
            fprintf(stderr, "Unaligned split of a KVM memory slot\n");
418 46dbef6a Michael S. Tsirkin
        } else {
419 46dbef6a Michael S. Tsirkin
            fprintf(stderr, "Only page-aligned memory slots supported\n");
420 46dbef6a Michael S. Tsirkin
        }
421 46dbef6a Michael S. Tsirkin
        abort();
422 46dbef6a Michael S. Tsirkin
    }
423 46dbef6a Michael S. Tsirkin
424 46dbef6a Michael S. Tsirkin
    /* KVM does not support read-only slots */
425 46dbef6a Michael S. Tsirkin
    phys_offset &= ~IO_MEM_ROM;
426 46dbef6a Michael S. Tsirkin
427 46dbef6a Michael S. Tsirkin
    while (1) {
428 46dbef6a Michael S. Tsirkin
        mem = kvm_lookup_overlapping_slot(s, start_addr, start_addr + size);
429 46dbef6a Michael S. Tsirkin
        if (!mem) {
430 46dbef6a Michael S. Tsirkin
            break;
431 46dbef6a Michael S. Tsirkin
        }
432 46dbef6a Michael S. Tsirkin
433 46dbef6a Michael S. Tsirkin
        if (flags < IO_MEM_UNASSIGNED && start_addr >= mem->start_addr &&
434 46dbef6a Michael S. Tsirkin
            (start_addr + size <= mem->start_addr + mem->memory_size) &&
435 46dbef6a Michael S. Tsirkin
            (phys_offset - start_addr == mem->phys_offset - mem->start_addr)) {
436 46dbef6a Michael S. Tsirkin
            /* The new slot fits into the existing one and comes with
437 46dbef6a Michael S. Tsirkin
             * identical parameters - nothing to be done. */
438 46dbef6a Michael S. Tsirkin
            return;
439 46dbef6a Michael S. Tsirkin
        }
440 46dbef6a Michael S. Tsirkin
441 46dbef6a Michael S. Tsirkin
        old = *mem;
442 46dbef6a Michael S. Tsirkin
443 46dbef6a Michael S. Tsirkin
        /* unregister the overlapping slot */
444 46dbef6a Michael S. Tsirkin
        mem->memory_size = 0;
445 46dbef6a Michael S. Tsirkin
        err = kvm_set_user_memory_region(s, mem);
446 46dbef6a Michael S. Tsirkin
        if (err) {
447 46dbef6a Michael S. Tsirkin
            fprintf(stderr, "%s: error unregistering overlapping slot: %s\n",
448 46dbef6a Michael S. Tsirkin
                    __func__, strerror(-err));
449 46dbef6a Michael S. Tsirkin
            abort();
450 46dbef6a Michael S. Tsirkin
        }
451 46dbef6a Michael S. Tsirkin
452 46dbef6a Michael S. Tsirkin
        /* Workaround for older KVM versions: we can't join slots, even not by
453 46dbef6a Michael S. Tsirkin
         * unregistering the previous ones and then registering the larger
454 46dbef6a Michael S. Tsirkin
         * slot. We have to maintain the existing fragmentation. Sigh.
455 46dbef6a Michael S. Tsirkin
         *
456 46dbef6a Michael S. Tsirkin
         * This workaround assumes that the new slot starts at the same
457 46dbef6a Michael S. Tsirkin
         * address as the first existing one. If not or if some overlapping
458 46dbef6a Michael S. Tsirkin
         * slot comes around later, we will fail (not seen in practice so far)
459 46dbef6a Michael S. Tsirkin
         * - and actually require a recent KVM version. */
460 46dbef6a Michael S. Tsirkin
        if (s->broken_set_mem_region &&
461 46dbef6a Michael S. Tsirkin
            old.start_addr == start_addr && old.memory_size < size &&
462 46dbef6a Michael S. Tsirkin
            flags < IO_MEM_UNASSIGNED) {
463 46dbef6a Michael S. Tsirkin
            mem = kvm_alloc_slot(s);
464 46dbef6a Michael S. Tsirkin
            mem->memory_size = old.memory_size;
465 46dbef6a Michael S. Tsirkin
            mem->start_addr = old.start_addr;
466 46dbef6a Michael S. Tsirkin
            mem->phys_offset = old.phys_offset;
467 46dbef6a Michael S. Tsirkin
            mem->flags = 0;
468 46dbef6a Michael S. Tsirkin
469 46dbef6a Michael S. Tsirkin
            err = kvm_set_user_memory_region(s, mem);
470 46dbef6a Michael S. Tsirkin
            if (err) {
471 46dbef6a Michael S. Tsirkin
                fprintf(stderr, "%s: error updating slot: %s\n", __func__,
472 46dbef6a Michael S. Tsirkin
                        strerror(-err));
473 46dbef6a Michael S. Tsirkin
                abort();
474 46dbef6a Michael S. Tsirkin
            }
475 46dbef6a Michael S. Tsirkin
476 46dbef6a Michael S. Tsirkin
            start_addr += old.memory_size;
477 46dbef6a Michael S. Tsirkin
            phys_offset += old.memory_size;
478 46dbef6a Michael S. Tsirkin
            size -= old.memory_size;
479 46dbef6a Michael S. Tsirkin
            continue;
480 46dbef6a Michael S. Tsirkin
        }
481 46dbef6a Michael S. Tsirkin
482 46dbef6a Michael S. Tsirkin
        /* register prefix slot */
483 46dbef6a Michael S. Tsirkin
        if (old.start_addr < start_addr) {
484 46dbef6a Michael S. Tsirkin
            mem = kvm_alloc_slot(s);
485 46dbef6a Michael S. Tsirkin
            mem->memory_size = start_addr - old.start_addr;
486 46dbef6a Michael S. Tsirkin
            mem->start_addr = old.start_addr;
487 46dbef6a Michael S. Tsirkin
            mem->phys_offset = old.phys_offset;
488 46dbef6a Michael S. Tsirkin
            mem->flags = 0;
489 46dbef6a Michael S. Tsirkin
490 46dbef6a Michael S. Tsirkin
            err = kvm_set_user_memory_region(s, mem);
491 46dbef6a Michael S. Tsirkin
            if (err) {
492 46dbef6a Michael S. Tsirkin
                fprintf(stderr, "%s: error registering prefix slot: %s\n",
493 46dbef6a Michael S. Tsirkin
                        __func__, strerror(-err));
494 46dbef6a Michael S. Tsirkin
                abort();
495 46dbef6a Michael S. Tsirkin
            }
496 46dbef6a Michael S. Tsirkin
        }
497 46dbef6a Michael S. Tsirkin
498 46dbef6a Michael S. Tsirkin
        /* register suffix slot */
499 46dbef6a Michael S. Tsirkin
        if (old.start_addr + old.memory_size > start_addr + size) {
500 46dbef6a Michael S. Tsirkin
            ram_addr_t size_delta;
501 46dbef6a Michael S. Tsirkin
502 46dbef6a Michael S. Tsirkin
            mem = kvm_alloc_slot(s);
503 46dbef6a Michael S. Tsirkin
            mem->start_addr = start_addr + size;
504 46dbef6a Michael S. Tsirkin
            size_delta = mem->start_addr - old.start_addr;
505 46dbef6a Michael S. Tsirkin
            mem->memory_size = old.memory_size - size_delta;
506 46dbef6a Michael S. Tsirkin
            mem->phys_offset = old.phys_offset + size_delta;
507 46dbef6a Michael S. Tsirkin
            mem->flags = 0;
508 46dbef6a Michael S. Tsirkin
509 46dbef6a Michael S. Tsirkin
            err = kvm_set_user_memory_region(s, mem);
510 46dbef6a Michael S. Tsirkin
            if (err) {
511 46dbef6a Michael S. Tsirkin
                fprintf(stderr, "%s: error registering suffix slot: %s\n",
512 46dbef6a Michael S. Tsirkin
                        __func__, strerror(-err));
513 46dbef6a Michael S. Tsirkin
                abort();
514 46dbef6a Michael S. Tsirkin
            }
515 46dbef6a Michael S. Tsirkin
        }
516 46dbef6a Michael S. Tsirkin
    }
517 46dbef6a Michael S. Tsirkin
518 46dbef6a Michael S. Tsirkin
    /* in case the KVM bug workaround already "consumed" the new slot */
519 46dbef6a Michael S. Tsirkin
    if (!size)
520 46dbef6a Michael S. Tsirkin
        return;
521 46dbef6a Michael S. Tsirkin
522 46dbef6a Michael S. Tsirkin
    /* KVM does not need to know about this memory */
523 46dbef6a Michael S. Tsirkin
    if (flags >= IO_MEM_UNASSIGNED)
524 46dbef6a Michael S. Tsirkin
        return;
525 46dbef6a Michael S. Tsirkin
526 46dbef6a Michael S. Tsirkin
    mem = kvm_alloc_slot(s);
527 46dbef6a Michael S. Tsirkin
    mem->memory_size = size;
528 46dbef6a Michael S. Tsirkin
    mem->start_addr = start_addr;
529 46dbef6a Michael S. Tsirkin
    mem->phys_offset = phys_offset;
530 46dbef6a Michael S. Tsirkin
    mem->flags = 0;
531 46dbef6a Michael S. Tsirkin
532 46dbef6a Michael S. Tsirkin
    err = kvm_set_user_memory_region(s, mem);
533 46dbef6a Michael S. Tsirkin
    if (err) {
534 46dbef6a Michael S. Tsirkin
        fprintf(stderr, "%s: error registering slot: %s\n", __func__,
535 46dbef6a Michael S. Tsirkin
                strerror(-err));
536 46dbef6a Michael S. Tsirkin
        abort();
537 46dbef6a Michael S. Tsirkin
    }
538 46dbef6a Michael S. Tsirkin
}
539 46dbef6a Michael S. Tsirkin
540 7b8f3b78 Michael S. Tsirkin
static void kvm_client_set_memory(struct CPUPhysMemoryClient *client,
541 7b8f3b78 Michael S. Tsirkin
                                  target_phys_addr_t start_addr,
542 7b8f3b78 Michael S. Tsirkin
                                  ram_addr_t size,
543 7b8f3b78 Michael S. Tsirkin
                                  ram_addr_t phys_offset)
544 7b8f3b78 Michael S. Tsirkin
{
545 7b8f3b78 Michael S. Tsirkin
        kvm_set_phys_mem(start_addr, size, phys_offset);
546 7b8f3b78 Michael S. Tsirkin
}
547 7b8f3b78 Michael S. Tsirkin
548 7b8f3b78 Michael S. Tsirkin
static int kvm_client_sync_dirty_bitmap(struct CPUPhysMemoryClient *client,
549 7b8f3b78 Michael S. Tsirkin
                                        target_phys_addr_t start_addr,
550 7b8f3b78 Michael S. Tsirkin
                                        target_phys_addr_t end_addr)
551 7b8f3b78 Michael S. Tsirkin
{
552 7b8f3b78 Michael S. Tsirkin
        return kvm_physical_sync_dirty_bitmap(start_addr, end_addr);
553 7b8f3b78 Michael S. Tsirkin
}
554 7b8f3b78 Michael S. Tsirkin
555 7b8f3b78 Michael S. Tsirkin
static int kvm_client_migration_log(struct CPUPhysMemoryClient *client,
556 7b8f3b78 Michael S. Tsirkin
                                    int enable)
557 7b8f3b78 Michael S. Tsirkin
{
558 7b8f3b78 Michael S. Tsirkin
        return kvm_set_migration_log(enable);
559 7b8f3b78 Michael S. Tsirkin
}
560 7b8f3b78 Michael S. Tsirkin
561 7b8f3b78 Michael S. Tsirkin
static CPUPhysMemoryClient kvm_cpu_phys_memory_client = {
562 7b8f3b78 Michael S. Tsirkin
        .set_memory = kvm_client_set_memory,
563 7b8f3b78 Michael S. Tsirkin
        .sync_dirty_bitmap = kvm_client_sync_dirty_bitmap,
564 7b8f3b78 Michael S. Tsirkin
        .migration_log = kvm_client_migration_log,
565 7b8f3b78 Michael S. Tsirkin
};
566 7b8f3b78 Michael S. Tsirkin
567 05330448 aliguori
int kvm_init(int smp_cpus)
568 05330448 aliguori
{
569 168ccc11 Jan Kiszka
    static const char upgrade_note[] =
570 168ccc11 Jan Kiszka
        "Please upgrade to at least kernel 2.6.29 or recent kvm-kmod\n"
571 168ccc11 Jan Kiszka
        "(see http://sourceforge.net/projects/kvm).\n";
572 05330448 aliguori
    KVMState *s;
573 05330448 aliguori
    int ret;
574 05330448 aliguori
    int i;
575 05330448 aliguori
576 9f8fd694 Mark McLoughlin
    if (smp_cpus > 1) {
577 9f8fd694 Mark McLoughlin
        fprintf(stderr, "No SMP KVM support, use '-smp 1'\n");
578 05330448 aliguori
        return -EINVAL;
579 9f8fd694 Mark McLoughlin
    }
580 05330448 aliguori
581 05330448 aliguori
    s = qemu_mallocz(sizeof(KVMState));
582 05330448 aliguori
583 e22a25c9 aliguori
#ifdef KVM_CAP_SET_GUEST_DEBUG
584 72cf2d4f Blue Swirl
    QTAILQ_INIT(&s->kvm_sw_breakpoints);
585 e22a25c9 aliguori
#endif
586 05330448 aliguori
    for (i = 0; i < ARRAY_SIZE(s->slots); i++)
587 05330448 aliguori
        s->slots[i].slot = i;
588 05330448 aliguori
589 05330448 aliguori
    s->vmfd = -1;
590 40ff6d7e Kevin Wolf
    s->fd = qemu_open("/dev/kvm", O_RDWR);
591 05330448 aliguori
    if (s->fd == -1) {
592 05330448 aliguori
        fprintf(stderr, "Could not access KVM kernel module: %m\n");
593 05330448 aliguori
        ret = -errno;
594 05330448 aliguori
        goto err;
595 05330448 aliguori
    }
596 05330448 aliguori
597 05330448 aliguori
    ret = kvm_ioctl(s, KVM_GET_API_VERSION, 0);
598 05330448 aliguori
    if (ret < KVM_API_VERSION) {
599 05330448 aliguori
        if (ret > 0)
600 05330448 aliguori
            ret = -EINVAL;
601 05330448 aliguori
        fprintf(stderr, "kvm version too old\n");
602 05330448 aliguori
        goto err;
603 05330448 aliguori
    }
604 05330448 aliguori
605 05330448 aliguori
    if (ret > KVM_API_VERSION) {
606 05330448 aliguori
        ret = -EINVAL;
607 05330448 aliguori
        fprintf(stderr, "kvm version not supported\n");
608 05330448 aliguori
        goto err;
609 05330448 aliguori
    }
610 05330448 aliguori
611 05330448 aliguori
    s->vmfd = kvm_ioctl(s, KVM_CREATE_VM, 0);
612 05330448 aliguori
    if (s->vmfd < 0)
613 05330448 aliguori
        goto err;
614 05330448 aliguori
615 05330448 aliguori
    /* initially, KVM allocated its own memory and we had to jump through
616 05330448 aliguori
     * hooks to make phys_ram_base point to this.  Modern versions of KVM
617 5579c7f3 pbrook
     * just use a user allocated buffer so we can use regular pages
618 05330448 aliguori
     * unmodified.  Make sure we have a sufficiently modern version of KVM.
619 05330448 aliguori
     */
620 ad7b8b33 Anthony Liguori
    if (!kvm_check_extension(s, KVM_CAP_USER_MEMORY)) {
621 ad7b8b33 Anthony Liguori
        ret = -EINVAL;
622 168ccc11 Jan Kiszka
        fprintf(stderr, "kvm does not support KVM_CAP_USER_MEMORY\n%s",
623 168ccc11 Jan Kiszka
                upgrade_note);
624 05330448 aliguori
        goto err;
625 05330448 aliguori
    }
626 05330448 aliguori
627 d85dc283 aliguori
    /* There was a nasty bug in < kvm-80 that prevents memory slots from being
628 d85dc283 aliguori
     * destroyed properly.  Since we rely on this capability, refuse to work
629 d85dc283 aliguori
     * with any kernel without this capability. */
630 ad7b8b33 Anthony Liguori
    if (!kvm_check_extension(s, KVM_CAP_DESTROY_MEMORY_REGION_WORKS)) {
631 ad7b8b33 Anthony Liguori
        ret = -EINVAL;
632 d85dc283 aliguori
633 d85dc283 aliguori
        fprintf(stderr,
634 168ccc11 Jan Kiszka
                "KVM kernel module broken (DESTROY_MEMORY_REGION).\n%s",
635 168ccc11 Jan Kiszka
                upgrade_note);
636 d85dc283 aliguori
        goto err;
637 d85dc283 aliguori
    }
638 d85dc283 aliguori
639 62a2744c Sheng Yang
    s->coalesced_mmio = 0;
640 f65ed4c1 aliguori
#ifdef KVM_CAP_COALESCED_MMIO
641 ad7b8b33 Anthony Liguori
    s->coalesced_mmio = kvm_check_extension(s, KVM_CAP_COALESCED_MMIO);
642 62a2744c Sheng Yang
    s->coalesced_mmio_ring = NULL;
643 f65ed4c1 aliguori
#endif
644 f65ed4c1 aliguori
645 e69917e2 Jan Kiszka
    s->broken_set_mem_region = 1;
646 e69917e2 Jan Kiszka
#ifdef KVM_CAP_JOIN_MEMORY_REGIONS_WORKS
647 e69917e2 Jan Kiszka
    ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_JOIN_MEMORY_REGIONS_WORKS);
648 e69917e2 Jan Kiszka
    if (ret > 0) {
649 e69917e2 Jan Kiszka
        s->broken_set_mem_region = 0;
650 e69917e2 Jan Kiszka
    }
651 e69917e2 Jan Kiszka
#endif
652 e69917e2 Jan Kiszka
653 a0fb002c Jan Kiszka
    s->vcpu_events = 0;
654 a0fb002c Jan Kiszka
#ifdef KVM_CAP_VCPU_EVENTS
655 a0fb002c Jan Kiszka
    s->vcpu_events = kvm_check_extension(s, KVM_CAP_VCPU_EVENTS);
656 a0fb002c Jan Kiszka
#endif
657 a0fb002c Jan Kiszka
658 b0b1d690 Jan Kiszka
    s->robust_singlestep = 0;
659 b0b1d690 Jan Kiszka
#ifdef KVM_CAP_X86_ROBUST_SINGLESTEP
660 b0b1d690 Jan Kiszka
    s->robust_singlestep =
661 b0b1d690 Jan Kiszka
        kvm_check_extension(s, KVM_CAP_X86_ROBUST_SINGLESTEP);
662 b0b1d690 Jan Kiszka
#endif
663 b0b1d690 Jan Kiszka
664 05330448 aliguori
    ret = kvm_arch_init(s, smp_cpus);
665 05330448 aliguori
    if (ret < 0)
666 05330448 aliguori
        goto err;
667 05330448 aliguori
668 05330448 aliguori
    kvm_state = s;
669 7b8f3b78 Michael S. Tsirkin
    cpu_register_phys_memory_client(&kvm_cpu_phys_memory_client);
670 05330448 aliguori
671 05330448 aliguori
    return 0;
672 05330448 aliguori
673 05330448 aliguori
err:
674 05330448 aliguori
    if (s) {
675 05330448 aliguori
        if (s->vmfd != -1)
676 05330448 aliguori
            close(s->vmfd);
677 05330448 aliguori
        if (s->fd != -1)
678 05330448 aliguori
            close(s->fd);
679 05330448 aliguori
    }
680 05330448 aliguori
    qemu_free(s);
681 05330448 aliguori
682 05330448 aliguori
    return ret;
683 05330448 aliguori
}
684 05330448 aliguori
685 afcea8cb Blue Swirl
static int kvm_handle_io(uint16_t port, void *data, int direction, int size,
686 afcea8cb Blue Swirl
                         uint32_t count)
687 05330448 aliguori
{
688 05330448 aliguori
    int i;
689 05330448 aliguori
    uint8_t *ptr = data;
690 05330448 aliguori
691 05330448 aliguori
    for (i = 0; i < count; i++) {
692 05330448 aliguori
        if (direction == KVM_EXIT_IO_IN) {
693 05330448 aliguori
            switch (size) {
694 05330448 aliguori
            case 1:
695 afcea8cb Blue Swirl
                stb_p(ptr, cpu_inb(port));
696 05330448 aliguori
                break;
697 05330448 aliguori
            case 2:
698 afcea8cb Blue Swirl
                stw_p(ptr, cpu_inw(port));
699 05330448 aliguori
                break;
700 05330448 aliguori
            case 4:
701 afcea8cb Blue Swirl
                stl_p(ptr, cpu_inl(port));
702 05330448 aliguori
                break;
703 05330448 aliguori
            }
704 05330448 aliguori
        } else {
705 05330448 aliguori
            switch (size) {
706 05330448 aliguori
            case 1:
707 afcea8cb Blue Swirl
                cpu_outb(port, ldub_p(ptr));
708 05330448 aliguori
                break;
709 05330448 aliguori
            case 2:
710 afcea8cb Blue Swirl
                cpu_outw(port, lduw_p(ptr));
711 05330448 aliguori
                break;
712 05330448 aliguori
            case 4:
713 afcea8cb Blue Swirl
                cpu_outl(port, ldl_p(ptr));
714 05330448 aliguori
                break;
715 05330448 aliguori
            }
716 05330448 aliguori
        }
717 05330448 aliguori
718 05330448 aliguori
        ptr += size;
719 05330448 aliguori
    }
720 05330448 aliguori
721 05330448 aliguori
    return 1;
722 05330448 aliguori
}
723 05330448 aliguori
724 62a2744c Sheng Yang
void kvm_flush_coalesced_mmio_buffer(void)
725 f65ed4c1 aliguori
{
726 f65ed4c1 aliguori
#ifdef KVM_CAP_COALESCED_MMIO
727 f65ed4c1 aliguori
    KVMState *s = kvm_state;
728 62a2744c Sheng Yang
    if (s->coalesced_mmio_ring) {
729 62a2744c Sheng Yang
        struct kvm_coalesced_mmio_ring *ring = s->coalesced_mmio_ring;
730 f65ed4c1 aliguori
        while (ring->first != ring->last) {
731 f65ed4c1 aliguori
            struct kvm_coalesced_mmio *ent;
732 f65ed4c1 aliguori
733 f65ed4c1 aliguori
            ent = &ring->coalesced_mmio[ring->first];
734 f65ed4c1 aliguori
735 f65ed4c1 aliguori
            cpu_physical_memory_write(ent->phys_addr, ent->data, ent->len);
736 85199474 Marcelo Tosatti
            smp_wmb();
737 f65ed4c1 aliguori
            ring->first = (ring->first + 1) % KVM_COALESCED_MMIO_MAX;
738 f65ed4c1 aliguori
        }
739 f65ed4c1 aliguori
    }
740 f65ed4c1 aliguori
#endif
741 f65ed4c1 aliguori
}
742 f65ed4c1 aliguori
743 4c0960c0 Avi Kivity
void kvm_cpu_synchronize_state(CPUState *env)
744 4c0960c0 Avi Kivity
{
745 9ded2744 Jan Kiszka
    if (!env->kvm_vcpu_dirty) {
746 4c0960c0 Avi Kivity
        kvm_arch_get_registers(env);
747 9ded2744 Jan Kiszka
        env->kvm_vcpu_dirty = 1;
748 4c0960c0 Avi Kivity
    }
749 4c0960c0 Avi Kivity
}
750 4c0960c0 Avi Kivity
751 ea375f9a Jan Kiszka
void kvm_cpu_synchronize_post_reset(CPUState *env)
752 ea375f9a Jan Kiszka
{
753 ea375f9a Jan Kiszka
    kvm_arch_put_registers(env, KVM_PUT_RESET_STATE);
754 ea375f9a Jan Kiszka
    env->kvm_vcpu_dirty = 0;
755 ea375f9a Jan Kiszka
}
756 ea375f9a Jan Kiszka
757 ea375f9a Jan Kiszka
void kvm_cpu_synchronize_post_init(CPUState *env)
758 ea375f9a Jan Kiszka
{
759 ea375f9a Jan Kiszka
    kvm_arch_put_registers(env, KVM_PUT_FULL_STATE);
760 ea375f9a Jan Kiszka
    env->kvm_vcpu_dirty = 0;
761 ea375f9a Jan Kiszka
}
762 ea375f9a Jan Kiszka
763 05330448 aliguori
int kvm_cpu_exec(CPUState *env)
764 05330448 aliguori
{
765 05330448 aliguori
    struct kvm_run *run = env->kvm_run;
766 05330448 aliguori
    int ret;
767 05330448 aliguori
768 05330448 aliguori
    dprintf("kvm_cpu_exec()\n");
769 05330448 aliguori
770 05330448 aliguori
    do {
771 6312b928 Marcelo Tosatti
#ifndef CONFIG_IOTHREAD
772 be214e6c aurel32
        if (env->exit_request) {
773 05330448 aliguori
            dprintf("interrupt exit requested\n");
774 05330448 aliguori
            ret = 0;
775 05330448 aliguori
            break;
776 05330448 aliguori
        }
777 6312b928 Marcelo Tosatti
#endif
778 05330448 aliguori
779 9ded2744 Jan Kiszka
        if (env->kvm_vcpu_dirty) {
780 ea375f9a Jan Kiszka
            kvm_arch_put_registers(env, KVM_PUT_RUNTIME_STATE);
781 9ded2744 Jan Kiszka
            env->kvm_vcpu_dirty = 0;
782 4c0960c0 Avi Kivity
        }
783 4c0960c0 Avi Kivity
784 8c14c173 Jan Kiszka
        kvm_arch_pre_run(env, run);
785 d549db5a Glauber Costa
        qemu_mutex_unlock_iothread();
786 05330448 aliguori
        ret = kvm_vcpu_ioctl(env, KVM_RUN, 0);
787 d549db5a Glauber Costa
        qemu_mutex_lock_iothread();
788 05330448 aliguori
        kvm_arch_post_run(env, run);
789 05330448 aliguori
790 05330448 aliguori
        if (ret == -EINTR || ret == -EAGAIN) {
791 cc84de95 Marcelo Tosatti
            cpu_exit(env);
792 05330448 aliguori
            dprintf("io window exit\n");
793 05330448 aliguori
            ret = 0;
794 05330448 aliguori
            break;
795 05330448 aliguori
        }
796 05330448 aliguori
797 05330448 aliguori
        if (ret < 0) {
798 05330448 aliguori
            dprintf("kvm run failed %s\n", strerror(-ret));
799 05330448 aliguori
            abort();
800 05330448 aliguori
        }
801 05330448 aliguori
802 62a2744c Sheng Yang
        kvm_flush_coalesced_mmio_buffer();
803 f65ed4c1 aliguori
804 05330448 aliguori
        ret = 0; /* exit loop */
805 05330448 aliguori
        switch (run->exit_reason) {
806 05330448 aliguori
        case KVM_EXIT_IO:
807 05330448 aliguori
            dprintf("handle_io\n");
808 afcea8cb Blue Swirl
            ret = kvm_handle_io(run->io.port,
809 05330448 aliguori
                                (uint8_t *)run + run->io.data_offset,
810 05330448 aliguori
                                run->io.direction,
811 05330448 aliguori
                                run->io.size,
812 05330448 aliguori
                                run->io.count);
813 05330448 aliguori
            break;
814 05330448 aliguori
        case KVM_EXIT_MMIO:
815 05330448 aliguori
            dprintf("handle_mmio\n");
816 05330448 aliguori
            cpu_physical_memory_rw(run->mmio.phys_addr,
817 05330448 aliguori
                                   run->mmio.data,
818 05330448 aliguori
                                   run->mmio.len,
819 05330448 aliguori
                                   run->mmio.is_write);
820 05330448 aliguori
            ret = 1;
821 05330448 aliguori
            break;
822 05330448 aliguori
        case KVM_EXIT_IRQ_WINDOW_OPEN:
823 05330448 aliguori
            dprintf("irq_window_open\n");
824 05330448 aliguori
            break;
825 05330448 aliguori
        case KVM_EXIT_SHUTDOWN:
826 05330448 aliguori
            dprintf("shutdown\n");
827 05330448 aliguori
            qemu_system_reset_request();
828 05330448 aliguori
            ret = 1;
829 05330448 aliguori
            break;
830 05330448 aliguori
        case KVM_EXIT_UNKNOWN:
831 05330448 aliguori
            dprintf("kvm_exit_unknown\n");
832 05330448 aliguori
            break;
833 05330448 aliguori
        case KVM_EXIT_FAIL_ENTRY:
834 05330448 aliguori
            dprintf("kvm_exit_fail_entry\n");
835 05330448 aliguori
            break;
836 05330448 aliguori
        case KVM_EXIT_EXCEPTION:
837 05330448 aliguori
            dprintf("kvm_exit_exception\n");
838 05330448 aliguori
            break;
839 05330448 aliguori
        case KVM_EXIT_DEBUG:
840 05330448 aliguori
            dprintf("kvm_exit_debug\n");
841 e22a25c9 aliguori
#ifdef KVM_CAP_SET_GUEST_DEBUG
842 e22a25c9 aliguori
            if (kvm_arch_debug(&run->debug.arch)) {
843 e22a25c9 aliguori
                gdb_set_stop_cpu(env);
844 e22a25c9 aliguori
                vm_stop(EXCP_DEBUG);
845 e22a25c9 aliguori
                env->exception_index = EXCP_DEBUG;
846 e22a25c9 aliguori
                return 0;
847 e22a25c9 aliguori
            }
848 e22a25c9 aliguori
            /* re-enter, this exception was guest-internal */
849 e22a25c9 aliguori
            ret = 1;
850 e22a25c9 aliguori
#endif /* KVM_CAP_SET_GUEST_DEBUG */
851 05330448 aliguori
            break;
852 05330448 aliguori
        default:
853 05330448 aliguori
            dprintf("kvm_arch_handle_exit\n");
854 05330448 aliguori
            ret = kvm_arch_handle_exit(env, run);
855 05330448 aliguori
            break;
856 05330448 aliguori
        }
857 05330448 aliguori
    } while (ret > 0);
858 05330448 aliguori
859 be214e6c aurel32
    if (env->exit_request) {
860 be214e6c aurel32
        env->exit_request = 0;
861 becfc390 aliguori
        env->exception_index = EXCP_INTERRUPT;
862 becfc390 aliguori
    }
863 becfc390 aliguori
864 05330448 aliguori
    return ret;
865 05330448 aliguori
}
866 05330448 aliguori
867 984b5181 aliguori
int kvm_ioctl(KVMState *s, int type, ...)
868 05330448 aliguori
{
869 05330448 aliguori
    int ret;
870 984b5181 aliguori
    void *arg;
871 984b5181 aliguori
    va_list ap;
872 05330448 aliguori
873 984b5181 aliguori
    va_start(ap, type);
874 984b5181 aliguori
    arg = va_arg(ap, void *);
875 984b5181 aliguori
    va_end(ap);
876 984b5181 aliguori
877 984b5181 aliguori
    ret = ioctl(s->fd, type, arg);
878 05330448 aliguori
    if (ret == -1)
879 05330448 aliguori
        ret = -errno;
880 05330448 aliguori
881 05330448 aliguori
    return ret;
882 05330448 aliguori
}
883 05330448 aliguori
884 984b5181 aliguori
int kvm_vm_ioctl(KVMState *s, int type, ...)
885 05330448 aliguori
{
886 05330448 aliguori
    int ret;
887 984b5181 aliguori
    void *arg;
888 984b5181 aliguori
    va_list ap;
889 984b5181 aliguori
890 984b5181 aliguori
    va_start(ap, type);
891 984b5181 aliguori
    arg = va_arg(ap, void *);
892 984b5181 aliguori
    va_end(ap);
893 05330448 aliguori
894 984b5181 aliguori
    ret = ioctl(s->vmfd, type, arg);
895 05330448 aliguori
    if (ret == -1)
896 05330448 aliguori
        ret = -errno;
897 05330448 aliguori
898 05330448 aliguori
    return ret;
899 05330448 aliguori
}
900 05330448 aliguori
901 984b5181 aliguori
int kvm_vcpu_ioctl(CPUState *env, int type, ...)
902 05330448 aliguori
{
903 05330448 aliguori
    int ret;
904 984b5181 aliguori
    void *arg;
905 984b5181 aliguori
    va_list ap;
906 984b5181 aliguori
907 984b5181 aliguori
    va_start(ap, type);
908 984b5181 aliguori
    arg = va_arg(ap, void *);
909 984b5181 aliguori
    va_end(ap);
910 05330448 aliguori
911 984b5181 aliguori
    ret = ioctl(env->kvm_fd, type, arg);
912 05330448 aliguori
    if (ret == -1)
913 05330448 aliguori
        ret = -errno;
914 05330448 aliguori
915 05330448 aliguori
    return ret;
916 05330448 aliguori
}
917 bd322087 aliguori
918 bd322087 aliguori
int kvm_has_sync_mmu(void)
919 bd322087 aliguori
{
920 a9c11522 aurel32
#ifdef KVM_CAP_SYNC_MMU
921 bd322087 aliguori
    KVMState *s = kvm_state;
922 bd322087 aliguori
923 ad7b8b33 Anthony Liguori
    return kvm_check_extension(s, KVM_CAP_SYNC_MMU);
924 ad7b8b33 Anthony Liguori
#else
925 bd322087 aliguori
    return 0;
926 ad7b8b33 Anthony Liguori
#endif
927 bd322087 aliguori
}
928 e22a25c9 aliguori
929 a0fb002c Jan Kiszka
int kvm_has_vcpu_events(void)
930 a0fb002c Jan Kiszka
{
931 a0fb002c Jan Kiszka
    return kvm_state->vcpu_events;
932 a0fb002c Jan Kiszka
}
933 a0fb002c Jan Kiszka
934 b0b1d690 Jan Kiszka
int kvm_has_robust_singlestep(void)
935 b0b1d690 Jan Kiszka
{
936 b0b1d690 Jan Kiszka
    return kvm_state->robust_singlestep;
937 b0b1d690 Jan Kiszka
}
938 b0b1d690 Jan Kiszka
939 6f0437e8 Jan Kiszka
void kvm_setup_guest_memory(void *start, size_t size)
940 6f0437e8 Jan Kiszka
{
941 6f0437e8 Jan Kiszka
    if (!kvm_has_sync_mmu()) {
942 6f0437e8 Jan Kiszka
#ifdef MADV_DONTFORK
943 6f0437e8 Jan Kiszka
        int ret = madvise(start, size, MADV_DONTFORK);
944 6f0437e8 Jan Kiszka
945 6f0437e8 Jan Kiszka
        if (ret) {
946 6f0437e8 Jan Kiszka
            perror("madvice");
947 6f0437e8 Jan Kiszka
            exit(1);
948 6f0437e8 Jan Kiszka
        }
949 6f0437e8 Jan Kiszka
#else
950 6f0437e8 Jan Kiszka
        fprintf(stderr,
951 6f0437e8 Jan Kiszka
                "Need MADV_DONTFORK in absence of synchronous KVM MMU\n");
952 6f0437e8 Jan Kiszka
        exit(1);
953 6f0437e8 Jan Kiszka
#endif
954 6f0437e8 Jan Kiszka
    }
955 6f0437e8 Jan Kiszka
}
956 6f0437e8 Jan Kiszka
957 e22a25c9 aliguori
#ifdef KVM_CAP_SET_GUEST_DEBUG
958 fc5d642f Luiz Capitulino
static void on_vcpu(CPUState *env, void (*func)(void *data), void *data)
959 fc5d642f Luiz Capitulino
{
960 828566bc Glauber Costa
#ifdef CONFIG_IOTHREAD
961 a2eebe88 Amit Shah
    if (env != cpu_single_env) {
962 a2eebe88 Amit Shah
        abort();
963 fc5d642f Luiz Capitulino
    }
964 828566bc Glauber Costa
#endif
965 a2eebe88 Amit Shah
    func(data);
966 fc5d642f Luiz Capitulino
}
967 fc5d642f Luiz Capitulino
968 e22a25c9 aliguori
struct kvm_sw_breakpoint *kvm_find_sw_breakpoint(CPUState *env,
969 e22a25c9 aliguori
                                                 target_ulong pc)
970 e22a25c9 aliguori
{
971 e22a25c9 aliguori
    struct kvm_sw_breakpoint *bp;
972 e22a25c9 aliguori
973 72cf2d4f Blue Swirl
    QTAILQ_FOREACH(bp, &env->kvm_state->kvm_sw_breakpoints, entry) {
974 e22a25c9 aliguori
        if (bp->pc == pc)
975 e22a25c9 aliguori
            return bp;
976 e22a25c9 aliguori
    }
977 e22a25c9 aliguori
    return NULL;
978 e22a25c9 aliguori
}
979 e22a25c9 aliguori
980 e22a25c9 aliguori
int kvm_sw_breakpoints_active(CPUState *env)
981 e22a25c9 aliguori
{
982 72cf2d4f Blue Swirl
    return !QTAILQ_EMPTY(&env->kvm_state->kvm_sw_breakpoints);
983 e22a25c9 aliguori
}
984 e22a25c9 aliguori
985 452e4751 Glauber Costa
struct kvm_set_guest_debug_data {
986 452e4751 Glauber Costa
    struct kvm_guest_debug dbg;
987 452e4751 Glauber Costa
    CPUState *env;
988 452e4751 Glauber Costa
    int err;
989 452e4751 Glauber Costa
};
990 452e4751 Glauber Costa
991 452e4751 Glauber Costa
static void kvm_invoke_set_guest_debug(void *data)
992 452e4751 Glauber Costa
{
993 452e4751 Glauber Costa
    struct kvm_set_guest_debug_data *dbg_data = data;
994 b3807725 Jan Kiszka
    CPUState *env = dbg_data->env;
995 b3807725 Jan Kiszka
996 b3807725 Jan Kiszka
    dbg_data->err = kvm_vcpu_ioctl(env, KVM_SET_GUEST_DEBUG, &dbg_data->dbg);
997 452e4751 Glauber Costa
}
998 452e4751 Glauber Costa
999 e22a25c9 aliguori
int kvm_update_guest_debug(CPUState *env, unsigned long reinject_trap)
1000 e22a25c9 aliguori
{
1001 452e4751 Glauber Costa
    struct kvm_set_guest_debug_data data;
1002 e22a25c9 aliguori
1003 b0b1d690 Jan Kiszka
    data.dbg.control = reinject_trap;
1004 e22a25c9 aliguori
1005 b0b1d690 Jan Kiszka
    if (env->singlestep_enabled) {
1006 b0b1d690 Jan Kiszka
        data.dbg.control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP;
1007 b0b1d690 Jan Kiszka
    }
1008 452e4751 Glauber Costa
    kvm_arch_update_guest_debug(env, &data.dbg);
1009 452e4751 Glauber Costa
    data.env = env;
1010 e22a25c9 aliguori
1011 452e4751 Glauber Costa
    on_vcpu(env, kvm_invoke_set_guest_debug, &data);
1012 452e4751 Glauber Costa
    return data.err;
1013 e22a25c9 aliguori
}
1014 e22a25c9 aliguori
1015 e22a25c9 aliguori
int kvm_insert_breakpoint(CPUState *current_env, target_ulong addr,
1016 e22a25c9 aliguori
                          target_ulong len, int type)
1017 e22a25c9 aliguori
{
1018 e22a25c9 aliguori
    struct kvm_sw_breakpoint *bp;
1019 e22a25c9 aliguori
    CPUState *env;
1020 e22a25c9 aliguori
    int err;
1021 e22a25c9 aliguori
1022 e22a25c9 aliguori
    if (type == GDB_BREAKPOINT_SW) {
1023 e22a25c9 aliguori
        bp = kvm_find_sw_breakpoint(current_env, addr);
1024 e22a25c9 aliguori
        if (bp) {
1025 e22a25c9 aliguori
            bp->use_count++;
1026 e22a25c9 aliguori
            return 0;
1027 e22a25c9 aliguori
        }
1028 e22a25c9 aliguori
1029 e22a25c9 aliguori
        bp = qemu_malloc(sizeof(struct kvm_sw_breakpoint));
1030 e22a25c9 aliguori
        if (!bp)
1031 e22a25c9 aliguori
            return -ENOMEM;
1032 e22a25c9 aliguori
1033 e22a25c9 aliguori
        bp->pc = addr;
1034 e22a25c9 aliguori
        bp->use_count = 1;
1035 e22a25c9 aliguori
        err = kvm_arch_insert_sw_breakpoint(current_env, bp);
1036 e22a25c9 aliguori
        if (err) {
1037 e22a25c9 aliguori
            free(bp);
1038 e22a25c9 aliguori
            return err;
1039 e22a25c9 aliguori
        }
1040 e22a25c9 aliguori
1041 72cf2d4f Blue Swirl
        QTAILQ_INSERT_HEAD(&current_env->kvm_state->kvm_sw_breakpoints,
1042 e22a25c9 aliguori
                          bp, entry);
1043 e22a25c9 aliguori
    } else {
1044 e22a25c9 aliguori
        err = kvm_arch_insert_hw_breakpoint(addr, len, type);
1045 e22a25c9 aliguori
        if (err)
1046 e22a25c9 aliguori
            return err;
1047 e22a25c9 aliguori
    }
1048 e22a25c9 aliguori
1049 e22a25c9 aliguori
    for (env = first_cpu; env != NULL; env = env->next_cpu) {
1050 e22a25c9 aliguori
        err = kvm_update_guest_debug(env, 0);
1051 e22a25c9 aliguori
        if (err)
1052 e22a25c9 aliguori
            return err;
1053 e22a25c9 aliguori
    }
1054 e22a25c9 aliguori
    return 0;
1055 e22a25c9 aliguori
}
1056 e22a25c9 aliguori
1057 e22a25c9 aliguori
int kvm_remove_breakpoint(CPUState *current_env, target_ulong addr,
1058 e22a25c9 aliguori
                          target_ulong len, int type)
1059 e22a25c9 aliguori
{
1060 e22a25c9 aliguori
    struct kvm_sw_breakpoint *bp;
1061 e22a25c9 aliguori
    CPUState *env;
1062 e22a25c9 aliguori
    int err;
1063 e22a25c9 aliguori
1064 e22a25c9 aliguori
    if (type == GDB_BREAKPOINT_SW) {
1065 e22a25c9 aliguori
        bp = kvm_find_sw_breakpoint(current_env, addr);
1066 e22a25c9 aliguori
        if (!bp)
1067 e22a25c9 aliguori
            return -ENOENT;
1068 e22a25c9 aliguori
1069 e22a25c9 aliguori
        if (bp->use_count > 1) {
1070 e22a25c9 aliguori
            bp->use_count--;
1071 e22a25c9 aliguori
            return 0;
1072 e22a25c9 aliguori
        }
1073 e22a25c9 aliguori
1074 e22a25c9 aliguori
        err = kvm_arch_remove_sw_breakpoint(current_env, bp);
1075 e22a25c9 aliguori
        if (err)
1076 e22a25c9 aliguori
            return err;
1077 e22a25c9 aliguori
1078 72cf2d4f Blue Swirl
        QTAILQ_REMOVE(&current_env->kvm_state->kvm_sw_breakpoints, bp, entry);
1079 e22a25c9 aliguori
        qemu_free(bp);
1080 e22a25c9 aliguori
    } else {
1081 e22a25c9 aliguori
        err = kvm_arch_remove_hw_breakpoint(addr, len, type);
1082 e22a25c9 aliguori
        if (err)
1083 e22a25c9 aliguori
            return err;
1084 e22a25c9 aliguori
    }
1085 e22a25c9 aliguori
1086 e22a25c9 aliguori
    for (env = first_cpu; env != NULL; env = env->next_cpu) {
1087 e22a25c9 aliguori
        err = kvm_update_guest_debug(env, 0);
1088 e22a25c9 aliguori
        if (err)
1089 e22a25c9 aliguori
            return err;
1090 e22a25c9 aliguori
    }
1091 e22a25c9 aliguori
    return 0;
1092 e22a25c9 aliguori
}
1093 e22a25c9 aliguori
1094 e22a25c9 aliguori
void kvm_remove_all_breakpoints(CPUState *current_env)
1095 e22a25c9 aliguori
{
1096 e22a25c9 aliguori
    struct kvm_sw_breakpoint *bp, *next;
1097 e22a25c9 aliguori
    KVMState *s = current_env->kvm_state;
1098 e22a25c9 aliguori
    CPUState *env;
1099 e22a25c9 aliguori
1100 72cf2d4f Blue Swirl
    QTAILQ_FOREACH_SAFE(bp, &s->kvm_sw_breakpoints, entry, next) {
1101 e22a25c9 aliguori
        if (kvm_arch_remove_sw_breakpoint(current_env, bp) != 0) {
1102 e22a25c9 aliguori
            /* Try harder to find a CPU that currently sees the breakpoint. */
1103 e22a25c9 aliguori
            for (env = first_cpu; env != NULL; env = env->next_cpu) {
1104 e22a25c9 aliguori
                if (kvm_arch_remove_sw_breakpoint(env, bp) == 0)
1105 e22a25c9 aliguori
                    break;
1106 e22a25c9 aliguori
            }
1107 e22a25c9 aliguori
        }
1108 e22a25c9 aliguori
    }
1109 e22a25c9 aliguori
    kvm_arch_remove_all_hw_breakpoints();
1110 e22a25c9 aliguori
1111 e22a25c9 aliguori
    for (env = first_cpu; env != NULL; env = env->next_cpu)
1112 e22a25c9 aliguori
        kvm_update_guest_debug(env, 0);
1113 e22a25c9 aliguori
}
1114 e22a25c9 aliguori
1115 e22a25c9 aliguori
#else /* !KVM_CAP_SET_GUEST_DEBUG */
1116 e22a25c9 aliguori
1117 e22a25c9 aliguori
int kvm_update_guest_debug(CPUState *env, unsigned long reinject_trap)
1118 e22a25c9 aliguori
{
1119 e22a25c9 aliguori
    return -EINVAL;
1120 e22a25c9 aliguori
}
1121 e22a25c9 aliguori
1122 e22a25c9 aliguori
int kvm_insert_breakpoint(CPUState *current_env, target_ulong addr,
1123 e22a25c9 aliguori
                          target_ulong len, int type)
1124 e22a25c9 aliguori
{
1125 e22a25c9 aliguori
    return -EINVAL;
1126 e22a25c9 aliguori
}
1127 e22a25c9 aliguori
1128 e22a25c9 aliguori
int kvm_remove_breakpoint(CPUState *current_env, target_ulong addr,
1129 e22a25c9 aliguori
                          target_ulong len, int type)
1130 e22a25c9 aliguori
{
1131 e22a25c9 aliguori
    return -EINVAL;
1132 e22a25c9 aliguori
}
1133 e22a25c9 aliguori
1134 e22a25c9 aliguori
void kvm_remove_all_breakpoints(CPUState *current_env)
1135 e22a25c9 aliguori
{
1136 e22a25c9 aliguori
}
1137 e22a25c9 aliguori
#endif /* !KVM_CAP_SET_GUEST_DEBUG */
1138 cc84de95 Marcelo Tosatti
1139 cc84de95 Marcelo Tosatti
int kvm_set_signal_mask(CPUState *env, const sigset_t *sigset)
1140 cc84de95 Marcelo Tosatti
{
1141 cc84de95 Marcelo Tosatti
    struct kvm_signal_mask *sigmask;
1142 cc84de95 Marcelo Tosatti
    int r;
1143 cc84de95 Marcelo Tosatti
1144 cc84de95 Marcelo Tosatti
    if (!sigset)
1145 cc84de95 Marcelo Tosatti
        return kvm_vcpu_ioctl(env, KVM_SET_SIGNAL_MASK, NULL);
1146 cc84de95 Marcelo Tosatti
1147 cc84de95 Marcelo Tosatti
    sigmask = qemu_malloc(sizeof(*sigmask) + sizeof(*sigset));
1148 cc84de95 Marcelo Tosatti
1149 cc84de95 Marcelo Tosatti
    sigmask->len = 8;
1150 cc84de95 Marcelo Tosatti
    memcpy(sigmask->sigset, sigset, sizeof(*sigset));
1151 cc84de95 Marcelo Tosatti
    r = kvm_vcpu_ioctl(env, KVM_SET_SIGNAL_MASK, sigmask);
1152 cc84de95 Marcelo Tosatti
    free(sigmask);
1153 cc84de95 Marcelo Tosatti
1154 cc84de95 Marcelo Tosatti
    return r;
1155 cc84de95 Marcelo Tosatti
}