xref: /qemu/include/sysemu/kvm_int.h (revision fb72e779)
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