Statistics
| Branch: | Revision:

root / kvm-all.c @ 9c22a623

History | View | Annotate | Download (23.7 kB)

1
/*
2
 * QEMU KVM support
3
 *
4
 * Copyright IBM, Corp. 2008
5
 *           Red Hat, Inc. 2008
6
 *
7
 * Authors:
8
 *  Anthony Liguori   <aliguori@us.ibm.com>
9
 *  Glauber Costa     <gcosta@redhat.com>
10
 *
11
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
12
 * See the COPYING file in the top-level directory.
13
 *
14
 */
15

    
16
#include <sys/types.h>
17
#include <sys/ioctl.h>
18
#include <sys/mman.h>
19
#include <stdarg.h>
20

    
21
#include <linux/kvm.h>
22

    
23
#include "qemu-common.h"
24
#include "sysemu.h"
25
#include "gdbstub.h"
26
#include "kvm.h"
27

    
28
/* KVM uses PAGE_SIZE in it's definition of COALESCED_MMIO_MAX */
29
#define PAGE_SIZE TARGET_PAGE_SIZE
30

    
31
//#define DEBUG_KVM
32

    
33
#ifdef DEBUG_KVM
34
#define dprintf(fmt, ...) \
35
    do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
36
#else
37
#define dprintf(fmt, ...) \
38
    do { } while (0)
39
#endif
40

    
41
typedef struct KVMSlot
42
{
43
    target_phys_addr_t start_addr;
44
    ram_addr_t memory_size;
45
    ram_addr_t phys_offset;
46
    int slot;
47
    int flags;
48
} KVMSlot;
49

    
50
typedef struct kvm_dirty_log KVMDirtyLog;
51

    
52
int kvm_allowed = 0;
53

    
54
struct KVMState
55
{
56
    KVMSlot slots[32];
57
    int fd;
58
    int vmfd;
59
    int coalesced_mmio;
60
#ifdef KVM_CAP_SET_GUEST_DEBUG
61
    struct kvm_sw_breakpoint_head kvm_sw_breakpoints;
62
#endif
63
};
64

    
65
static KVMState *kvm_state;
66

    
67
static KVMSlot *kvm_alloc_slot(KVMState *s)
68
{
69
    int i;
70

    
71
    for (i = 0; i < ARRAY_SIZE(s->slots); i++) {
72
        /* KVM private memory slots */
73
        if (i >= 8 && i < 12)
74
            continue;
75
        if (s->slots[i].memory_size == 0)
76
            return &s->slots[i];
77
    }
78

    
79
    fprintf(stderr, "%s: no free slot available\n", __func__);
80
    abort();
81
}
82

    
83
static KVMSlot *kvm_lookup_matching_slot(KVMState *s,
84
                                         target_phys_addr_t start_addr,
85
                                         target_phys_addr_t end_addr)
86
{
87
    int i;
88

    
89
    for (i = 0; i < ARRAY_SIZE(s->slots); i++) {
90
        KVMSlot *mem = &s->slots[i];
91

    
92
        if (start_addr == mem->start_addr &&
93
            end_addr == mem->start_addr + mem->memory_size) {
94
            return mem;
95
        }
96
    }
97

    
98
    return NULL;
99
}
100

    
101
/*
102
 * Find overlapping slot with lowest start address
103
 */
104
static KVMSlot *kvm_lookup_overlapping_slot(KVMState *s,
105
                                            target_phys_addr_t start_addr,
106
                                            target_phys_addr_t end_addr)
107
{
108
    KVMSlot *found = NULL;
109
    int i;
110

    
111
    for (i = 0; i < ARRAY_SIZE(s->slots); i++) {
112
        KVMSlot *mem = &s->slots[i];
113

    
114
        if (mem->memory_size == 0 ||
115
            (found && found->start_addr < mem->start_addr)) {
116
            continue;
117
        }
118

    
119
        if (end_addr > mem->start_addr &&
120
            start_addr < mem->start_addr + mem->memory_size) {
121
            found = mem;
122
        }
123
    }
124

    
125
    return found;
126
}
127

    
128
static int kvm_set_user_memory_region(KVMState *s, KVMSlot *slot)
129
{
130
    struct kvm_userspace_memory_region mem;
131

    
132
    mem.slot = slot->slot;
133
    mem.guest_phys_addr = slot->start_addr;
134
    mem.memory_size = slot->memory_size;
135
    mem.userspace_addr = (unsigned long)qemu_get_ram_ptr(slot->phys_offset);
136
    mem.flags = slot->flags;
137

    
138
    return kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, &mem);
