qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

kvm_int.h (3600B)


      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