Merge tag 'mips-20221108' of https://github.com/philmd/qemu into staging
[qemu/ar7.git] / include / sysemu / kvm_int.h
blob3b4adcdc101d2a009b0b870617dd025c66478ed0
1 /*
2 * Internal definitions for a target's KVM support
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.
7 */
9 #ifndef QEMU_KVM_INT_H
10 #define QEMU_KVM_INT_H
12 #include "exec/memory.h"
13 #include "qapi/qapi-types-common.h"
14 #include "qemu/accel.h"
15 #include "sysemu/kvm.h"
17 typedef struct KVMSlot
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;
34 typedef struct KVMMemoryListener {
35 MemoryListener listener;
36 KVMSlot *slots;
37 int as_id;
38 } KVMMemoryListener;
40 #define KVM_MSI_HASHTAB_SIZE 256
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,
51 * KVM reaper instance, responsible for collecting the KVM dirty bits
52 * via the dirty ring.
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 */
60 struct KVMState
62 AccelState parent_obj;
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;
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;
115 void kvm_memory_listener_register(KVMState *s, KVMMemoryListener *kml,
116 AddressSpace *as, int as_id, const char *name);
118 void kvm_set_max_memslot_size(hwaddr max_slot_size);
121 * kvm_hwpoison_page_add:
123 * Parameters:
124 * @ram_addr: the address in the RAM for the poisoned page
126 * Add a poisoned page to the list
128 * Return: None.
130 void kvm_hwpoison_page_add(ram_addr_t ram_addr);
131 #endif