139
}
140

    
141

    
142
int kvm_init_vcpu(CPUState *env)
143
{
144
    KVMState *s = kvm_state;
145
    long mmap_size;
146
    int ret;
147

    
148
    dprintf("kvm_init_vcpu\n");
149

    
150
    ret = kvm_vm_ioctl(s, KVM_CREATE_VCPU, env->cpu_index);
151
    if (ret < 0) {
152
        dprintf("kvm_create_vcpu failed\n");
153
        goto err;
154
    }
155

    
156
    env->kvm_fd = ret;
157
    env->kvm_state = s;
158

    
159
    mmap_size = kvm_ioctl(s, KVM_GET_VCPU_MMAP_SIZE, 0);
160
    if (mmap_size < 0) {
161
        dprintf("KVM_GET_VCPU_MMAP_SIZE failed\n");
162
        goto err;
163
    }
164

    
165
    env->kvm_run = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED,
166
                        env->kvm_fd, 0);
167
    if (env->kvm_run == MAP_FAILED) {
168
        ret = -errno;
169
        dprintf("mmap'ing vcpu state failed\n");
170
        goto err;
171
    }
172

    
173
    ret = kvm_arch_init_vcpu(env);
174

    
175
err:
176
    return ret;
177
}
178

    
179
int kvm_sync_vcpus(void)
180
{
181
    CPUState *env;
182

    
183
    for (env = first_cpu; env != NULL; env = env->next_cpu) {
184
        int ret;
185

    
186
        ret = kvm_arch_put_registers(env);
187
        if (ret)
188
            return ret;
189
    }
190

    
191
    return 0;
192
}
193

    
194
/*
195
 * dirty pages logging control
196
 */
197
static int kvm_dirty_pages_log_change(target_phys_addr_t phys_addr,
198
                                      ram_addr_t size, unsigned flags,
199
                                      unsigned mask)
200
{
201
    KVMState *s = kvm_state;
202
    KVMSlot *mem = kvm_lookup_matching_slot(s, phys_addr, phys_addr + size);
203
    if (mem == NULL)  {
204
            fprintf(stderr, "BUG: %s: invalid parameters " TARGET_FMT_plx "-"
205
                    TARGET_FMT_plx "\n", __func__, phys_addr,
206
                    phys_addr + size - 1);
207
            return -EINVAL;
208
    }
209

    
210
    flags = (mem->flags & ~mask) | flags;
211
    /* Nothing changed, no need to issue ioctl */
212
    if (flags == mem->flags)
213
            return 0;
214

    
215
    mem->flags = flags;
216

    
217
    return kvm_set_user_memory_region(s, mem);
218
}
219

    
220
int kvm_log_start(target_phys_addr_t phys_addr, ram_addr_t size)
221
{
222
        return kvm_dirty_pages_log_change(phys_addr, size,
223
                                          KVM_MEM_LOG_DIRTY_PAGES,
224
                                          KVM_MEM_LOG_DIRTY_PAGES);
225
}
226

    
227
int kvm_log_stop(target_phys_addr_t phys_addr, ram_addr_t size)
228
{
229
        return kvm_dirty_pages_log_change(phys_addr, size,
230
                                          0,
231
                                          KVM_MEM_LOG_DIRTY_PAGES);
232
}
233

    
234
/**
235
 * kvm_physical_sync_dirty_bitmap - Grab dirty bitmap from kernel space
236
 * This function updates qemu's dirty bitmap using cpu_physical_memory_set_dirty().
237
 * This means all bits are set to dirty.
238
 *
239
 * @start_add: start of logged region.
240
 * @end_addr: end of logged region.
241
 */
