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