| 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 "system/memory.h" |
| 13 | #include "qapi/qapi-types-common.h" |
| 14 | #include "qemu/accel.h" |
| 15 | #include "qemu/queue.h" |
| 16 | #include "system/kvm.h" |
| 17 | #include "accel/accel-ops.h" |
| 18 | #include "hw/core/boards.h" |
| 19 | #include "hw/i386/topology.h" |
| 20 | #include "io/channel-socket.h" |
| 21 | |
| 22 | typedef struct KVMSlot |
| 23 | { |
| 24 | hwaddr start_addr; |
| 25 | ram_addr_t memory_size; |
| 26 | void *ram; |
| 27 | int slot; |
| 28 | int flags; |
| 29 | int old_flags; |
| 30 | /* Dirty bitmap cache for the slot */ |
| 31 | unsigned long *dirty_bmap; |
| 32 | unsigned long dirty_bmap_size; |
| 33 | /* Cache of the address space ID */ |
| 34 | int as_id; |
| 35 | /* Cache of the offset in ram address space */ |
| 36 | ram_addr_t ram_start_offset; |
| 37 | int guest_memfd; |
| 38 | hwaddr guest_memfd_offset; |
| 39 | } KVMSlot; |
| 40 | |
| 41 | typedef struct KVMMemoryUpdate { |
| 42 | QSIMPLEQ_ENTRY(KVMMemoryUpdate) next; |
| 43 | MemoryRegionSection section; |
| 44 | } KVMMemoryUpdate; |
| 45 | |
| 46 | typedef struct KVMMemoryListener { |
| 47 | MemoryListener listener; |
| 48 | KVMSlot *slots; |
| 49 | unsigned int nr_slots_used; |
| 50 | unsigned int nr_slots_allocated; |
| 51 | int as_id; |
| 52 | QSIMPLEQ_HEAD(, KVMMemoryUpdate) transaction_add; |
| 53 | QSIMPLEQ_HEAD(, KVMMemoryUpdate) transaction_del; |
| 54 | } KVMMemoryListener; |
| 55 | |
| 56 | #define KVM_MSI_HASHTAB_SIZE 256 |
| 57 | |
| 58 | typedef struct KVMHostTopoInfo { |
| 59 | /* Number of package on the Host */ |
| 60 | unsigned int maxpkgs; |
| 61 | /* Number of cpus on the Host */ |
| 62 | unsigned int maxcpus; |
| 63 | /* Number of cpus on each different package */ |
| 64 | unsigned int *pkg_cpu_count; |
| 65 | /* Each package can have different maxticks */ |
| 66 | unsigned int *maxticks; |
| 67 | } KVMHostTopoInfo; |
| 68 | |
| 69 | struct KVMMsrEnergy { |
| 70 | pid_t pid; |
| 71 | bool enable; |
| 72 | char *socket_path; |
| 73 | QIOChannelSocket *sioc; |
| 74 | QemuThread msr_thr; |
| 75 | unsigned int guest_vcpus; |
| 76 | unsigned int guest_vsockets; |
| 77 | X86CPUTopoInfo guest_topo_info; |
| 78 | KVMHostTopoInfo host_topo; |
| 79 | const CPUArchIdList *guest_cpu_list; |
| 80 | uint64_t *msr_value; |
| 81 | uint64_t msr_unit; |
| 82 | uint64_t msr_limit; |
| 83 | uint64_t msr_info; |
| 84 | }; |
| 85 | |
| 86 | enum KVMDirtyRingReaperState { |
| 87 | KVM_DIRTY_RING_REAPER_NONE = 0, |
| 88 | /* The reaper is sleeping */ |
| 89 | KVM_DIRTY_RING_REAPER_WAIT, |
| 90 | /* The reaper is reaping for dirty pages */ |
| 91 | KVM_DIRTY_RING_REAPER_REAPING, |
| 92 | }; |
| 93 | |
| 94 | /* |
| 95 | * KVM reaper instance, responsible for collecting the KVM dirty bits |
| 96 | * via the dirty ring. |
| 97 | */ |
| 98 | struct KVMDirtyRingReaper { |
| 99 | /* The reaper thread */ |
| 100 | QemuThread reaper_thr; |
| 101 | volatile uint64_t reaper_iteration; /* iteration number of reaper thr */ |
| 102 | volatile enum KVMDirtyRingReaperState reaper_state; /* reap thr state */ |
| 103 | }; |
| 104 | struct KVMState |
| 105 | { |
| 106 | AccelState parent_obj; |
| 107 | /* Max number of KVM slots supported */ |
| 108 | int nr_slots_max; |
| 109 | int fd; |
| 110 | int vmfd; |
| 111 | int coalesced_mmio; |
| 112 | int coalesced_pio; |
| 113 | struct kvm_coalesced_mmio_ring *coalesced_mmio_ring; |
| 114 | bool coalesced_flush_in_progress; |
| 115 | int vcpu_events; |
| 116 | #ifdef TARGET_KVM_HAVE_GUEST_DEBUG |
| 117 | QTAILQ_HEAD(, kvm_sw_breakpoint) kvm_sw_breakpoints; |
| 118 | #endif |
| 119 | int max_nested_state_len; |
| 120 | int kvm_shadow_mem; |
| 121 | bool kernel_irqchip_allowed; |
| 122 | bool kernel_irqchip_required; |
| 123 | OnOffAuto kernel_irqchip_split; |
| 124 | bool sync_mmu; |
| 125 | bool guest_state_protected; |
| 126 | uint64_t manual_dirty_log_protect; |
| 127 | /* |
| 128 | * Older POSIX says that ioctl numbers are signed int, but in |
| 129 | * practice they are not. (Newer POSIX doesn't specify ioctl |
| 130 | * at all.) Linux, glibc and *BSD all treat ioctl numbers as |
| 131 | * unsigned, and real-world ioctl values like KVM_GET_XSAVE have |
| 132 | * bit 31 set, which means that passing them via an 'int' will |
| 133 | * result in sign-extension when they get converted back to the |
| 134 | * 'unsigned long' which the ioctl() prototype uses. Luckily Linux |
| 135 | * always treats the argument as an unsigned 32-bit int, so any |
| 136 | * possible sign-extension is deliberately ignored, but for |
| 137 | * consistency we keep to the same type that glibc is using. |
| 138 | */ |
| 139 | unsigned long irq_set_ioctl; |
| 140 | unsigned int sigmask_len; |
| 141 | GHashTable *gsimap; |
| 142 | #ifdef KVM_CAP_IRQ_ROUTING |
| 143 | struct kvm_irq_routing *irq_routes; |
| 144 | int nr_allocated_irq_routes; |
| 145 | unsigned long *used_gsi_bitmap; |
| 146 | unsigned int gsi_count; |
| 147 | #endif |
| 148 | KVMMemoryListener memory_listener; |
| 149 | QLIST_HEAD(, KVMParkedVcpu) kvm_parked_vcpus; |
| 150 | |
| 151 | /* For "info mtree -f" to tell if an MR is registered in KVM */ |
| 152 | int nr_as; |
| 153 | struct KVMAs { |
| 154 | KVMMemoryListener *ml; |
| 155 | AddressSpace *as; |
| 156 | } *as; |
| 157 | uint64_t kvm_dirty_ring_bytes; /* Size of the per-vcpu dirty ring */ |
| 158 | uint32_t kvm_dirty_ring_size; /* Number of dirty GFNs per ring */ |
| 159 | bool kvm_dirty_ring_with_bitmap; |
| 160 | uint64_t kvm_eager_split_size; /* Eager Page Splitting chunk size */ |
| 161 | struct KVMDirtyRingReaper reaper; |
| 162 | struct KVMMsrEnergy msr_energy; |
| 163 | NotifyVmexitOption notify_vmexit; |
| 164 | uint32_t notify_window; |
| 165 | uint32_t xen_version; |
| 166 | uint32_t xen_caps; |
| 167 | uint16_t xen_gnttab_max_frames; |
| 168 | uint16_t xen_evtchn_max_pirq; |
| 169 | char *device; |
| 170 | OnOffAuto honor_guest_pat; |
| 171 | }; |
| 172 | |
| 173 | void kvm_memory_listener_register(KVMState *s, KVMMemoryListener *kml, |
| 174 | AddressSpace *as, int as_id, const char *name); |
| 175 | |
| 176 | void kvm_set_max_memslot_size(hwaddr max_slot_size); |
| 177 | |
| 178 | /** |
| 179 | * kvm_hwpoison_page_add: |
| 180 | * |
| 181 | * Parameters: |
| 182 | * @ram_addr: the address in the RAM for the poisoned page |
| 183 | * |
| 184 | * Add a poisoned page to the list |
| 185 | * |
| 186 | * Return: None. |
| 187 | */ |
| 188 | void kvm_hwpoison_page_add(ram_addr_t ram_addr); |
| 189 | #endif |