242
void kvm_physical_sync_dirty_bitmap(target_phys_addr_t start_addr,
243
                                    target_phys_addr_t end_addr)
244
{
245
    KVMState *s = kvm_state;
246
    KVMDirtyLog d;
247
    KVMSlot *mem = kvm_lookup_matching_slot(s, start_addr, end_addr);
248
    unsigned long alloc_size;
249
    ram_addr_t addr;
250
    target_phys_addr_t phys_addr = start_addr;
251

    
252
    dprintf("sync addr: " TARGET_FMT_lx " into %lx\n", start_addr,
253
            mem->phys_offset);
254
    if (mem == NULL) {
255
            fprintf(stderr, "BUG: %s: invalid parameters " TARGET_FMT_plx "-"
256
                    TARGET_FMT_plx "\n", __func__, phys_addr, end_addr - 1);
257
            return;
258
    }
259

    
260
    alloc_size = mem->memory_size >> TARGET_PAGE_BITS / sizeof(d.dirty_bitmap);
261
    d.dirty_bitmap = qemu_mallocz(alloc_size);
262

    
263
    d.slot = mem->slot;
264
    dprintf("slot %d, phys_addr %llx, uaddr: %llx\n",
265
            d.slot, mem->start_addr, mem->phys_offset);
266

    
267
    if (kvm_vm_ioctl(s, KVM_GET_DIRTY_LOG, &d) == -1) {
268
        dprintf("ioctl failed %d\n", errno);
269
        goto out;
270
    }
271

    
272
    phys_addr = start_addr;
273
    for (addr = mem->phys_offset; phys_addr < end_addr; phys_addr+= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
274
        unsigned long *bitmap = (unsigned long *)d.dirty_bitmap;
275
        unsigned nr = (phys_addr - start_addr) >> TARGET_PAGE_BITS;
276
        unsigned word = nr / (sizeof(*bitmap) * 8);
277
        unsigned bit = nr % (sizeof(*bitmap) * 8);
278
        if ((bitmap[word] >> bit) & 1)
279
            cpu_physical_memory_set_dirty(addr);
280
    }
281
out:
282
    qemu_free(d.dirty_bitmap);
283
}
284

    
285
int kvm_coalesce_mmio_region(target_phys_addr_t start, ram_addr_t size)
286
{
287
    int ret = -ENOSYS;
288
#ifdef KVM_CAP_COALESCED_MMIO
289
    KVMState *s = kvm_state;
290

    
291
    if (s->coalesced_mmio) {
292
        struct kvm_coalesced_mmio_zone zone;
293

    
294
        zone.addr = start;
295
        zone.size = size;
296

    
297
        ret = kvm_vm_ioctl(s, KVM_REGISTER_COALESCED_MMIO, &zone);
298
    }
299
#endif
300

    
301
    return ret;
302
}
303

    
304
int kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size)
305
{
306
    int ret = -ENOSYS;
307
#ifdef KVM_CAP_COALESCED_MMIO
308
    KVMState *s = kvm_state;
309

    
310
    if (s->coalesced_mmio) {
311
        struct kvm_coalesced_mmio_zone zone;
312

    
313
        zone.addr = start;
314
        zone.size = size;
315

    
316
        ret = kvm_vm_ioctl(s, KVM_UNREGISTER_COALESCED_MMIO, &zone);
317
    }
318
#endif
319

    
320
    return ret;
321
}
322

    
323
int kvm_init(int smp_cpus)
324
{
325
    KVMState *s;
326
    int ret;
327
    int i;
328

    
329
    if (smp_cpus > 1)
330
        return -EINVAL;
331

    
332
    s = qemu_mallocz(sizeof(KVMState));
333

    
334
#ifdef KVM_CAP_SET_GUEST_DEBUG
335
    TAILQ_INIT(&s->kvm_sw_breakpoints);
336
#endif
337
    for (i = 0; i < ARRAY_SIZE(s->slots); i++)
338
        s->slots[i].slot = i;
339

    
340
    s->vmfd = -1;
341
    s->fd = open("/dev/kvm", O_RDWR);
342
    if (s->fd == -1) {
343
        fprintf(stderr, "Could not access KVM kernel module: %m\n");
344
        ret = -errno;
345
        goto err;
346
    }
347

    
348
    ret = kvm_ioctl(s, KVM_GET_API_VERSION, 0);
349
    if (ret < KVM_API_VERSION) {
350
        if (ret > 0)
351
            ret = -EINVAL;
352
        fprintf(stderr, "kvm version too old\n");
353
        goto err;
354
    }
355

    
356
    if (ret > KVM_API_VERSION) {
357
        ret = -EINVAL;
358
        fprintf(stderr, "kvm version not supported\n");
359
        goto err;
360
    }
361

    
362
    s->vmfd = kvm_ioctl(s, KVM_CREATE_VM, 0);
363
    if (s->vmfd < 0)
364
        goto err;
365

    
366
    /* initially, KVM allocated its own memory and we had to jump through
367
     * hooks to make phys_ram_base point to this.  Modern versions of KVM
368
     * just use a user allocated buffer so we can use regular pages
369
     * unmodified.  Make sure we have a sufficiently modern version of KVM.
370
     */
371
    ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_USER_MEMORY);
