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