Statistics
| Branch: | Revision:

root / kvm-all.c @ 719f66a7

History | View | Annotate | Download (24.4 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
        if (flags >= IO_MEM_UNASSIGNED) {
587
            if (!kvm_lookup_overlapping_slot(s, start_addr,
588
                                             start_addr + size)) {
589
                return;
590
            }
591
            fprintf(stderr, "Unaligned split of a KVM memory slot\n");
592
        } else {
593
            fprintf(stderr, "Only page-aligned memory slots supported\n");
594
        }
595
        abort();
596
    }
597

    
598
    /* KVM does not support read-only slots */
599
    phys_offset &= ~IO_MEM_ROM;
600

    
601
    while (1) {
602
        mem = kvm_lookup_overlapping_slot(s, start_addr, start_addr + size);
603
        if (!mem) {
604
            break;
605
        }
606

    
607
        if (flags < IO_MEM_UNASSIGNED && start_addr >= mem->start_addr &&
608
            (start_addr + size <= mem->start_addr + mem->memory_size) &&
609
            (phys_offset - start_addr == mem->phys_offset - mem->start_addr)) {
610
            /* The new slot fits into the existing one and comes with
611
             * identical parameters - nothing to be done. */
612
            return;
613
        }
614

    
615
        old = *mem;
616

    
617
        /* unregister the overlapping slot */
618
        mem->memory_size = 0;
619
        err = kvm_set_user_memory_region(s, mem);
620
        if (err) {
621
            fprintf(stderr, "%s: error unregistering overlapping slot: %s\n",
622
                    __func__, strerror(-err));
623
            abort();
624
        }
625

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

    
642
            err = kvm_set_user_memory_region(s, mem);
643
            if (err) {
644
                fprintf(stderr, "%s: error updating slot: %s\n", __func__,
645
                        strerror(-err));
646
                abort();
647
            }
648

    
649
            start_addr += old.memory_size;
650
            phys_offset += old.memory_size;
651
            size -= old.memory_size;
652
            continue;
653
        }
654

    
655
        /* register prefix slot */
656
        if (old.start_addr < start_addr) {
657
            mem = kvm_alloc_slot(s);
658
            mem->memory_size = start_addr - old.start_addr;
659
            mem->start_addr = old.start_addr;
660
            mem->phys_offset = old.phys_offset;
661
            mem->flags = 0;
662

    
663
            err = kvm_set_user_memory_region(s, mem);
664
            if (err) {
665
                fprintf(stderr, "%s: error registering prefix slot: %s\n",
666
                        __func__, strerror(-err));
667
                abort();
668
            }
669
        }
670

    
671
        /* register suffix slot */
672
        if (old.start_addr + old.memory_size > start_addr + size) {
673
            ram_addr_t size_delta;
674

    
675
            mem = kvm_alloc_slot(s);
676
            mem->start_addr = start_addr + size;
677
            size_delta = mem->start_addr - old.start_addr;
678
            mem->memory_size = old.memory_size - size_delta;
679
            mem->phys_offset = old.phys_offset + size_delta;
680
            mem->flags = 0;
681

    
682
            err = kvm_set_user_memory_region(s, mem);
683
            if (err) {
684
                fprintf(stderr, "%s: error registering suffix slot: %s\n",
685
                        __func__, strerror(-err));
686
                abort();
687
            }
688
        }
689
    }
690

    
691
    /* in case the KVM bug workaround already "consumed" the new slot */
692
    if (!size)
693
        return;
694

    
695
    /* KVM does not need to know about this memory */
696
    if (flags >= IO_MEM_UNASSIGNED)
697
        return;
698

    
699
    mem = kvm_alloc_slot(s);
700
    mem->memory_size = size;
701
    mem->start_addr = start_addr;
702
    mem->phys_offset = phys_offset;
703
    mem->flags = 0;
704

    
705
    err = kvm_set_user_memory_region(s, mem);
