kvm: Conditionally apply workaround for KVM slot handling bug
[qemu] / kvm-all.c
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     int broken_set_mem_region;
61 #ifdef KVM_CAP_SET_GUEST_DEBUG
62     struct kvm_sw_breakpoint_head kvm_sw_breakpoints;
63 #endif
64 };
65
66 static KVMState *kvm_state;
67
68 static KVMSlot *kvm_alloc_slot(KVMState *s)
69 {
70     int i;
71
72     for (i = 0; i < ARRAY_SIZE(s->slots); i++) {
73         /* KVM private memory slots */
74         if (i >= 8 && i < 12)
75             continue;
76         if (s->slots[i].memory_size == 0)
77             return &s->slots[i];
78     }
79
80     fprintf(stderr, "%s: no free slot available\n", __func__);
81     abort();
82 }
83
84 static KVMSlot *kvm_lookup_matching_slot(KVMState *s,
85                                          target_phys_addr_t start_addr,
86                                          target_phys_addr_t end_addr)
87 {
88     int i;
89
90     for (i = 0; i < ARRAY_SIZE(s->slots); i++) {
91         KVMSlot *mem = &s->slots[i];
92
93         if (start_addr == mem->start_addr &&
94             end_addr == mem->start_addr + mem->memory_size) {
95             return mem;
96         }
97     }
98
99     return NULL;
100 }
101
102 /*
103  * Find overlapping slot with lowest start address
104  */
105 static KVMSlot *kvm_lookup_overlapping_slot(KVMState *s,
106                                             target_phys_addr_t start_addr,
107                                             target_phys_addr_t end_addr)
108 {
109     KVMSlot *found = NULL;
110     int i;
111
112     for (i = 0; i < ARRAY_SIZE(s->slots); i++) {
113         KVMSlot *mem = &s->slots[i];
114
115         if (mem->memory_size == 0 ||
116             (found && found->start_addr < mem->start_addr)) {
117             continue;
118         }
119
120         if (end_addr > mem->start_addr &&
121             start_addr < mem->start_addr + mem->memory_size) {
122             found = mem;
123         }
124     }
125
126     return found;
127 }
128
129 static int kvm_set_user_memory_region(KVMState *s, KVMSlot *slot)
130 {
131     struct kvm_userspace_memory_region mem;
132
133     mem.slot = slot->slot;
134     mem.guest_phys_addr = slot->start_addr;
135     mem.memory_size = slot->memory_size;
136     mem.userspace_addr = (unsigned long)qemu_get_ram_ptr(slot->phys_offset);
137     mem.flags = slot->flags;
138
139     return kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, &mem);
140 }
141
142
143 int kvm_init_vcpu(CPUState *env)
144 {
145     KVMState *s = kvm_state;
146     long mmap_size;
147     int ret;
148
149     dprintf("kvm_init_vcpu\n");
150
151     ret = kvm_vm_ioctl(s, KVM_CREATE_VCPU, env->cpu_index);
152     if (ret < 0) {
153         dprintf("kvm_create_vcpu failed\n");
154         goto err;
155     }
156
157     env->kvm_fd = ret;
158     env->kvm_state = s;
159
160     mmap_size = kvm_ioctl(s, KVM_GET_VCPU_MMAP_SIZE, 0);
161     if (mmap_size < 0) {
162         dprintf("KVM_GET_VCPU_MMAP_SIZE failed\n");
163         goto err;
164     }
165
166     env->kvm_run = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED,
167                         env->kvm_fd, 0);
168     if (env->kvm_run == MAP_FAILED) {
169         ret = -errno;
170         dprintf("mmap'ing vcpu state failed\n");
171         goto err;
172     }
173
174     ret = kvm_arch_init_vcpu(env);
175
176 err:
177     return ret;
178 }
179
180 int kvm_sync_vcpus(void)
181 {
182     CPUState *env;
183
184     for (env = first_cpu; env != NULL; env = env->next_cpu) {
185         int ret;
186
187         ret = kvm_arch_put_registers(env);
188         if (ret)
189             return ret;
190     }
191
192     return 0;
193 }
194
195 /*
196  * dirty pages logging control
197  */
198 static int kvm_dirty_pages_log_change(target_phys_addr_t phys_addr,
199                                       ram_addr_t size, unsigned flags,
200                                       unsigned mask)
201 {
202     KVMState *s = kvm_state;
203     KVMSlot *mem = kvm_lookup_matching_slot(s, phys_addr, phys_addr + size);
204     if (mem == NULL)  {
205             fprintf(stderr, "BUG: %s: invalid parameters " TARGET_FMT_plx "-"
206                     TARGET_FMT_plx "\n", __func__, phys_addr,
207                     phys_addr + size - 1);
208             return -EINVAL;
209     }
210
211     flags = (mem->flags & ~mask) | flags;
212     /* Nothing changed, no need to issue ioctl */
213     if (flags == mem->flags)
214             return 0;
215
216     mem->flags = flags;
217
218     return kvm_set_user_memory_region(s, mem);
219 }
220
221 int kvm_log_start(target_phys_addr_t phys_addr, ram_addr_t size)
222 {
223         return kvm_dirty_pages_log_change(phys_addr, size,
224                                           KVM_MEM_LOG_DIRTY_PAGES,
225                                           KVM_MEM_LOG_DIRTY_PAGES);
226 }
227
228 int kvm_log_stop(target_phys_addr_t phys_addr, ram_addr_t size)
229 {
230         return kvm_dirty_pages_log_change(phys_addr, size,
231                                           0,
232                                           KVM_MEM_LOG_DIRTY_PAGES);
233 }
234
235 /**
236  * kvm_physical_sync_dirty_bitmap - Grab dirty bitmap from kernel space
237  * This function updates qemu's dirty bitmap using cpu_physical_memory_set_dirty().
238  * This means all bits are set to dirty.
239  *
240  * @start_add: start of logged region.
241  * @end_addr: end of logged region.
242  */
243 void kvm_physical_sync_dirty_bitmap(target_phys_addr_t start_addr,
244                                     target_phys_addr_t end_addr)
245 {
246     KVMState *s = kvm_state;
247     KVMDirtyLog d;
248     KVMSlot *mem = kvm_lookup_matching_slot(s, start_addr, end_addr);
249     unsigned long alloc_size;
250     ram_addr_t addr;
251     target_phys_addr_t phys_addr = start_addr;
252
253     dprintf("sync addr: " TARGET_FMT_lx " into %lx\n", start_addr,
254             mem->phys_offset);
255     if (mem == NULL) {
256             fprintf(stderr, "BUG: %s: invalid parameters " TARGET_FMT_plx "-"
257                     TARGET_FMT_plx "\n", __func__, phys_addr, end_addr - 1);
258             return;
259     }
260
261     alloc_size = mem->memory_size >> TARGET_PAGE_BITS / sizeof(d.dirty_bitmap);
262     d.dirty_bitmap = qemu_mallocz(alloc_size);
263
264     d.slot = mem->slot;
265     dprintf("slot %d, phys_addr %llx, uaddr: %llx\n",
266             d.slot, mem->start_addr, mem->phys_offset);
267
268     if (kvm_vm_ioctl(s, KVM_GET_DIRTY_LOG, &d) == -1) {
269         dprintf("ioctl failed %d\n", errno);
270         goto out;
271     }
272
273     phys_addr = start_addr;
274     for (addr = mem->phys_offset; phys_addr < end_addr; phys_addr+= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
275         unsigned long *bitmap = (unsigned long *)d.dirty_bitmap;
276         unsigned nr = (phys_addr - start_addr) >> TARGET_PAGE_BITS;
277         unsigned word = nr / (sizeof(*bitmap) * 8);
278         unsigned bit = nr % (sizeof(*bitmap) * 8);
279         if ((bitmap[word] >> bit) & 1)
280             cpu_physical_memory_set_dirty(addr);
281     }
282 out:
283     qemu_free(d.dirty_bitmap);
284 }
285
286 int kvm_coalesce_mmio_region(target_phys_addr_t start, ram_addr_t size)
287 {
288     int ret = -ENOSYS;
289 #ifdef KVM_CAP_COALESCED_MMIO
290     KVMState *s = kvm_state;
291
292     if (s->coalesced_mmio) {
293         struct kvm_coalesced_mmio_zone zone;
294
295         zone.addr = start;
296         zone.size = size;
297
298         ret = kvm_vm_ioctl(s, KVM_REGISTER_COALESCED_MMIO, &zone);
299     }
300 #endif
301
302     return ret;
303 }
304
305 int kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size)
306 {
307     int ret = -ENOSYS;
308 #ifdef KVM_CAP_COALESCED_MMIO
309     KVMState *s = kvm_state;
310
311     if (s->coalesced_mmio) {
312         struct kvm_coalesced_mmio_zone zone;
313
314         zone.addr = start;
315         zone.size = size;
316
317         ret = kvm_vm_ioctl(s, KVM_UNREGISTER_COALESCED_MMIO, &zone);
318     }
319 #endif
320
321     return ret;
322 }
323
324 int kvm_check_extension(KVMState *s, unsigned int extension)
325 {
326     int ret;
327
328     ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, extension);
329     if (ret < 0) {
330         ret = 0;
331     }
332
333     return ret;
334 }
335
336 int kvm_init(int smp_cpus)
337 {
338     KVMState *s;
339     int ret;
340     int i;
341
342     if (smp_cpus > 1) {
343         fprintf(stderr, "No SMP KVM support, use '-smp 1'\n");
344         return -EINVAL;
345     }
346
347     s = qemu_mallocz(sizeof(KVMState));
348
349 #ifdef KVM_CAP_SET_GUEST_DEBUG
350     TAILQ_INIT(&s->kvm_sw_breakpoints);
351 #endif
352     for (i = 0; i < ARRAY_SIZE(s->slots); i++)
353         s->slots[i].slot = i;
354
355     s->vmfd = -1;
356     s->fd = open("/dev/kvm", O_RDWR);
357     if (s->fd == -1) {
358         fprintf(stderr, "Could not access KVM kernel module: %m\n");
359         ret = -errno;
360         goto err;
361     }
362
363     ret = kvm_ioctl(s, KVM_GET_API_VERSION, 0);
364     if (ret < KVM_API_VERSION) {
365         if (ret > 0)
366             ret = -EINVAL;
367         fprintf(stderr, "kvm version too old\n");
368         goto err;
369     }
370
371     if (ret > KVM_API_VERSION) {
372         ret = -EINVAL;
373         fprintf(stderr, "kvm version not supported\n");
374         goto err;
375     }
376
377     s->vmfd = kvm_ioctl(s, KVM_CREATE_VM, 0);
378     if (s->vmfd < 0)
379         goto err;
380
381     /* initially, KVM allocated its own memory and we had to jump through
382      * hooks to make phys_ram_base point to this.  Modern versions of KVM
383      * just use a user allocated buffer so we can use regular pages
384      * unmodified.  Make sure we have a sufficiently modern version of KVM.
385      */
386     if (!kvm_check_extension(s, KVM_CAP_USER_MEMORY)) {
387         ret = -EINVAL;
388         fprintf(stderr, "kvm does not support KVM_CAP_USER_MEMORY\n");
389         goto err;
390     }
391
392     /* There was a nasty bug in < kvm-80 that prevents memory slots from being
393      * destroyed properly.  Since we rely on this capability, refuse to work
394      * with any kernel without this capability. */
395     if (!kvm_check_extension(s, KVM_CAP_DESTROY_MEMORY_REGION_WORKS)) {
396         ret = -EINVAL;
397
398         fprintf(stderr,
399                 "KVM kernel module broken (DESTROY_MEMORY_REGION)\n"
400                 "Please upgrade to at least kvm-81.\n");
401         goto err;
402     }
403
404 #ifdef KVM_CAP_COALESCED_MMIO
405     s->coalesced_mmio = kvm_check_extension(s, KVM_CAP_COALESCED_MMIO);
406 #else
407     s->coalesced_mmio = 0;
408 #endif
409
410     s->broken_set_mem_region = 1;
411 #ifdef KVM_CAP_JOIN_MEMORY_REGIONS_WORKS
412     ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_JOIN_MEMORY_REGIONS_WORKS);
413     if (ret > 0) {
414         s->broken_set_mem_region = 0;
415     }
416 #endif
417
418     ret = kvm_arch_init(s, smp_cpus);
419     if (ret < 0)
420         goto err;
421
422     kvm_state = s;
423
424     return 0;
425
426 err:
427     if (s) {
428         if (s->vmfd != -1)
429             close(s->vmfd);
430         if (s->fd != -1)
431             close(s->fd);
432     }
433     qemu_free(s);
434
435     return ret;
436 }
437
438 static int kvm_handle_io(CPUState *env, uint16_t port, void *data,
439                          int direction, int size, uint32_t count)
440 {
441     int i;
442     uint8_t *ptr = data;
443
444     for (i = 0; i < count; i++) {
445         if (direction == KVM_EXIT_IO_IN) {
446             switch (size) {
447             case 1:
448                 stb_p(ptr, cpu_inb(env, port));
449                 break;
450             case 2:
451                 stw_p(ptr, cpu_inw(env, port));
452                 break;
453             case 4:
454                 stl_p(ptr, cpu_inl(env, port));
455                 break;
456             }
457         } else {
458             switch (size) {
459             case 1:
460                 cpu_outb(env, port, ldub_p(ptr));
461                 break;
462             case 2:
463                 cpu_outw(env, port, lduw_p(ptr));
464                 break;
465             case 4:
466                 cpu_outl(env, port, ldl_p(ptr));
467                 break;
468             }
469         }
470
471         ptr += size;
472     }
473
474     return 1;
475 }
476
477 static void kvm_run_coalesced_mmio(CPUState *env, struct kvm_run *run)
478 {
479 #ifdef KVM_CAP_COALESCED_MMIO
480     KVMState *s = kvm_state;
481     if (s->coalesced_mmio) {
482         struct kvm_coalesced_mmio_ring *ring;
483
484         ring = (void *)run + (s->coalesced_mmio * TARGET_PAGE_SIZE);
485         while (ring->first != ring->last) {
486             struct kvm_coalesced_mmio *ent;
487
488             ent = &ring->coalesced_mmio[ring->first];
489
490             cpu_physical_memory_write(ent->phys_addr, ent->data, ent->len);
491             /* FIXME smp_wmb() */
492             ring->first = (ring->first + 1) % KVM_COALESCED_MMIO_MAX;
493         }
494     }
495 #endif
496 }
497
498 int kvm_cpu_exec(CPUState *env)
499 {
500     struct kvm_run *run = env->kvm_run;
501     int ret;
502
503     dprintf("kvm_cpu_exec()\n");
504
505     do {
506         kvm_arch_pre_run(env, run);
507
508         if (env->exit_request) {
509             dprintf("interrupt exit requested\n");
510             ret = 0;
511             break;
512         }
513
514         ret = kvm_vcpu_ioctl(env, KVM_RUN, 0);
515         kvm_arch_post_run(env, run);
516
517         if (ret == -EINTR || ret == -EAGAIN) {
518             dprintf("io window exit\n");
519             ret = 0;
520             break;
521         }
522
523         if (ret < 0) {
524             dprintf("kvm run failed %s\n", strerror(-ret));
525             abort();
526         }
527
528         kvm_run_coalesced_mmio(env, run);
529
530         ret = 0; /* exit loop */
531         switch (run->exit_reason) {
532         case KVM_EXIT_IO:
533             dprintf("handle_io\n");
534             ret = kvm_handle_io(env, run->io.port,
535                                 (uint8_t *)run + run->io.data_offset,
536                                 run->io.direction,
537                                 run->io.size,
538                                 run->io.count);
539             break;
540         case KVM_EXIT_MMIO:
541             dprintf("handle_mmio\n");
542             cpu_physical_memory_rw(run->mmio.phys_addr,
543                                    run->mmio.data,
544                                    run->mmio.len,
545                                    run->mmio.is_write);
546             ret = 1;
547             break;
548         case KVM_EXIT_IRQ_WINDOW_OPEN:
549             dprintf("irq_window_open\n");
550             break;
551         case KVM_EXIT_SHUTDOWN:
552             dprintf("shutdown\n");
553             qemu_system_reset_request();
554             ret = 1;
555             break;
556         case KVM_EXIT_UNKNOWN:
557             dprintf("kvm_exit_unknown\n");
558             break;
559         case KVM_EXIT_FAIL_ENTRY:
560             dprintf("kvm_exit_fail_entry\n");
561             break;
562         case KVM_EXIT_EXCEPTION:
563             dprintf("kvm_exit_exception\n");
564             break;
565         case KVM_EXIT_DEBUG:
566             dprintf("kvm_exit_debug\n");
567 #ifdef KVM_CAP_SET_GUEST_DEBUG
568             if (kvm_arch_debug(&run->debug.arch)) {
569                 gdb_set_stop_cpu(env);
570                 vm_stop(EXCP_DEBUG);
571                 env->exception_index = EXCP_DEBUG;
572                 return 0;
573             }
574             /* re-enter, this exception was guest-internal */
575             ret = 1;
576 #endif /* KVM_CAP_SET_GUEST_DEBUG */
577             break;
578         default:
579             dprintf("kvm_arch_handle_exit\n");
580             ret = kvm_arch_handle_exit(env, run);
581             break;
582         }
583     } while (ret > 0);
584
585     if (env->exit_request) {
586         env->exit_request = 0;
587         env->exception_index = EXCP_INTERRUPT;
588     }
589
590     return ret;
591 }
592
593 void kvm_set_phys_mem(target_phys_addr_t start_addr,
594                       ram_addr_t size,
595                       ram_addr_t phys_offset)
596 {
597     KVMState *s = kvm_state;
598     ram_addr_t flags = phys_offset & ~TARGET_PAGE_MASK;
599     KVMSlot *mem, old;
600     int err;
601
602     if (start_addr & ~TARGET_PAGE_MASK) {
603         if (flags >= IO_MEM_UNASSIGNED) {
604             if (!kvm_lookup_overlapping_slot(s, start_addr,
605                                              start_addr + size)) {
606                 return;
607             }
608             fprintf(stderr, "Unaligned split of a KVM memory slot\n");
609         } else {
610             fprintf(stderr, "Only page-aligned memory slots supported\n");
611         }
612         abort();
613     }
614
615     /* KVM does not support read-only slots */
616     phys_offset &= ~IO_MEM_ROM;
617
618     while (1) {
619         mem = kvm_lookup_overlapping_slot(s, start_addr, start_addr + size);
620         if (!mem) {
621             break;
622         }
623
624         if (flags < IO_MEM_UNASSIGNED && start_addr >= mem->start_addr &&
625             (start_addr + size <= mem->start_addr + mem->memory_size) &&
626             (phys_offset - start_addr == mem->phys_offset - mem->start_addr)) {
627             /* The new slot fits into the existing one and comes with
628              * identical parameters - nothing to be done. */
629             return;
630         }
631
632         old = *mem;
633
634         /* unregister the overlapping slot */
635         mem->memory_size = 0;
636         err = kvm_set_user_memory_region(s, mem);
637         if (err) {
638             fprintf(stderr, "%s: error unregistering overlapping slot: %s\n",
639                     __func__, strerror(-err));
640             abort();
641         }
642
643         /* Workaround for older KVM versions: we can't join slots, even not by
644          * unregistering the previous ones and then registering the larger
645          * slot. We have to maintain the existing fragmentation. Sigh.
646          *
647          * This workaround assumes that the new slot starts at the same
648          * address as the first existing one. If not or if some overlapping
649          * slot comes around later, we will fail (not seen in practice so far)
650          * - and actually require a recent KVM version. */
651         if (s->broken_set_mem_region &&
652             old.start_addr == start_addr && old.memory_size < size &&
653             flags < IO_MEM_UNASSIGNED) {
654             mem = kvm_alloc_slot(s);
655             mem->memory_size = old.memory_size;
656             mem->start_addr = old.start_addr;
657             mem->phys_offset = old.phys_offset;
658             mem->flags = 0;
659
660             err = kvm_set_user_memory_region(s, mem);
661             if (err) {
662                 fprintf(stderr, "%s: error updating slot: %s\n", __func__,
663                         strerror(-err));
664                 abort();
665             }
666
667             start_addr += old.memory_size;
668             phys_offset += old.memory_size;
669             size -= old.memory_size;
670             continue;
671         }
672
673         /* register prefix slot */
674         if (old.start_addr < start_addr) {
675             mem = kvm_alloc_slot(s);
676             mem->memory_size = start_addr - old.start_addr;
677             mem->start_addr = old.start_addr;
678             mem->phys_offset = old.phys_offset;
679             mem->flags = 0;
680
681             err = kvm_set_user_memory_region(s, mem);
682             if (err) {
683                 fprintf(stderr, "%s: error registering prefix slot: %s\n",
684                         __func__, strerror(-err));
685                 abort();
686             }
687         }
688
689         /* register suffix slot */
690         if (old.start_addr + old.memory_size > start_addr + size) {
691             ram_addr_t size_delta;
692
693             mem = kvm_alloc_slot(s);
694             mem->start_addr = start_addr + size;
695             size_delta = mem->start_addr - old.start_addr;
696             mem->memory_size = old.memory_size - size_delta;
697             mem->phys_offset = old.phys_offset + size_delta;
698             mem->flags = 0;
699
700             err = kvm_set_user_memory_region(s, mem);
701             if (err) {
702                 fprintf(stderr, "%s: error registering suffix slot: %s\n",
703                         __func__, strerror(-err));
704                 abort();
705             }
706         }
707     }
708
709     /* in case the KVM bug workaround already "consumed" the new slot */
710     if (!size)
711         return;
712
713     /* KVM does not need to know about this memory */
714     if (flags >= IO_MEM_UNASSIGNED)
715         return;
716
717     mem = kvm_alloc_slot(s);
718     mem->memory_size = size;
719     mem->start_addr = start_addr;
720     mem->phys_offset = phys_offset;
721     mem->flags = 0;
722
723     err = kvm_set_user_memory_region(s, mem);
724     if (err) {
725         fprintf(stderr, "%s: error registering slot: %s\n", __func__,
726                 strerror(-err));
727         abort();
728     }
729 }
730
731 int kvm_ioctl(KVMState *s, int type, ...)
732 {
733     int ret;
734     void *arg;
735     va_list ap;
736
737     va_start(ap, type);
738     arg = va_arg(ap, void *);
739     va_end(ap);
740
741     ret = ioctl(s->fd, type, arg);
742     if (ret == -1)
743         ret = -errno;
744
745     return ret;
746 }
747
748 int kvm_vm_ioctl(KVMState *s, int type, ...)
749 {
750     int ret;
751     void *arg;
752     va_list ap;
753
754     va_start(ap, type);
755     arg = va_arg(ap, void *);
756     va_end(ap);
757
758     ret = ioctl(s->vmfd, type, arg);
759     if (ret == -1)
760         ret = -errno;
761
762     return ret;
763 }
764
765 int kvm_vcpu_ioctl(CPUState *env, int type, ...)
766 {
767     int ret;
768     void *arg;
769     va_list ap;
770
771     va_start(ap, type);
772     arg = va_arg(ap, void *);
773     va_end(ap);
774
775     ret = ioctl(env->kvm_fd, type, arg);
776     if (ret == -1)
777         ret = -errno;
778
779     return ret;
780 }
781
782 int kvm_has_sync_mmu(void)
783 {
784 #ifdef KVM_CAP_SYNC_MMU
785     KVMState *s = kvm_state;
786
787     return kvm_check_extension(s, KVM_CAP_SYNC_MMU);
788 #else
789     return 0;
790 #endif
791 }
792
793 void kvm_setup_guest_memory(void *start, size_t size)
794 {
795     if (!kvm_has_sync_mmu()) {
796 #ifdef MADV_DONTFORK
797         int ret = madvise(start, size, MADV_DONTFORK);
798
799         if (ret) {
800             perror("madvice");
801             exit(1);
802         }
803 #else
804         fprintf(stderr,
805                 "Need MADV_DONTFORK in absence of synchronous KVM MMU\n");
806         exit(1);
807 #endif
808     }
809 }
810
811 #ifdef KVM_CAP_SET_GUEST_DEBUG
812 struct kvm_sw_breakpoint *kvm_find_sw_breakpoint(CPUState *env,
813                                                  target_ulong pc)
814 {
815     struct kvm_sw_breakpoint *bp;
816
817     TAILQ_FOREACH(bp, &env->kvm_state->kvm_sw_breakpoints, entry) {
818         if (bp->pc == pc)
819             return bp;
820     }
821     return NULL;
822 }
823
824 int kvm_sw_breakpoints_active(CPUState *env)
825 {
826     return !TAILQ_EMPTY(&env->kvm_state->kvm_sw_breakpoints);
827 }
828
829 int kvm_update_guest_debug(CPUState *env, unsigned long reinject_trap)
830 {
831     struct kvm_guest_debug dbg;
832
833     dbg.control = 0;
834     if (env->singlestep_enabled)
835         dbg.control = KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP;
836
837     kvm_arch_update_guest_debug(env, &dbg);
838     dbg.control |= reinject_trap;
839
840     return kvm_vcpu_ioctl(env, KVM_SET_GUEST_DEBUG, &dbg);
841 }
842
843 int kvm_insert_breakpoint(CPUState *current_env, target_ulong addr,
844                           target_ulong len, int type)
845 {
846     struct kvm_sw_breakpoint *bp;
847     CPUState *env;
848     int err;
849
850     if (type == GDB_BREAKPOINT_SW) {
851         bp = kvm_find_sw_breakpoint(current_env, addr);
852         if (bp) {
853             bp->use_count++;
854             return 0;
855         }
856
857         bp = qemu_malloc(sizeof(struct kvm_sw_breakpoint));
858         if (!bp)
859             return -ENOMEM;
860
861         bp->pc = addr;
862         bp->use_count = 1;
863         err = kvm_arch_insert_sw_breakpoint(current_env, bp);
864         if (err) {
865             free(bp);
866             return err;
867         }
868
869         TAILQ_INSERT_HEAD(&current_env->kvm_state->kvm_sw_breakpoints,
870                           bp, entry);
871     } else {
872         err = kvm_arch_insert_hw_breakpoint(addr, len, type);
873         if (err)
874             return err;
875     }
876
877     for (env = first_cpu; env != NULL; env = env->next_cpu) {
878         err = kvm_update_guest_debug(env, 0);
879         if (err)
880             return err;
881     }
882     return 0;
883 }
884
885 int kvm_remove_breakpoint(CPUState *current_env, target_ulong addr,
886                           target_ulong len, int type)
887 {
888     struct kvm_sw_breakpoint *bp;
889     CPUState *env;
890     int err;
891
892     if (type == GDB_BREAKPOINT_SW) {
893         bp = kvm_find_sw_breakpoint(current_env, addr);
894         if (!bp)
895             return -ENOENT;
896
897         if (bp->use_count > 1) {
898             bp->use_count--;
899             return 0;
900         }
901
902         err = kvm_arch_remove_sw_breakpoint(current_env, bp);
903         if (err)
904             return err;
905
906         TAILQ_REMOVE(&current_env->kvm_state->kvm_sw_breakpoints, bp, entry);
907         qemu_free(bp);
908     } else {
909         err = kvm_arch_remove_hw_breakpoint(addr, len, type);
910         if (err)
911             return err;
912     }
913
914     for (env = first_cpu; env != NULL; env = env->next_cpu) {
915         err = kvm_update_guest_debug(env, 0);
916         if (err)
917             return err;
918     }
919     return 0;
920 }
921
922 void kvm_remove_all_breakpoints(CPUState *current_env)
923 {
924     struct kvm_sw_breakpoint *bp, *next;
925     KVMState *s = current_env->kvm_state;
926     CPUState *env;
927
928     TAILQ_FOREACH_SAFE(bp, &s->kvm_sw_breakpoints, entry, next) {
929         if (kvm_arch_remove_sw_breakpoint(current_env, bp) != 0) {
930             /* Try harder to find a CPU that currently sees the breakpoint. */
931             for (env = first_cpu; env != NULL; env = env->next_cpu) {
932                 if (kvm_arch_remove_sw_breakpoint(env, bp) == 0)
933                     break;
934             }
935         }
936     }
937     kvm_arch_remove_all_hw_breakpoints();
938
939     for (env = first_cpu; env != NULL; env = env->next_cpu)
940         kvm_update_guest_debug(env, 0);
941 }
942
943 #else /* !KVM_CAP_SET_GUEST_DEBUG */
944
945 int kvm_update_guest_debug(CPUState *env, unsigned long reinject_trap)
946 {
947     return -EINVAL;
948 }
949
950 int kvm_insert_breakpoint(CPUState *current_env, target_ulong addr,
951                           target_ulong len, int type)
952 {
953     return -EINVAL;
954 }
955
956 int kvm_remove_breakpoint(CPUState *current_env, target_ulong addr,
957                           target_ulong len, int type)
958 {
959     return -EINVAL;
960 }
961
962 void kvm_remove_all_breakpoints(CPUState *current_env)
963 {
964 }
965 #endif /* !KVM_CAP_SET_GUEST_DEBUG */