| #ifndef VHOST_H | 
 | #define VHOST_H | 
 |  | 
 | #include "hw/hw.h" | 
 | #include "hw/virtio.h" | 
 | #include "exec/memory.h" | 
 |  | 
 | /* Generic structures common for any vhost based device. */ | 
 | struct vhost_virtqueue { | 
 |     int kick; | 
 |     int call; | 
 |     void *desc; | 
 |     void *avail; | 
 |     void *used; | 
 |     int num; | 
 |     unsigned long long used_phys; | 
 |     unsigned used_size; | 
 |     void *ring; | 
 |     unsigned long long ring_phys; | 
 |     unsigned ring_size; | 
 |     EventNotifier masked_notifier; | 
 | }; | 
 |  | 
 | typedef unsigned long vhost_log_chunk_t; | 
 | #define VHOST_LOG_PAGE 0x1000 | 
 | #define VHOST_LOG_BITS (8 * sizeof(vhost_log_chunk_t)) | 
 | #define VHOST_LOG_CHUNK (VHOST_LOG_PAGE * VHOST_LOG_BITS) | 
 |  | 
 | struct vhost_memory; | 
 | struct vhost_dev { | 
 |     MemoryListener memory_listener; | 
 |     int control; | 
 |     struct vhost_memory *mem; | 
 |     int n_mem_sections; | 
 |     MemoryRegionSection *mem_sections; | 
 |     struct vhost_virtqueue *vqs; | 
 |     int nvqs; | 
 |     /* the first virtuque which would be used by this vhost dev */ | 
 |     int vq_index; | 
 |     unsigned long long features; | 
 |     unsigned long long acked_features; | 
 |     unsigned long long backend_features; | 
 |     bool started; | 
 |     bool log_enabled; | 
 |     vhost_log_chunk_t *log; | 
 |     unsigned long long log_size; | 
 |     bool force; | 
 | }; | 
 |  | 
 | int vhost_dev_init(struct vhost_dev *hdev, int devfd, const char *devpath, | 
 |                    bool force); | 
 | void vhost_dev_cleanup(struct vhost_dev *hdev); | 
 | bool vhost_dev_query(struct vhost_dev *hdev, VirtIODevice *vdev); | 
 | int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev); | 
 | void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev); | 
 | int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev); | 
 | void vhost_dev_disable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev); | 
 |  | 
 | /* Test and clear masked event pending status. | 
 |  * Should be called after unmask to avoid losing events. | 
 |  */ | 
 | bool vhost_virtqueue_pending(struct vhost_dev *hdev, int n); | 
 |  | 
 | /* Mask/unmask events from this vq. | 
 |  */ | 
 | void vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n, | 
 |                           bool mask); | 
 | #endif |