706
    if (err) {
707
        fprintf(stderr, "%s: error registering slot: %s\n", __func__,
708
                strerror(-err));
709
        abort();
710
    }
711
}
712

    
713
int kvm_ioctl(KVMState *s, int type, ...)
714
{
715
    int ret;
716
    void *arg;
717
    va_list ap;
718

    
719
    va_start(ap, type);
720
    arg = va_arg(ap, void *);
721
    va_end(ap);
722

    
723
    ret = ioctl(s->fd, type, arg);
724
    if (ret == -1)
725
        ret = -errno;
726

    
727
    return ret;
728
}
729

    
730
int kvm_vm_ioctl(KVMState *s, int type, ...)
731
{
732
    int ret;
733
    void *arg;
734
    va_list ap;
735

    
736
    va_start(ap, type);
737
    arg = va_arg(ap, void *);
738
    va_end(ap);
739

    
740
    ret = ioctl(s->vmfd, type, arg);
741
    if (ret == -1)
742
        ret = -errno;
743

    
744
    return ret;
745
}
746

    
747
int kvm_vcpu_ioctl(CPUState *env, int type, ...)
748
{
749
    int ret;
750
    void *arg;
751
    va_list ap;
752

    
753
    va_start(ap, type);
754
    arg = va_arg(ap, void *);
755
    va_end(ap);
756

    
757
    ret = ioctl(env->kvm_fd, type, arg);
758
    if (ret == -1)
759
        ret = -errno;
760

    
761
    return ret;
762
}
763

    
764
int kvm_has_sync_mmu(void)
765
{
766
#ifdef KVM_CAP_SYNC_MMU
767
    KVMState *s = kvm_state;
768

    
769
    if (kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_SYNC_MMU) > 0)
770
        return 1;
771
#endif
772

    
773
    return 0;
774
}
775

    
776
void kvm_setup_guest_memory(void *start, size_t size)
777
{
778
    if (!kvm_has_sync_mmu()) {
779
#ifdef MADV_DONTFORK
780
        int ret = madvise(start, size, MADV_DONTFORK);
781

    
782
        if (ret) {
783
            perror("madvice");
784
            exit(1);
785
        }
786
#else
787
        fprintf(stderr,
788
                "Need MADV_DONTFORK in absence of synchronous KVM MMU\n");
789
        exit(1);
790
#endif
791
    }
792
}
793

    
794
#ifdef KVM_CAP_SET_GUEST_DEBUG
795
struct kvm_sw_breakpoint *kvm_find_sw_breakpoint(CPUState *env,
796
                                                 target_ulong pc)
797
{
798
    struct kvm_sw_breakpoint *bp;
799

    
800
    TAILQ_FOREACH(bp, &env->kvm_state->kvm_sw_breakpoints, entry) {
801
        if (bp->pc == pc)
802
            return bp;
803
    }
804
    return NULL;
805
}
806

    
807
int kvm_sw_breakpoints_active(CPUState *env)
808
{
809
    return !TAILQ_EMPTY(&env->kvm_state->kvm_sw_breakpoints);
810
}
811

    
812
int kvm_update_guest_debug(CPUState *env, unsigned long reinject_trap)
813
{
814
    struct kvm_guest_debug dbg;
815

    
816
    dbg.control = 0;
817
    if (env->singlestep_enabled)
818
        dbg.control = KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP;
819

    
820
    kvm_arch_update_guest_debug(env, &dbg);
821
    dbg.control |= reinject_trap;
822

    
823
    return kvm_vcpu_ioctl(env, KVM_SET_GUEST_DEBUG, &dbg);
824
}
825

    
826
int kvm_insert_breakpoint(CPUState *current_env, target_ulong addr,
827
                          target_ulong len, int type)
