1 /* 2 * Internal definitions for a target's KVM support 3 * 4 * This work is licensed under the terms of the GNU GPL, version 2 or later. 5 * See the COPYING file in the top-level directory. 6 * 7 */ 8 9 #ifndef QEMU_KVM_INT_H 10 #define QEMU_KVM_INT_H 11 12 #include "exec/memory.h" 13 #include "qapi/qapi-types-common.h" 14 #include "qemu/accel.h" 15 #include "sysemu/kvm.h" 16 17 typedef struct KVMSlot 18 { 19 hwaddr start_addr; 20 ram_addr_t memory_size; 21 void *ram; 22 int slot; 23 int flags; 24 int old_flags; 25 /* Dirty bitmap cache for the slot */ 26 unsigned long *dirty_bmap; 27 unsigned long dirty_bmap_size; 28 /* Cache of the address space ID */ 29 int as_id; 30 /* Cache of the offset in ram address space */ 31 ram_addr_t ram_start_offset; 32 } KVMSlot; 33 34 typedef struct KVMMemoryListener { 35 MemoryListener listener; 36 KVMSlot *slots; 37 int as_id; 38 } KVMMemoryListener; 39 40 #define KVM_MSI_HASHTAB_SIZE 256 41 42 enum KVMDirtyRingReaperState { 43 KVM_DIRTY_RING_REAPER_NONE = 0, 44 /* The reaper is sleeping */ 45 KVM_DIRTY_RING_REAPER_WAIT, 46 /* The reaper is reaping for dirty pages */ 47 KVM_DIRTY_RING_REAPER_REAPING, 48 }; 49 50 /* 51 * KVM reaper instance, responsible for collecting the KVM dirty bits 52 * via the dirty ring. 53 */ 54 struct KVMDirtyRingReaper { 55 /* The reaper thread */ 56 QemuThread reaper_thr; 57 volatile uint64_t reaper_iteration; /* iteration number of reaper thr */ 58 volatile enum KVMDirtyRingReaperState reaper_state; /* reap thr state */ 59 }; 60 struct KVMState 61 { 62 AccelState parent_obj; 63 64 int nr_slots; 65 int fd; 66 int vmfd; 67 int coalesced_mmio; 68 int coalesced_pio; 69 struct kvm_coalesced_mmio_ring *coalesced_mmio_ring; 70 bool coalesced_flush_in_progress; 71 int vcpu_events; 72 int robust_singlestep; 73 int debugregs; 74 #ifdef KVM_CAP_SET_GUEST_DEBUG 75 QTAILQ_HEAD(, kvm_sw_breakpoint) kvm_sw_breakpoints; 76 #endif 77 int max_nested_state_len; 78 int many_ioeventfds; 79 int intx_set_mask; 80 int kvm_shadow_mem; 81 bool kernel_irqchip_allowed; 82 bool kernel_irqchip_required; 83 OnOffAuto kernel_irqchip_split; 84 bool sync_mmu; 85 uint64_t manual_dirty_log_protect; 86 /* The man page (and posix) say ioctl numbers are signed int, but 87 * they're not. Linux, glibc and *BSD all treat ioctl numbers as 88 * unsigned, and treating them as signed here can break things */ 89 unsigned irq_set_ioctl; 90 unsigned int sigmask_len; 91 GHashTable *gsimap; 92 #ifdef KVM_CAP_IRQ_ROUTING 93 struct kvm_irq_routing *irq_routes; 94 int nr_allocated_irq_routes; 95 unsigned long *used_gsi_bitmap; 96 unsigned int gsi_count; 97 QTAILQ_HEAD(, KVMMSIRoute) msi_hashtab[KVM_MSI_HASHTAB_SIZE]; 98 #endif 99 KVMMemoryListener memory_listener; 100 QLIST_HEAD(, KVMParkedVcpu) kvm_parked_vcpus; 101 102 /* For "info mtree -f" to tell if an MR is registered in KVM */ 103 int nr_as; 104 struct KVMAs { 105 KVMMemoryListener *ml; 106 AddressSpace *as; 107 } *as; 108 uint64_t kvm_dirty_ring_bytes; /* Size of the per-vcpu dirty ring */ 109 uint32_t kvm_dirty_ring_size; /* Number of dirty GFNs per ring */ 110 struct KVMDirtyRingReaper reaper; 111 NotifyVmexitOption notify_vmexit; 112 uint32_t notify_window; 113 }; 114 115 void kvm_memory_listener_register(KVMState *s, KVMMemoryListener *kml, 116 AddressSpace *as, int as_id, const char *name); 117 118 void kvm_set_max_memslot_size(hwaddr max_slot_size); 119 120 /** 121 * kvm_hwpoison_page_add: 122 * 123 * Parameters: 124 * @ram_addr: the address in the RAM for the poisoned page 125 * 126 * Add a poisoned page to the list 127 * 128 * Return: None. 129 */ 130 void kvm_hwpoison_page_add(ram_addr_t ram_addr); 131 #endif 132