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(¤t_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(¤t_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