828
{
829
    struct kvm_sw_breakpoint *bp;
830
    CPUState *env;
831
    int err;
832

    
833
    if (type == GDB_BREAKPOINT_SW) {
834
        bp = kvm_find_sw_breakpoint(current_env, addr);
835
        if (bp) {
836
            bp->use_count++;
837
            return 0;
838
        }
839

    
840
        bp = qemu_malloc(sizeof(struct kvm_sw_breakpoint));
841
        if (!bp)
842
            return -ENOMEM;
843

    
844
        bp->pc = addr;
845
        bp->use_count = 1;
846
        err = kvm_arch_insert_sw_breakpoint(current_env, bp);
847
        if (err) {
848
            free(bp);
849
            return err;
850
        }
851

    
852
        TAILQ_INSERT_HEAD(&current_env->kvm_state->kvm_sw_breakpoints,
853
                          bp, entry);
854
    } else {
855
        err = kvm_arch_insert_hw_breakpoint(addr, len, type);
856
        if (err)
857
            return err;
858
    }
859

    
860
    for (env = first_cpu; env != NULL; env = env->next_cpu) {
861
        err = kvm_update_guest_debug(env, 0);
862
        if (err)
863
            return err;
864
    }
865
    return 0;
866
}
867

    
868
int kvm_remove_breakpoint(CPUState *current_env, target_ulong addr,
869
                          target_ulong len, int type)
870
{
871
    struct kvm_sw_breakpoint *bp;
872
    CPUState *env;
873
    int err;
874

    
875
    if (type == GDB_BREAKPOINT_SW) {
876
        bp = kvm_find_sw_breakpoint(current_env, addr);
877
        if (!bp)
878
            return -ENOENT;
879

    
880
        if (bp->use_count > 1) {
881
            bp->use_count--;
882
            return 0;
883
        }
884

    
885
        err = kvm_arch_remove_sw_breakpoint(current_env, bp);
886
        if (err)
887
            return err;
888

    
889
        TAILQ_REMOVE(&current_env->kvm_state->kvm_sw_breakpoints, bp, entry);
890
        qemu_free(bp);
891
    } else {
892
        err = kvm_arch_remove_hw_breakpoint(addr, len, type);
893
        if (err)
894
            return err;
895
    }
896

    
897
    for (env = first_cpu; env != NULL; env = env->next_cpu) {
898
        err = kvm_update_guest_debug(env, 0);
899
        if (err)
900
            return err;
901
    }
902
    return 0;
903
}
904

    
905
void kvm_remove_all_breakpoints(CPUState *current_env)
906
{
907
    struct kvm_sw_breakpoint *bp, *next;
908
    KVMState *s = current_env->kvm_state;
909
    CPUState *env;
910

    
911
    TAILQ_FOREACH_SAFE(bp, &s->kvm_sw_breakpoints, entry, next) {
912
        if (kvm_arch_remove_sw_breakpoint(current_env, bp) != 0) {
913
            /* Try harder to find a CPU that currently sees the breakpoint. */
914
            for (env = first_cpu; env != NULL; env = env->next_cpu) {
915
                if (kvm_arch_remove_sw_breakpoint(env, bp) == 0)
916
                    break;
917
            }
918
        }
919
    }
920
    kvm_arch_remove_all_hw_breakpoints();
921

    
922
    for (env = first_cpu; env != NULL; env = env->next_cpu)
923
        kvm_update_guest_debug(env, 0);
924
}
925

    
926
#else /* !KVM_CAP_SET_GUEST_DEBUG */
927

    
928
int kvm_update_guest_debug(CPUState *env, unsigned long reinject_trap)
929
{
930
    return -EINVAL;
931
}
932

    
933
int kvm_insert_breakpoint(CPUState *current_env, target_ulong addr,
934
                          target_ulong len, int type)
935
{
936
    return -EINVAL;
937
}
938

    
939
int kvm_remove_breakpoint(CPUState *current_env, target_ulong addr,
940
                          target_ulong len, int type)
941
{
942
    return -EINVAL;
943
}
944

    
945
void kvm_remove_all_breakpoints(CPUState *current_env)
946
{
947
}
948
#endif /* !KVM_CAP_SET_GUEST_DEBUG */