372
    if (ret <= 0) {
373
        if (ret == 0)
374
            ret = -EINVAL;
375
        fprintf(stderr, "kvm does not support KVM_CAP_USER_MEMORY\n");
376
        goto err;
377
    }
378

    
379
    /* There was a nasty bug in < kvm-80 that prevents memory slots from being
380
     * destroyed properly.  Since we rely on this capability, refuse to work
381
     * with any kernel without this capability. */
382
    ret = kvm_ioctl(s, KVM_CHECK_EXTENSION,
383
                    KVM_CAP_DESTROY_MEMORY_REGION_WORKS);
384
    if (ret <= 0) {
385
        if (ret == 0)
386
            ret = -EINVAL;
387

    
388
        fprintf(stderr,
389
                "KVM kernel module broken (DESTROY_MEMORY_REGION)\n"
390
                "Please upgrade to at least kvm-81.\n");
391
        goto err;
392
    }
393

    
394
    s->coalesced_mmio = 0;
395
#ifdef KVM_CAP_COALESCED_MMIO
396
    ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_COALESCED_MMIO);
397
    if (ret > 0)
398
        s->coalesced_mmio = ret;
399
#endif
400

    
401
    ret = kvm_arch_init(s, smp_cpus);
402
    if (ret < 0)
403
        goto err;
404

    
405
    kvm_state = s;
406

    
407
    return 0;
408

    
409
err:
410
    if (s) {
411
        if (s->vmfd != -1)
412
            close(s->vmfd);
413
        if (s->fd != -1)
414
            close(s->fd);
415
    }
416
    qemu_free(s);
417

    
418
    return ret;
419
}
420

    
421
static int kvm_handle_io(CPUState *env, uint16_t port, void *data,
422
                         int direction, int size, uint32_t count)
