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 "qemu/queue.h" 16 #include "sysemu/kvm.h" 17 18 typedef struct KVMSlot 19 { 20 hwaddr start_addr; 21 ram_addr_t memory_size; 22 void *ram; 23 int slot; 24 int flags; 25 int old_flags; 26 /* Dirty bitmap cache for the slot */ 27 unsigned long *dirty_bmap; 28 unsigned long dirty_bmap_size; 29 /* Cache of the address space ID */ 30 int as_id; 31 /* Cache of the offset in ram address space */ 32 ram_addr_t ram_start_offset; 33 } KVMSlot; 34 35 typedef struct KVMMemoryUpdate { 36 QSIMPLEQ_ENTRY(KVMMemoryUpdate) next; 37 MemoryRegionSection section; 38 } KVMMemoryUpdate; 39 40 typedef struct KVMMemoryListener { 41 MemoryListener listener; 42 KVMSlot *slots; 43 unsigned int nr_used_slots; 44 int as_id; 45 QSIMPLEQ_HEAD(, KVMMemoryUpdate) transaction_add; 46 QSIMPLEQ_HEAD(, KVMMemoryUpdate) transaction_del; 47 } KVMMemoryListener; 48 49 #define KVM_MSI_HASHTAB_SIZE 256 50 51 enum KVMDirtyRingReaperState { 52 KVM_DIRTY_RING_REAPER_NONE = 0, 53 /* The reaper is sleeping */ 54 KVM_DIRTY_RING_REAPER_WAIT, 55 /* The reaper is reaping for dirty pages */ 56 KVM_DIRTY_RING_REAPER_REAPING, 57 }; 58 59 /* 60 * KVM reaper instance, responsible for collecting the KVM dirty bits 61 * via the dirty ring. 62 */ 63 struct KVMDirtyRingReaper { 64 /* The reaper thread */ 65 QemuThread reaper_thr; 66 volatile uint64_t reaper_iteration; /* iteration number of reaper thr */ 67 volatile enum KVMDirtyRingReaperState reaper_state; /* reap thr state */ 68 }; 69 struct KVMState 70 { 71 AccelState parent_obj; 72 73 int nr_slots; 74 int fd; 75 int vmfd; 76 int coalesced_mmio; 77 int coalesced_pio; 78 struct kvm_coalesced_mmio_ring *coalesced_mmio_ring; 79 bool coalesced_flush_in_progress; 80 int vcpu_events; 81 int robust_singlestep; 82 int debugregs; 83 #ifdef KVM_CAP_SET_GUEST_DEBUG 84 QTAILQ_HEAD(, kvm_sw_breakpoint) kvm_sw_breakpoints; 85 #endif 86 int max_nested_state_len; 87 int many_ioeventfds; 88 int intx_set_mask; 89 int kvm_shadow_mem; 90 bool kernel_irqchip_allowed; 91 bool kernel_irqchip_required; 92 OnOffAuto kernel_irqchip_split; 93 bool sync_mmu; 94 uint64_t manual_dirty_log_protect; 95 /* The man page (and posix) say ioctl numbers are signed int, but 96 * they're not. Linux, glibc and *BSD all treat ioctl numbers as 97 * unsigned, and treating them as signed here can break things */ 98 unsigned irq_set_ioctl; 99 unsigned int sigmask_len; 100 GHashTable *gsimap; 101 #ifdef KVM_CAP_IRQ_ROUTING 102 struct kvm_irq_routing *irq_routes; 103 int nr_allocated_irq_routes; 104 unsigned long *used_gsi_bitmap; 105 unsigned int gsi_count; 106 QTAILQ_HEAD(, KVMMSIRoute) msi_hashtab[KVM_MSI_HASHTAB_SIZE]; 107 #endif 108 KVMMemoryListener memory_listener; 109 QLIST_HEAD(, KVMParkedVcpu) kvm_parked_vcpus; 110 111 /* For "info mtree -f" to tell if an MR is registered in KVM */ 112 int nr_as; 113 struct KVMAs { 114 KVMMemoryListener *ml; 115 AddressSpace *as; 116 } *as; 117 uint64_t kvm_dirty_ring_bytes; /* Size of the per-vcpu dirty ring */ 118 uint32_t kvm_dirty_ring_size; /* Number of dirty GFNs per ring */ 119 bool kvm_dirty_ring_with_bitmap; 120 uint64_t kvm_eager_split_size; /* Eager Page Splitting chunk size */ 121 struct KVMDirtyRingReaper reaper; 122 NotifyVmexitOption notify_vmexit; 123 uint32_t notify_window; 124 uint32_t xen_version; 125 uint32_t xen_caps; 126 uint16_t xen_gnttab_max_frames; 127 uint16_t xen_evtchn_max_pirq; 128 }; 129 130 void kvm_memory_listener_register(KVMState *s, KVMMemoryListener *kml, 131 AddressSpace *as, int as_id, const char *name); 132 133 void kvm_set_max_memslot_size(hwaddr max_slot_size); 134 135 /** 136 * kvm_hwpoison_page_add: 137 * 138 * Parameters: 139 * @ram_addr: the address in the RAM for the poisoned page 140 * 141 * Add a poisoned page to the list 142 * 143 * Return: None. 144 */ 145 void kvm_hwpoison_page_add(ram_addr_t ram_addr); 146 #endif 147