11321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima/*
21321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima * QEMU KVM support
31321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima *
41321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima * Copyright IBM, Corp. 2008
51321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima *           Red Hat, Inc. 2008
61321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima *
71321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima * Authors:
81321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima *  Anthony Liguori   <aliguori@us.ibm.com>
91321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima *  Glauber Costa     <gcosta@redhat.com>
101321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima *
111321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima * This work is licensed under the terms of the GNU GPL, version 2 or later.
121321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima * See the COPYING file in the top-level directory.
131321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima *
141321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima */
151321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
161321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#include <sys/types.h>
171321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#include <sys/ioctl.h>
181321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#include <sys/mman.h>
191321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#include <stdarg.h>
201321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
211321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#include <linux/kvm.h>
221321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
231321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#include "qemu-common.h"
241321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#include "sysemu.h"
251321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#include "hw/hw.h"
261321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#include "gdbstub.h"
271321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#include "kvm.h"
281321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
291321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima/* KVM uses PAGE_SIZE in it's definition of COALESCED_MMIO_MAX */
301321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#define PAGE_SIZE TARGET_PAGE_SIZE
311321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
321321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima//#define DEBUG_KVM
331321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
341321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#ifdef DEBUG_KVM
351321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#define dprintf(fmt, ...) \
361321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
371321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#else
381321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#define dprintf(fmt, ...) \
391321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    do { } while (0)
401321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#endif
411321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
421321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimatypedef struct KVMSlot
431321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
441321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    target_phys_addr_t start_addr;
451321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    ram_addr_t memory_size;
461321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    ram_addr_t phys_offset;
471321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int slot;
481321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int flags;
491321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima} KVMSlot;
501321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
511321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimatypedef struct kvm_dirty_log KVMDirtyLog;
521321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
531321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_allowed = 0;
541321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
551321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimastruct KVMState
561321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
571321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMSlot slots[32];
581321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int fd;
591321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int vmfd;
601321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int coalesced_mmio;
611321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int broken_set_mem_region;
621321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int migration_log;
631321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#ifdef KVM_CAP_SET_GUEST_DEBUG
641321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    struct kvm_sw_breakpoint_head kvm_sw_breakpoints;
651321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#endif
661321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima};
671321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
681321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimastatic KVMState *kvm_state;
691321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
701321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimastatic KVMSlot *kvm_alloc_slot(KVMState *s)
711321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
721321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int i;
731321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
741321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    for (i = 0; i < ARRAY_SIZE(s->slots); i++) {
751321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        /* KVM private memory slots */
761321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (i >= 8 && i < 12)
771321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            continue;
781321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (s->slots[i].memory_size == 0)
791321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return &s->slots[i];
801321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
811321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
821321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    fprintf(stderr, "%s: no free slot available\n", __func__);
831321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    abort();
841321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
851321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
861321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimastatic KVMSlot *kvm_lookup_matching_slot(KVMState *s,
871321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                         target_phys_addr_t start_addr,
881321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                         target_phys_addr_t end_addr)
891321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
901321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int i;
911321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
921321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    for (i = 0; i < ARRAY_SIZE(s->slots); i++) {
931321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        KVMSlot *mem = &s->slots[i];
941321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
951321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (start_addr == mem->start_addr &&
961321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            end_addr == mem->start_addr + mem->memory_size) {
971321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return mem;
981321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
991321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
1001321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1011321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return NULL;
1021321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
1031321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1041321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima/*
1051321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima * Find overlapping slot with lowest start address
1061321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima */
1071321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimastatic KVMSlot *kvm_lookup_overlapping_slot(KVMState *s,
1081321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                            target_phys_addr_t start_addr,
1091321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                            target_phys_addr_t end_addr)
1101321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
1111321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMSlot *found = NULL;
1121321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int i;
1131321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1141321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    for (i = 0; i < ARRAY_SIZE(s->slots); i++) {
1151321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        KVMSlot *mem = &s->slots[i];
1161321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1171321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (mem->memory_size == 0 ||
1181321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            (found && found->start_addr < mem->start_addr)) {
1191321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            continue;
1201321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
1211321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1221321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (end_addr > mem->start_addr &&
1231321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            start_addr < mem->start_addr + mem->memory_size) {
1241321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            found = mem;
1251321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
1261321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
1271321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1281321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return found;
1291321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
1301321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1311321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimastatic int kvm_set_user_memory_region(KVMState *s, KVMSlot *slot)
1321321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
1331321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    struct kvm_userspace_memory_region mem;
1341321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1351321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    mem.slot = slot->slot;
1361321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    mem.guest_phys_addr = slot->start_addr;
1371321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    mem.memory_size = slot->memory_size;
1381321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    mem.userspace_addr = (unsigned long)qemu_get_ram_ptr(slot->phys_offset);
1391321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    mem.flags = slot->flags;
1401321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (s->migration_log) {
1411321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        mem.flags |= KVM_MEM_LOG_DIRTY_PAGES;
1421321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
1431321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, &mem);
1441321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
1451321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1461321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1471321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_init_vcpu(CPUState *env)
1481321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
1491321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMState *s = kvm_state;
1501321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    long mmap_size;
1511321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int ret;
1521321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1531321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    dprintf("kvm_init_vcpu\n");
1541321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1551321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    ret = kvm_vm_ioctl(s, KVM_CREATE_VCPU, env->cpu_index);
1561321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (ret < 0) {
1571321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        dprintf("kvm_create_vcpu failed\n");
1581321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        goto err;
1591321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
1601321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1611321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    env->kvm_fd = ret;
1621321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    env->kvm_state = s;
1631321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1641321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    mmap_size = kvm_ioctl(s, KVM_GET_VCPU_MMAP_SIZE, 0);
1651321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (mmap_size < 0) {
1661321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        dprintf("KVM_GET_VCPU_MMAP_SIZE failed\n");
1671321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        goto err;
1681321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
1691321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1701321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    env->kvm_run = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED,
1711321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                        env->kvm_fd, 0);
1721321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (env->kvm_run == MAP_FAILED) {
1731321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        ret = -errno;
1741321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        dprintf("mmap'ing vcpu state failed\n");
1751321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        goto err;
1761321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
1771321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1781321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    ret = kvm_arch_init_vcpu(env);
1791321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1801321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaerr:
1811321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return ret;
1821321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
1831321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1841321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_put_mp_state(CPUState *env)
1851321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
1861321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    struct kvm_mp_state mp_state = { .mp_state = env->mp_state };
1871321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1881321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return kvm_vcpu_ioctl(env, KVM_SET_MP_STATE, &mp_state);
1891321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
1901321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1911321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_get_mp_state(CPUState *env)
1921321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
1931321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    struct kvm_mp_state mp_state;
1941321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int ret;
1951321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
1961321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    ret = kvm_vcpu_ioctl(env, KVM_GET_MP_STATE, &mp_state);
1971321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (ret < 0) {
1981321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        return ret;
1991321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
2001321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    env->mp_state = mp_state.mp_state;
2011321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return 0;
2021321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
2031321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
2041321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_sync_vcpus(void)
2051321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
2061321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    CPUState *env;
2071321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
2081321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    for (env = first_cpu; env != NULL; env = env->next_cpu) {
2091321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        int ret;
2101321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
2111321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        ret = kvm_arch_put_registers(env);
2121321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (ret)
2131321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return ret;
2141321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
2151321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
2161321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return 0;
2171321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
2181321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
2191321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima/*
2201321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima * dirty pages logging control
2211321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima */
2221321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimastatic int kvm_dirty_pages_log_change(target_phys_addr_t phys_addr,
2231321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                      ram_addr_t size, int flags, int mask)
2241321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
2251321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMState *s = kvm_state;
2261321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMSlot *mem = kvm_lookup_matching_slot(s, phys_addr, phys_addr + size);
2271321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int old_flags;
2281321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
2291321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (mem == NULL)  {
2301321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            fprintf(stderr, "BUG: %s: invalid parameters " TARGET_FMT_plx "-"
2311321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                    TARGET_FMT_plx "\n", __func__, phys_addr,
2321321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                    phys_addr + size - 1);
2331321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return -EINVAL;
2341321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
2351321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
2361321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    old_flags = mem->flags;
2371321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
2381321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    flags = (mem->flags & ~mask) | flags;
2391321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    mem->flags = flags;
2401321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
2411321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    /* If nothing changed effectively, no need to issue ioctl */
2421321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (s->migration_log) {
2431321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        flags |= KVM_MEM_LOG_DIRTY_PAGES;
2441321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
2451321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (flags == old_flags) {
2461321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return 0;
2471321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
2481321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
2491321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return kvm_set_user_memory_region(s, mem);
2501321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
2511321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
2521321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_log_start(target_phys_addr_t phys_addr, ram_addr_t size)
2531321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
2541321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        return kvm_dirty_pages_log_change(phys_addr, size,
2551321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                          KVM_MEM_LOG_DIRTY_PAGES,
2561321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                          KVM_MEM_LOG_DIRTY_PAGES);
2571321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
2581321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
2591321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_log_stop(target_phys_addr_t phys_addr, ram_addr_t size)
2601321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
2611321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        return kvm_dirty_pages_log_change(phys_addr, size,
2621321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                          0,
2631321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                          KVM_MEM_LOG_DIRTY_PAGES);
2641321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
2651321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
2661321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_set_migration_log(int enable)
2671321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
2681321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMState *s = kvm_state;
2691321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMSlot *mem;
2701321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int i, err;
2711321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
2721321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    s->migration_log = enable;
2731321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
2741321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    for (i = 0; i < ARRAY_SIZE(s->slots); i++) {
2751321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        mem = &s->slots[i];
2761321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
2771321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (!!(mem->flags & KVM_MEM_LOG_DIRTY_PAGES) == enable) {
2781321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            continue;
2791321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
2801321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        err = kvm_set_user_memory_region(s, mem);
2811321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (err) {
2821321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return err;
2831321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
2841321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
2851321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return 0;
2861321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
2871321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
2881321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima/**
2891321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima * kvm_physical_sync_dirty_bitmap - Grab dirty bitmap from kernel space
2901321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima * This function updates qemu's dirty bitmap using cpu_physical_memory_set_dirty().
2911321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima * This means all bits are set to dirty.
2921321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima *
2931321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima * @start_add: start of logged region.
2941321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima * @end_addr: end of logged region.
2951321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima */
2961321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_physical_sync_dirty_bitmap(target_phys_addr_t start_addr,
2971321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                   target_phys_addr_t end_addr)
2981321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
2991321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMState *s = kvm_state;
3001321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    unsigned long size, allocated_size = 0;
3011321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    target_phys_addr_t phys_addr;
3021321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    ram_addr_t addr;
3031321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMDirtyLog d;
3041321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMSlot *mem;
3051321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int ret = 0;
3061321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3071321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    d.dirty_bitmap = NULL;
3081321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    while (start_addr < end_addr) {
3091321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        mem = kvm_lookup_overlapping_slot(s, start_addr, end_addr);
3101321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (mem == NULL) {
3111321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            break;
3121321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
3131321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3141321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        size = ((mem->memory_size >> TARGET_PAGE_BITS) + 7) / 8;
3151321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (!d.dirty_bitmap) {
3161321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            d.dirty_bitmap = qemu_malloc(size);
3171321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        } else if (size > allocated_size) {
3181321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            d.dirty_bitmap = qemu_realloc(d.dirty_bitmap, size);
3191321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
3201321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        allocated_size = size;
3211321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        memset(d.dirty_bitmap, 0, allocated_size);
3221321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3231321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        d.slot = mem->slot;
3241321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3251321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (kvm_vm_ioctl(s, KVM_GET_DIRTY_LOG, &d) == -1) {
3261321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            dprintf("ioctl failed %d\n", errno);
3271321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            ret = -1;
3281321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            break;
3291321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
3301321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3311321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        for (phys_addr = mem->start_addr, addr = mem->phys_offset;
3321321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima             phys_addr < mem->start_addr + mem->memory_size;
3331321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima             phys_addr += TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
3341321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            unsigned long *bitmap = (unsigned long *)d.dirty_bitmap;
3351321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            unsigned nr = (phys_addr - mem->start_addr) >> TARGET_PAGE_BITS;
3361321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            unsigned word = nr / (sizeof(*bitmap) * 8);
3371321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            unsigned bit = nr % (sizeof(*bitmap) * 8);
3381321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3391321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            if ((bitmap[word] >> bit) & 1) {
3401321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                cpu_physical_memory_set_dirty(addr);
3411321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            }
3421321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
3431321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        start_addr = phys_addr;
3441321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
3451321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    qemu_free(d.dirty_bitmap);
3461321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3471321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return ret;
3481321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
3491321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3501321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_coalesce_mmio_region(target_phys_addr_t start, ram_addr_t size)
3511321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
3521321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int ret = -ENOSYS;
3531321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#ifdef KVM_CAP_COALESCED_MMIO
3541321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMState *s = kvm_state;
3551321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3561321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (s->coalesced_mmio) {
3571321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        struct kvm_coalesced_mmio_zone zone;
3581321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3591321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        zone.addr = start;
3601321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        zone.size = size;
3611321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3621321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        ret = kvm_vm_ioctl(s, KVM_REGISTER_COALESCED_MMIO, &zone);
3631321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
3641321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#endif
3651321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3661321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return ret;
3671321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
3681321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3691321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size)
3701321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
3711321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int ret = -ENOSYS;
3721321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#ifdef KVM_CAP_COALESCED_MMIO
3731321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMState *s = kvm_state;
3741321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3751321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (s->coalesced_mmio) {
3761321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        struct kvm_coalesced_mmio_zone zone;
3771321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3781321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        zone.addr = start;
3791321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        zone.size = size;
3801321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3811321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        ret = kvm_vm_ioctl(s, KVM_UNREGISTER_COALESCED_MMIO, &zone);
3821321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
3831321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#endif
3841321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3851321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return ret;
3861321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
3871321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3881321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_check_extension(KVMState *s, unsigned int extension)
3891321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
3901321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int ret;
3911321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3921321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, extension);
3931321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (ret < 0) {
3941321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        ret = 0;
3951321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
3961321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
3971321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return ret;
3981321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
3991321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
4001321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimastatic void kvm_reset_vcpus(void *opaque)
4011321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
4021321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    kvm_sync_vcpus();
4031321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
4041321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
4051321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_init(int smp_cpus)
4061321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
4071321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    static const char upgrade_note[] =
4081321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        "Please upgrade to at least kernel 2.6.29 or recent kvm-kmod\n"
4091321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        "(see http://sourceforge.net/projects/kvm).\n";
4101321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMState *s;
4111321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int ret;
4121321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int i;
4131321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
4141321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (smp_cpus > 1) {
4151321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        fprintf(stderr, "No SMP KVM support, use '-smp 1'\n");
4161321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        return -EINVAL;
4171321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
4181321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
4191321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    s = qemu_mallocz(sizeof(KVMState));
4201321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
4211321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#ifdef KVM_CAP_SET_GUEST_DEBUG
4221321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    QTAILQ_INIT(&s->kvm_sw_breakpoints);
4231321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#endif
4241321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    for (i = 0; i < ARRAY_SIZE(s->slots); i++)
4251321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        s->slots[i].slot = i;
4261321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
4271321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    s->vmfd = -1;
4281321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    s->fd = open("/dev/kvm", O_RDWR);
4291321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (s->fd == -1) {
4301321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        ret = -errno;
4317876c70c97140ac6a4469e04da1b377913da259aAndy McFadden        fprintf(stderr, "Could not access KVM kernel module: %m\n");
4321321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        goto err;
4331321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
4341321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
4351321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    ret = kvm_ioctl(s, KVM_GET_API_VERSION, 0);
4361321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (ret < KVM_API_VERSION) {
4371321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (ret > 0)
4381321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            ret = -EINVAL;
4391321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        fprintf(stderr, "kvm version too old\n");
4401321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        goto err;
4411321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
4421321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
4431321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (ret > KVM_API_VERSION) {
4441321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        ret = -EINVAL;
4451321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        fprintf(stderr, "kvm version not supported\n");
4461321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        goto err;
4471321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
4481321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
4491321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    s->vmfd = kvm_ioctl(s, KVM_CREATE_VM, 0);
4507876c70c97140ac6a4469e04da1b377913da259aAndy McFadden    if (s->vmfd < 0) {
4517876c70c97140ac6a4469e04da1b377913da259aAndy McFadden        ret = -errno;
4527876c70c97140ac6a4469e04da1b377913da259aAndy McFadden        fprintf(stderr, "ioctl(KVM_CREATE_VM) failed: %s\n", strerror(errno));
4531321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        goto err;
4547876c70c97140ac6a4469e04da1b377913da259aAndy McFadden    }
4551321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
4561321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    /* initially, KVM allocated its own memory and we had to jump through
4571321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima     * hooks to make phys_ram_base point to this.  Modern versions of KVM
4581321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima     * just use a user allocated buffer so we can use regular pages
4591321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima     * unmodified.  Make sure we have a sufficiently modern version of KVM.
4601321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima     */
4611321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (!kvm_check_extension(s, KVM_CAP_USER_MEMORY)) {
4621321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        ret = -EINVAL;
4631321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        fprintf(stderr, "kvm does not support KVM_CAP_USER_MEMORY\n%s",
4641321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                upgrade_note);
4651321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        goto err;
4661321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
4671321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
4681321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    /* There was a nasty bug in < kvm-80 that prevents memory slots from being
4691321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima     * destroyed properly.  Since we rely on this capability, refuse to work
4701321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima     * with any kernel without this capability. */
4711321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (!kvm_check_extension(s, KVM_CAP_DESTROY_MEMORY_REGION_WORKS)) {
4721321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        ret = -EINVAL;
4731321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
4741321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        fprintf(stderr,
4751321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                "KVM kernel module broken (DESTROY_MEMORY_REGION).\n%s",
4761321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                upgrade_note);
4771321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        goto err;
4781321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
4791321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
4801321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#ifdef KVM_CAP_COALESCED_MMIO
4811321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    s->coalesced_mmio = kvm_check_extension(s, KVM_CAP_COALESCED_MMIO);
4821321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#else
4831321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    s->coalesced_mmio = 0;
4841321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#endif
4851321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
4861321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    s->broken_set_mem_region = 1;
4871321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#ifdef KVM_CAP_JOIN_MEMORY_REGIONS_WORKS
4881321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_JOIN_MEMORY_REGIONS_WORKS);
4891321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (ret > 0) {
4901321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        s->broken_set_mem_region = 0;
4911321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
4921321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#endif
4931321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
4941321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    ret = kvm_arch_init(s, smp_cpus);
4951321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (ret < 0)
4961321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        goto err;
4971321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
4981321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    qemu_register_reset(kvm_reset_vcpus, INT_MAX, NULL);
4991321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
5001321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    kvm_state = s;
5011321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
5021321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return 0;
5031321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
5041321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaerr:
5051321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (s) {
5061321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (s->vmfd != -1)
5071321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            close(s->vmfd);
5081321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (s->fd != -1)
5091321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            close(s->fd);
5101321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
5111321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    qemu_free(s);
5121321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
5131321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return ret;
5141321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
5151321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
5161321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimastatic int kvm_handle_io(CPUState *env, uint16_t port, void *data,
5171321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                         int direction, int size, uint32_t count)
5181321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
5191321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int i;
5201321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    uint8_t *ptr = data;
5211321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
5221321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    for (i = 0; i < count; i++) {
5231321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (direction == KVM_EXIT_IO_IN) {
5241321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            switch (size) {
5251321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            case 1:
5261321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                stb_p(ptr, cpu_inb(port));
5271321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                break;
5281321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            case 2:
5291321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                stw_p(ptr, cpu_inw(port));
5301321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                break;
5311321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            case 4:
5321321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                stl_p(ptr, cpu_inl(port));
5331321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                break;
5341321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            }
5351321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        } else {
5361321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            switch (size) {
5371321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            case 1:
5381321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                cpu_outb(port, ldub_p(ptr));
5391321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                break;
5401321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            case 2:
5411321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                cpu_outw(port, lduw_p(ptr));
5421321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                break;
5431321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            case 4:
5441321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                cpu_outl(port, ldl_p(ptr));
5451321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                break;
5461321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            }
5471321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
5481321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
5491321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        ptr += size;
5501321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
5511321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
5521321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return 1;
5531321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
5541321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
5551321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimastatic void kvm_run_coalesced_mmio(CPUState *env, struct kvm_run *run)
5561321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
5571321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#ifdef KVM_CAP_COALESCED_MMIO
5581321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMState *s = kvm_state;
5591321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (s->coalesced_mmio) {
5601321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        struct kvm_coalesced_mmio_ring *ring;
5611321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
5621321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        ring = (void *)run + (s->coalesced_mmio * TARGET_PAGE_SIZE);
5631321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        while (ring->first != ring->last) {
5641321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            struct kvm_coalesced_mmio *ent;
5651321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
5661321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            ent = &ring->coalesced_mmio[ring->first];
5671321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
5681321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            cpu_physical_memory_write(ent->phys_addr, ent->data, ent->len);
5691321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            /* FIXME smp_wmb() */
5701321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            ring->first = (ring->first + 1) % KVM_COALESCED_MMIO_MAX;
5711321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
5721321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
5731321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#endif
5741321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
5751321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
5761321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_cpu_exec(CPUState *env)
5771321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
5781321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    struct kvm_run *run = env->kvm_run;
5791321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int ret;
5801321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
5811321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    dprintf("kvm_cpu_exec()\n");
5821321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
5831321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    do {
5841321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (env->exit_request) {
5851321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            dprintf("interrupt exit requested\n");
5861321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            ret = 0;
5871321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            break;
5881321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
5891321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
5901321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        kvm_arch_pre_run(env, run);
591bb0140b925cb2adce03ebc0885067ea3bfd19a20Jun Nakajima        ret = kvm_arch_vcpu_run(env);
5921321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        kvm_arch_post_run(env, run);
5931321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
5941321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (ret == -EINTR || ret == -EAGAIN) {
5951321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            dprintf("io window exit\n");
5961321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            ret = 0;
5971321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            break;
5981321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
5991321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
6001321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (ret < 0) {
6011321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            dprintf("kvm run failed %s\n", strerror(-ret));
6021321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            abort();
6031321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
6041321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
6051321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        kvm_run_coalesced_mmio(env, run);
6061321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
6071321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        ret = 0; /* exit loop */
6081321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        switch (run->exit_reason) {
6091321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        case KVM_EXIT_IO:
6101321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            dprintf("handle_io\n");
6111321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            ret = kvm_handle_io(env, run->io.port,
6121321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                (uint8_t *)run + run->io.data_offset,
6131321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                run->io.direction,
6141321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                run->io.size,
6151321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                run->io.count);
6161321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            break;
6171321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        case KVM_EXIT_MMIO:
6181321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            dprintf("handle_mmio\n");
6191321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            cpu_physical_memory_rw(run->mmio.phys_addr,
6201321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                   run->mmio.data,
6211321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                   run->mmio.len,
6221321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                   run->mmio.is_write);
6231321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            ret = 1;
6241321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            break;
6251321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        case KVM_EXIT_IRQ_WINDOW_OPEN:
6261321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            dprintf("irq_window_open\n");
6271321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            break;
6281321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        case KVM_EXIT_SHUTDOWN:
6291321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            dprintf("shutdown\n");
6301321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            qemu_system_reset_request();
6311321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            ret = 1;
6321321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            break;
6331321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        case KVM_EXIT_UNKNOWN:
6341321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            dprintf("kvm_exit_unknown\n");
6351321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            break;
6361321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        case KVM_EXIT_FAIL_ENTRY:
6371321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            dprintf("kvm_exit_fail_entry\n");
6381321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            break;
6391321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        case KVM_EXIT_EXCEPTION:
6401321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            dprintf("kvm_exit_exception\n");
6411321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            break;
6421321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        case KVM_EXIT_DEBUG:
6431321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            dprintf("kvm_exit_debug\n");
6441321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#ifdef KVM_CAP_SET_GUEST_DEBUG
6451321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            if (kvm_arch_debug(&run->debug.arch)) {
6461321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                gdb_set_stop_cpu(env);
6471321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                vm_stop(EXCP_DEBUG);
6481321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                env->exception_index = EXCP_DEBUG;
6491321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                return 0;
6501321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            }
6511321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            /* re-enter, this exception was guest-internal */
6521321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            ret = 1;
6531321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#endif /* KVM_CAP_SET_GUEST_DEBUG */
6541321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            break;
6551321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        default:
6561321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            dprintf("kvm_arch_handle_exit\n");
6571321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            ret = kvm_arch_handle_exit(env, run);
6581321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            break;
6591321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
6601321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    } while (ret > 0);
6611321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
6621321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (env->exit_request) {
6631321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        env->exit_request = 0;
6641321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        env->exception_index = EXCP_INTERRUPT;
6651321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
6661321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
6671321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return ret;
6681321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
6691321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
6701321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimavoid kvm_set_phys_mem(target_phys_addr_t start_addr,
6711321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                      ram_addr_t size,
6721321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                      ram_addr_t phys_offset)
6731321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
6741321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMState *s = kvm_state;
6751321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    ram_addr_t flags = phys_offset & ~TARGET_PAGE_MASK;
6761321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMSlot *mem, old;
6771321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int err;
6781321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
6791321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (start_addr & ~TARGET_PAGE_MASK) {
6801321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (flags >= IO_MEM_UNASSIGNED) {
6811321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            if (!kvm_lookup_overlapping_slot(s, start_addr,
6821321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                             start_addr + size)) {
6831321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                return;
6841321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            }
6851321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            fprintf(stderr, "Unaligned split of a KVM memory slot\n");
6861321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        } else {
6871321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            fprintf(stderr, "Only page-aligned memory slots supported\n");
6881321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
6891321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        abort();
6901321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
6911321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
6921321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    /* KVM does not support read-only slots */
6931321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    phys_offset &= ~IO_MEM_ROM;
6941321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
6951321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    while (1) {
6961321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        mem = kvm_lookup_overlapping_slot(s, start_addr, start_addr + size);
6971321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (!mem) {
6981321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            break;
6991321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
7001321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
7011321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (flags < IO_MEM_UNASSIGNED && start_addr >= mem->start_addr &&
7021321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            (start_addr + size <= mem->start_addr + mem->memory_size) &&
7031321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            (phys_offset - start_addr == mem->phys_offset - mem->start_addr)) {
7041321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            /* The new slot fits into the existing one and comes with
7051321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima             * identical parameters - nothing to be done. */
7061321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return;
7071321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
7081321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
7091321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        old = *mem;
7101321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
7111321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        /* unregister the overlapping slot */
7121321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        mem->memory_size = 0;
7131321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        err = kvm_set_user_memory_region(s, mem);
7141321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (err) {
7151321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            fprintf(stderr, "%s: error unregistering overlapping slot: %s\n",
7161321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                    __func__, strerror(-err));
7171321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            abort();
7181321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
7191321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
7201321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        /* Workaround for older KVM versions: we can't join slots, even not by
7211321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima         * unregistering the previous ones and then registering the larger
7221321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima         * slot. We have to maintain the existing fragmentation. Sigh.
7231321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima         *
7241321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima         * This workaround assumes that the new slot starts at the same
7251321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima         * address as the first existing one. If not or if some overlapping
7261321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima         * slot comes around later, we will fail (not seen in practice so far)
7271321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima         * - and actually require a recent KVM version. */
7281321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (s->broken_set_mem_region &&
7291321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            old.start_addr == start_addr && old.memory_size < size &&
7301321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            flags < IO_MEM_UNASSIGNED) {
7311321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            mem = kvm_alloc_slot(s);
7321321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            mem->memory_size = old.memory_size;
7331321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            mem->start_addr = old.start_addr;
7341321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            mem->phys_offset = old.phys_offset;
7351321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            mem->flags = 0;
7361321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
7371321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            err = kvm_set_user_memory_region(s, mem);
7381321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            if (err) {
7391321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                fprintf(stderr, "%s: error updating slot: %s\n", __func__,
7401321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                        strerror(-err));
7411321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                abort();
7421321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            }
7431321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
7441321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            start_addr += old.memory_size;
7451321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            phys_offset += old.memory_size;
7461321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            size -= old.memory_size;
7471321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            continue;
7481321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
7491321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
7501321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        /* register prefix slot */
7511321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (old.start_addr < start_addr) {
7521321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            mem = kvm_alloc_slot(s);
7531321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            mem->memory_size = start_addr - old.start_addr;
7541321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            mem->start_addr = old.start_addr;
7551321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            mem->phys_offset = old.phys_offset;
7561321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            mem->flags = 0;
7571321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
7581321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            err = kvm_set_user_memory_region(s, mem);
7591321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            if (err) {
7601321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                fprintf(stderr, "%s: error registering prefix slot: %s\n",
7611321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                        __func__, strerror(-err));
7621321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                abort();
7631321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            }
7641321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
7651321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
7661321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        /* register suffix slot */
7671321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (old.start_addr + old.memory_size > start_addr + size) {
7681321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            ram_addr_t size_delta;
7691321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
7701321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            mem = kvm_alloc_slot(s);
7711321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            mem->start_addr = start_addr + size;
7721321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            size_delta = mem->start_addr - old.start_addr;
7731321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            mem->memory_size = old.memory_size - size_delta;
7741321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            mem->phys_offset = old.phys_offset + size_delta;
7751321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            mem->flags = 0;
7761321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
7771321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            err = kvm_set_user_memory_region(s, mem);
7781321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            if (err) {
7791321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                fprintf(stderr, "%s: error registering suffix slot: %s\n",
7801321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                        __func__, strerror(-err));
7811321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                abort();
7821321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            }
7831321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
7841321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
7851321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
7861321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    /* in case the KVM bug workaround already "consumed" the new slot */
7871321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (!size)
7881321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        return;
7891321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
7901321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    /* KVM does not need to know about this memory */
7911321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (flags >= IO_MEM_UNASSIGNED)
7921321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        return;
7931321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
7941321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    mem = kvm_alloc_slot(s);
7951321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    mem->memory_size = size;
7961321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    mem->start_addr = start_addr;
7971321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    mem->phys_offset = phys_offset;
7981321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    mem->flags = 0;
7991321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8001321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    err = kvm_set_user_memory_region(s, mem);
8011321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (err) {
8021321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        fprintf(stderr, "%s: error registering slot: %s\n", __func__,
8031321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                strerror(-err));
8041321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        abort();
8051321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
8061321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
8071321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8081321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_ioctl(KVMState *s, int type, ...)
8091321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
8101321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int ret;
8111321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    void *arg;
8121321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    va_list ap;
8131321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8141321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    va_start(ap, type);
8151321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    arg = va_arg(ap, void *);
8161321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    va_end(ap);
8171321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8181321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    ret = ioctl(s->fd, type, arg);
8191321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (ret == -1)
8201321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        ret = -errno;
8211321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8221321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return ret;
8231321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
8241321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8251321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_vm_ioctl(KVMState *s, int type, ...)
8261321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
8271321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int ret;
8281321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    void *arg;
8291321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    va_list ap;
8301321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8311321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    va_start(ap, type);
8321321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    arg = va_arg(ap, void *);
8331321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    va_end(ap);
8341321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8351321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    ret = ioctl(s->vmfd, type, arg);
8361321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (ret == -1)
8371321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        ret = -errno;
8381321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8391321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return ret;
8401321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
8411321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8421321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_vcpu_ioctl(CPUState *env, int type, ...)
8431321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
8441321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int ret;
8451321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    void *arg;
8461321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    va_list ap;
8471321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8481321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    va_start(ap, type);
8491321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    arg = va_arg(ap, void *);
8501321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    va_end(ap);
8511321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8521321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    ret = ioctl(env->kvm_fd, type, arg);
8531321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (ret == -1)
8541321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        ret = -errno;
8551321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8561321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return ret;
8571321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
8581321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8591321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_has_sync_mmu(void)
8601321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
8611321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#ifdef KVM_CAP_SYNC_MMU
8621321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMState *s = kvm_state;
8631321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8641321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return kvm_check_extension(s, KVM_CAP_SYNC_MMU);
8651321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#else
8661321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return 0;
8671321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#endif
8681321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
8691321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8701321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimavoid kvm_setup_guest_memory(void *start, size_t size)
8711321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
8721321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (!kvm_has_sync_mmu()) {
8731321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#ifdef MADV_DONTFORK
8741321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        int ret = madvise(start, size, MADV_DONTFORK);
8751321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8761321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (ret) {
8771321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            perror("madvice");
8781321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            exit(1);
8791321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
8801321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#else
8811321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        fprintf(stderr,
8821321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                "Need MADV_DONTFORK in absence of synchronous KVM MMU\n");
8831321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        exit(1);
8841321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#endif
8851321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
8861321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
8871321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8881321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#ifdef KVM_CAP_SET_GUEST_DEBUG
8891321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimastruct kvm_sw_breakpoint *kvm_find_sw_breakpoint(CPUState *env,
8901321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                                                 target_ulong pc)
8911321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
8921321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    struct kvm_sw_breakpoint *bp;
8931321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
8941321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    QTAILQ_FOREACH(bp, &env->kvm_state->kvm_sw_breakpoints, entry) {
8951321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (bp->pc == pc)
8961321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return bp;
8971321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
8981321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return NULL;
8991321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
9001321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9011321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_sw_breakpoints_active(CPUState *env)
9021321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
9031321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return !QTAILQ_EMPTY(&env->kvm_state->kvm_sw_breakpoints);
9041321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
9051321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9061321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_update_guest_debug(CPUState *env, unsigned long reinject_trap)
9071321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
9081321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    struct kvm_guest_debug dbg;
9091321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9101321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    dbg.control = 0;
9111321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (env->singlestep_enabled)
9121321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        dbg.control = KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP;
9131321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9141321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    kvm_arch_update_guest_debug(env, &dbg);
9151321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    dbg.control |= reinject_trap;
9161321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9171321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return kvm_vcpu_ioctl(env, KVM_SET_GUEST_DEBUG, &dbg);
9181321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
9191321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9201321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_insert_breakpoint(CPUState *current_env, target_ulong addr,
9211321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                          target_ulong len, int type)
9221321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
9231321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    struct kvm_sw_breakpoint *bp;
9241321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    CPUState *env;
9251321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int err;
9261321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9271321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (type == GDB_BREAKPOINT_SW) {
9281321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        bp = kvm_find_sw_breakpoint(current_env, addr);
9291321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (bp) {
9301321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            bp->use_count++;
9311321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return 0;
9321321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
9331321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9341321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        bp = qemu_malloc(sizeof(struct kvm_sw_breakpoint));
9351321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (!bp)
9361321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return -ENOMEM;
9371321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9381321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        bp->pc = addr;
9391321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        bp->use_count = 1;
9401321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        err = kvm_arch_insert_sw_breakpoint(current_env, bp);
9411321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (err) {
9421321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            free(bp);
9431321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return err;
9441321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
9451321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9461321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        QTAILQ_INSERT_HEAD(&current_env->kvm_state->kvm_sw_breakpoints,
9471321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                          bp, entry);
9481321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    } else {
9491321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        err = kvm_arch_insert_hw_breakpoint(addr, len, type);
9501321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (err)
9511321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return err;
9521321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
9531321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9541321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    for (env = first_cpu; env != NULL; env = env->next_cpu) {
9551321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        err = kvm_update_guest_debug(env, 0);
9561321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (err)
9571321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return err;
9581321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
9591321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return 0;
9601321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
9611321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9621321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_remove_breakpoint(CPUState *current_env, target_ulong addr,
9631321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                          target_ulong len, int type)
9641321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
9651321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    struct kvm_sw_breakpoint *bp;
9661321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    CPUState *env;
9671321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    int err;
9681321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9691321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    if (type == GDB_BREAKPOINT_SW) {
9701321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        bp = kvm_find_sw_breakpoint(current_env, addr);
9711321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (!bp)
9721321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return -ENOENT;
9731321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9741321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (bp->use_count > 1) {
9751321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            bp->use_count--;
9761321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return 0;
9771321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
9781321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9791321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        err = kvm_arch_remove_sw_breakpoint(current_env, bp);
9801321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (err)
9811321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return err;
9821321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9831321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        QTAILQ_REMOVE(&current_env->kvm_state->kvm_sw_breakpoints, bp, entry);
9841321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        qemu_free(bp);
9851321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    } else {
9861321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        err = kvm_arch_remove_hw_breakpoint(addr, len, type);
9871321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (err)
9881321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return err;
9891321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
9901321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9911321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    for (env = first_cpu; env != NULL; env = env->next_cpu) {
9921321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        err = kvm_update_guest_debug(env, 0);
9931321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (err)
9941321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            return err;
9951321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
9961321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return 0;
9971321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
9981321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
9991321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimavoid kvm_remove_all_breakpoints(CPUState *current_env)
10001321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
10011321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    struct kvm_sw_breakpoint *bp, *next;
10021321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    KVMState *s = current_env->kvm_state;
10031321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    CPUState *env;
10041321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
10051321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    QTAILQ_FOREACH_SAFE(bp, &s->kvm_sw_breakpoints, entry, next) {
10061321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        if (kvm_arch_remove_sw_breakpoint(current_env, bp) != 0) {
10071321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            /* Try harder to find a CPU that currently sees the breakpoint. */
10081321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            for (env = first_cpu; env != NULL; env = env->next_cpu) {
10091321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                if (kvm_arch_remove_sw_breakpoint(env, bp) == 0)
10101321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                    break;
10111321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima            }
10121321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        }
10131321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    }
10141321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    kvm_arch_remove_all_hw_breakpoints();
10151321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
10161321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    for (env = first_cpu; env != NULL; env = env->next_cpu)
10171321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima        kvm_update_guest_debug(env, 0);
10181321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
10191321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
10201321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#else /* !KVM_CAP_SET_GUEST_DEBUG */
10211321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
10221321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_update_guest_debug(CPUState *env, unsigned long reinject_trap)
10231321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
10241321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return -EINVAL;
10251321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
10261321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
10271321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_insert_breakpoint(CPUState *current_env, target_ulong addr,
10281321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                          target_ulong len, int type)
10291321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
10301321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return -EINVAL;
10311321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
10321321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
10331321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimaint kvm_remove_breakpoint(CPUState *current_env, target_ulong addr,
10341321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima                          target_ulong len, int type)
10351321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
10361321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima    return -EINVAL;
10371321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
10381321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima
10391321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajimavoid kvm_remove_all_breakpoints(CPUState *current_env)
10401321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima{
10411321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima}
10421321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#endif /* !KVM_CAP_SET_GUEST_DEBUG */
1043