423
{
424
    int i;
425
    uint8_t *ptr = data;
426

    
427
    for (i = 0; i < count; i++) {
428
        if (direction == KVM_EXIT_IO_IN) {
429
            switch (size) {
430
            case 1:
431
                stb_p(ptr, cpu_inb(env, port));
432
                break;
433
            case 2:
434
                stw_p(ptr, cpu_inw(env, port));
435
                break;
436
            case 4:
437
                stl_p(ptr, cpu_inl(env, port));
438
                break;
439
            }
440
        } else {
441
            switch (size) {
442
            case 1:
443
                cpu_outb(env, port, ldub_p(ptr));
444
                break;
445
            case 2:
446
                cpu_outw(env, port, lduw_p(ptr));
447
                break;
448
            case 4:
449
                cpu_outl(env, port, ldl_p(ptr));
450
                break;
451
            }
452
        }
453

    
454
        ptr += size;
455
    }
456

    
457
    return 1;
458
}
459

    
460
static void kvm_run_coalesced_mmio(CPUState *env, struct kvm_run *run)
461
{
462
#ifdef KVM_CAP_COALESCED_MMIO
463
    KVMState *s = kvm_state;
464
    if (s->coalesced_mmio) {
465
        struct kvm_coalesced_mmio_ring *ring;
466

    
467
        ring = (void *)run + (s->coalesced_mmio * TARGET_PAGE_SIZE);
468
        while (ring->first != ring->last) {
469
            struct kvm_coalesced_mmio *ent;
470

    
471
            ent = &ring->coalesced_mmio[ring->first];
472

    
473
            cpu_physical_memory_write(ent->phys_addr, ent->data, ent->len);
474
            /* FIXME smp_wmb() */
475
            ring->first = (ring->first + 1) % KVM_COALESCED_MMIO_MAX;
476
        }
477
    }
478
#endif
479
}
480

    
481
int kvm_cpu_exec(CPUState *env)
482
{
483
    struct kvm_run *run = env->kvm_run;
484
    int ret;
485

    
486
    dprintf("kvm_cpu_exec()\n");
487

    
488
    do {
489
        kvm_arch_pre_run(env, run);
490

    
491
        if (env->exit_request) {
492
            dprintf("interrupt exit requested\n");
493
            ret = 0;
494
            break;
495
        }
496

    
497
        ret = kvm_vcpu_ioctl(env, KVM_RUN, 0);
498
        kvm_arch_post_run(env, run);
499

    
500
        if (ret == -EINTR || ret == -EAGAIN) {
501
            dprintf("io window exit\n");
502
            ret = 0;
503
            break;
504
        }
505

    
506
        if (ret < 0) {
507
            dprintf("kvm run failed %s\n", strerror(-ret));
508
            abort();
509
        }
510

    
511
        kvm_run_coalesced_mmio(env, run);
512

    
513
        ret = 0; /* exit loop */
514
        switch (run->exit_reason) {
515
        case KVM_EXIT_IO:
516
            dprintf("handle_io\n");
517
            ret = kvm_handle_io(env, run->io.port,
518
                                (uint8_t *)run + run->io.data_offset,
519
                                run->io.direction,
520
                                run->io.size,
521
                                run->io.count);
522
            break;
523
        case KVM_EXIT_MMIO:
524
            dprintf("handle_mmio\n");
525
            cpu_physical_memory_rw(run->mmio.phys_addr,
526
                                   run->mmio.data,
527
                                   run->mmio.len,
528
                                   run->mmio.is_write);
529
            ret = 1;
530
            break;
531
        case KVM_EXIT_IRQ_WINDOW_OPEN:
532
            dprintf("irq_window_open\n");
533
            break;
534
        case KVM_EXIT_SHUTDOWN:
535
            dprintf("shutdown\n");
536
            qemu_system_reset_request();
537
            ret = 1;
538
            break;
539
        case KVM_EXIT_UNKNOWN:
540
            dprintf("kvm_exit_unknown\n");
541
            break;
542
        case KVM_EXIT_FAIL_ENTRY:
543
            dprintf("kvm_exit_fail_entry\n");
544
            break;
545
        case KVM_EXIT_EXCEPTION:
546
            dprintf("kvm_exit_exception\n");
547
            break;
548
        case KVM_EXIT_DEBUG:
549
            dprintf("kvm_exit_debug\n");
550
#ifdef KVM_CAP_SET_GUEST_DEBUG
551
            if (kvm_arch_debug(&run->debug.arch)) {
552
                gdb_set_stop_cpu(env);
553
                vm_stop(EXCP_DEBUG);
554
                env->exception_index = EXCP_DEBUG;
555
                return 0;
556
            }
557
            /* re-enter, this exception was guest-internal */
558
            ret = 1;
559
#endif /* KVM_CAP_SET_GUEST_DEBUG */
560
            break;
561
        default:
562
            dprintf("kvm_arch_handle_exit\n");
563
            ret = kvm_arch_handle_exit(env, run);
564
            break;
565
        }
566
    } while (ret > 0);
567

    
568
    if (env->exit_request) {
569
        env->exit_request = 0;
570
        env->exception_index = EXCP_INTERRUPT;
571
    }
572

    
573
    return ret;
574
}
575

    
576
void kvm_set_phys_mem(target_phys_addr_t start_addr,
577
                      ram_addr_t size,
578
                      ram_addr_t phys_offset)
579
{
580
    KVMState *s = kvm_state;
581
    ram_addr_t flags = phys_offset & ~TARGET_PAGE_MASK;
582
    KVMSlot *mem, old;
583
    int err;
584

    
585
    if (start_addr & ~TARGET_PAGE_MASK) {
586
        fprintf(stderr, "Only page-aligned memory slots supported\n");
587
        abort();
588
    }
589

    
590
    /* KVM does not support read-only slots */
591
    phys_offset &= ~IO_MEM_ROM;
592

    
593
    while (1) {
594
        mem = kvm_lookup_overlapping_slot(s, start_addr, start_addr + size);
595
        if (!mem) {
596
            break;
597
        }
598

    
599
        if (flags < IO_MEM_UNASSIGNED && start_addr >= mem->start_addr &&
600
            (start_addr + size <= mem->start_addr + mem->memory_size) &&
601
            (phys_offset - start_addr == mem->phys_offset - mem->start_addr)) {
602
            /* The new slot fits into the existing one and comes with
603
             * identical parameters - nothing to be done. */
604
            return;
605
        }
606

    
607
        old = *mem;
608

    
609
        /* unregister the overlapping slot */
610
        mem->memory_size = 0;
611
        err = kvm_set_user_memory_region(s, mem);
612
        if (err) {
613
            fprintf(stderr, "%s: error unregistering overlapping slot: %s\n",
614
                    __func__, strerror(-err));
615
            abort();
616
        }
617

    
618
        /* Workaround for older KVM versions: we can't join slots, even not by
619
         * unregistering the previous ones and then registering the larger
620
         * slot. We have to maintain the existing fragmentation. Sigh.
621
         *
622
         * This workaround assumes that the new slot starts at the same
623
         * address as the first existing one. If not or if some overlapping
624
         * slot comes around later, we will fail (not seen in practice so far)
625
         * - and actually require a recent KVM version. */
626
        if (old.start_addr == start_addr && old.memory_size < size &&
627
            flags < IO_MEM_UNASSIGNED) {
628
            mem = kvm_alloc_slot(s);
629
            mem->memory_size = old.memory_size;
630
            mem->start_addr = old.start_addr;
631
            mem->phys_offset = old.phys_offset;
632
            mem->flags = 0;
633

    
634
            err = kvm_set_user_memory_region(s, mem);
635
            if (err) {
636
                fprintf(stderr, "%s: error updating slot: %s\n", __func__,
637
                        strerror(-err));
638
                abort();
639
            }
640

    
641
            start_addr += old.memory_size;
642
            phys_offset += old.memory_size;
643
            size -= old.memory_size;
644
            continue;
645
        }
646

    
647
        /* register prefix slot */
648
        if (old.start_addr < start_addr) {
649
            mem = kvm_alloc_slot(s);
650
            mem->memory_size = start_addr - old.start_addr;
651
            mem->start_addr = old.start_addr;
652
            mem->phys_offset = old.phys_offset;
653
            mem->flags = 0;
654

    
655
            err = kvm_set_user_memory_region(s, mem);
656
            if (err) {
657
                fprintf(stderr, "%s: error registering prefix slot: %s\n",
658
                        __func__, strerror(-err));
659
                abort();
660
            }
661
        }
662

    
663
        /* register suffix slot */
664
        if (old.start_addr + old.memory_size > start_addr + size) {
665
            ram_addr_t size_delta;
666

    
667
            mem = kvm_alloc_slot(s);
668
            mem->start_addr = start_addr + size;
669
            size_delta = mem->start_addr - old.start_addr;
670
            mem->memory_size = old.memory_size - size_delta;
671
            mem->phys_offset = old.phys_offset + size_delta;
672
            mem->flags = 0;
673

    
674
            err = kvm_set_user_memory_region(s, mem);
675
            if (err) {
676
                fprintf(stderr, "%s: error registering suffix slot: %s\n",
677
                        __func__, strerror(-err));
678
                abort();
679
            }
680
        }
681
    }
682

    
683
    /* in case the KVM bug workaround already "consumed" the new slot */
684
    if (!size)
685
        return;
686

    
687
    /* KVM does not need to know about this memory */
688
    if (flags >= IO_MEM_UNASSIGNED)
689
        return;
690

    
691
    mem = kvm_alloc_slot(s);
692
    mem->memory_size = size;
693
    mem->start_addr = start_addr;
694
    mem->phys_offset = phys_offset;
695
    mem->flags = 0;
696

    
697
    err = kvm_set_user_memory_region(s, mem);
698
    if (err) {
699
        fprintf(stderr, "%s: error registering slot: %s\n", __func__,
700
                strerror(-err));
701
        abort();
702
    }
703
}
704

    
705
int kvm_ioctl(KVMState *s, int type, ...)
706
{
707
    int ret;
708
    void *arg;
709
    va_list ap;
710

    
711
    va_start(ap, type);
712
    arg = va_arg(ap, void *);
713
    va_end(ap);
714

    
715
    ret = ioctl(s->fd, type, arg);
716
    if (ret == -1)
717
        ret = -errno;
718

    
719
    return ret;
720
}
721

    
722
int kvm_vm_ioctl(KVMState *s, int type, ...)
723
{
724
    int ret;
725
    void *arg;
726
    va_list ap;
727

    
728
    va_start(ap, type);
729
    arg = va_arg(ap, void *);
730
    va_end(ap);
731

    
732
    ret = ioctl(s->vmfd, type, arg);
733
    if (ret == -1)
734
        ret = -errno;
735

    
736
    return ret;
737
}
738

    
739
int kvm_vcpu_ioctl(CPUState *env, int type, ...)
740
{
741
    int ret;
742
    void *arg;
743
    va_list ap;
744

    
745
    va_start(ap, type);
746
    arg = va_arg(ap, void *);
747
    va_end(ap);
748

    
749
    ret = ioctl(env->kvm_fd, type, arg);
750
    if (ret == -1)
751
        ret = -errno;
752

    
753
    return ret;
754
}
755

    
756
int kvm_has_sync_mmu(void)
757
{
758
#ifdef KVM_CAP_SYNC_MMU
759
    KVMState *s = kvm_state;
760

    
761
    if (kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_SYNC_MMU) > 0)
762
        return 1;
763
#endif
764

    
765
    return 0;
766
}
767

    
768
#ifdef KVM_CAP_SET_GUEST_DEBUG
769
struct kvm_sw_breakpoint *kvm_find_sw_breakpoint(CPUState *env,
770
                                                 target_ulong pc)
771
{
772
    struct kvm_sw_breakpoint *bp;
773

    
774
    TAILQ_FOREACH(bp, &env->kvm_state->kvm_sw_breakpoints, entry) {
775
        if (bp->pc == pc)
776
            return bp;
777
    }
778
    return NULL;
779
}
780

    
781
int kvm_sw_breakpoints_active(CPUState *env)
782
{
783
    return !TAILQ_EMPTY(&env->kvm_state->kvm_sw_breakpoints);
784
}
785

    
786
int kvm_update_guest_debug(CPUState *env, unsigned long reinject_trap)
787
{
788
    struct kvm_guest_debug dbg;
789

    
790
    dbg.control = 0;
791
    if (env->singlestep_enabled)
792
        dbg.control = KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP;
793

    
794
    kvm_arch_update_guest_debug(env, &dbg);
795
    dbg.control |= reinject_trap;
796

    
797
    return kvm_vcpu_ioctl(env, KVM_SET_GUEST_DEBUG, &dbg);
798
}
799

    
800
int kvm_insert_breakpoint(CPUState *current_env, target_ulong addr,
801
                          target_ulong len, int type)
802
{
803
    struct kvm_sw_breakpoint *bp;
804
    CPUState *env;
805
    int err;
806

    
807
    if (type == GDB_BREAKPOINT_SW) {
808
        bp = kvm_find_sw_breakpoint(current_env, addr);
809
        if (bp) {
810
            bp->use_count++;
811
            return 0;
812
        }
813

    
814
        bp = qemu_malloc(sizeof(struct kvm_sw_breakpoint));
815
        if (!bp)
816
            return -ENOMEM;
817

    
818
        bp->pc = addr;
819
        bp->use_count = 1;
820
        err = kvm_arch_insert_sw_breakpoint(current_env, bp);
821
        if (err) {
822
            free(bp);
823
            return err;
824
        }
825

    
826
        TAILQ_INSERT_HEAD(&current_env->kvm_state->kvm_sw_breakpoints,
827
                          bp, entry);
828
    } else {
829
        err = kvm_arch_insert_hw_breakpoint(addr, len, type);
830
        if (err)
831
            return err;
832
    }
833

    
834
    for (env = first_cpu; env != NULL; env = env->next_cpu) {
835
        err = kvm_update_guest_debug(env, 0);
836
        if (err)
837
            return err;
838
    }
839
    return 0;
840
}
841

    
842
int kvm_remove_breakpoint(CPUState *current_env, target_ulong addr,
843
                          target_ulong len, int type)
844
{
845
    struct kvm_sw_breakpoint *bp;
846
    CPUState *env;
847
    int err;
848

    
849
    if (type == GDB_BREAKPOINT_SW) {
850
        bp = kvm_find_sw_breakpoint(current_env, addr);
851
        if (!bp)
852
            return -ENOENT;
853

    
854
        if (bp->use_count > 1) {
855
            bp->use_count--;
856
            return 0;
857
        }
858

    
859
        err = kvm_arch_remove_sw_breakpoint(current_env, bp);
860
        if (err)
861
            return err;
862

    
863
        TAILQ_REMOVE(&current_env->kvm_state->kvm_sw_breakpoints, bp, entry);
864
        qemu_free(bp);
865
    } else {
866
        err = kvm_arch_remove_hw_breakpoint(addr, len, type);
867
        if (err)
868
            return err;
869
    }
870

    
871
    for (env = first_cpu; env != NULL; env = env->next_cpu) {
872
        err = kvm_update_guest_debug(env, 0);
873
        if (err)
874
            return err;
875
    }
876
    return 0;
877
}
878

    
879
void kvm_remove_all_breakpoints(CPUState *current_env)
880
{
881
    struct kvm_sw_breakpoint *bp, *next;
882
    KVMState *s = current_env->kvm_state;
883
    CPUState *env;
884

    
885
    TAILQ_FOREACH_SAFE(bp, &s->kvm_sw_breakpoints, entry, next) {
886
        if (kvm_arch_remove_sw_breakpoint(current_env, bp) != 0) {
887
            /* Try harder to find a CPU that currently sees the breakpoint. */
888
            for (env = first_cpu; env != NULL; env = env->next_cpu) {
889
                if (kvm_arch_remove_sw_breakpoint(env, bp) == 0)
890
                    break;
891
            }
892
        }
893
    }
894
    kvm_arch_remove_all_hw_breakpoints();
895

    
896
    for (env = first_cpu; env != NULL; env = env->next_cpu)
897
        kvm_update_guest_debug(env, 0);
898
}
899

    
900
#else /* !KVM_CAP_SET_GUEST_DEBUG */
901

    
902
int kvm_update_guest_debug(CPUState *env, unsigned long reinject_trap)
903
{
904
    return -EINVAL;
905
}
906

    
907
int kvm_insert_breakpoint(CPUState *current_env, target_ulong addr,
908
                          target_ulong len, int type)
909
{
910
    return -EINVAL;
911
}
912

    
913
int kvm_remove_breakpoint(CPUState *current_env, target_ulong addr,
914
                          target_ulong len, int type)
915
{
916
    return -EINVAL;
917
}
918

    
919
void kvm_remove_all_breakpoints(CPUState *current_env)
920
{
921
}
922
#endif /* !KVM_CAP_SET_GUEST_DEBUG */