cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

vhost.h (4926B)


      1#ifndef VHOST_H
      2#define VHOST_H
      3
      4#include "hw/virtio/vhost-backend.h"
      5#include "hw/virtio/virtio.h"
      6#include "exec/memory.h"
      7
      8/* Generic structures common for any vhost based device. */
      9
     10struct vhost_inflight {
     11    int fd;
     12    void *addr;
     13    uint64_t size;
     14    uint64_t offset;
     15    uint16_t queue_size;
     16};
     17
     18struct vhost_virtqueue {
     19    int kick;
     20    int call;
     21    void *desc;
     22    void *avail;
     23    void *used;
     24    int num;
     25    unsigned long long desc_phys;
     26    unsigned desc_size;
     27    unsigned long long avail_phys;
     28    unsigned avail_size;
     29    unsigned long long used_phys;
     30    unsigned used_size;
     31    EventNotifier masked_notifier;
     32    struct vhost_dev *dev;
     33};
     34
     35typedef unsigned long vhost_log_chunk_t;
     36#define VHOST_LOG_PAGE 0x1000
     37#define VHOST_LOG_BITS (8 * sizeof(vhost_log_chunk_t))
     38#define VHOST_LOG_CHUNK (VHOST_LOG_PAGE * VHOST_LOG_BITS)
     39#define VHOST_INVALID_FEATURE_BIT   (0xff)
     40
     41struct vhost_log {
     42    unsigned long long size;
     43    int refcnt;
     44    int fd;
     45    vhost_log_chunk_t *log;
     46};
     47
     48struct vhost_dev;
     49struct vhost_iommu {
     50    struct vhost_dev *hdev;
     51    MemoryRegion *mr;
     52    hwaddr iommu_offset;
     53    IOMMUNotifier n;
     54    QLIST_ENTRY(vhost_iommu) iommu_next;
     55};
     56
     57typedef struct VhostDevConfigOps {
     58    /* Vhost device config space changed callback
     59     */
     60    int (*vhost_dev_config_notifier)(struct vhost_dev *dev);
     61} VhostDevConfigOps;
     62
     63struct vhost_memory;
     64struct vhost_dev {
     65    VirtIODevice *vdev;
     66    MemoryListener memory_listener;
     67    MemoryListener iommu_listener;
     68    struct vhost_memory *mem;
     69    int n_mem_sections;
     70    MemoryRegionSection *mem_sections;
     71    int n_tmp_sections;
     72    MemoryRegionSection *tmp_sections;
     73    struct vhost_virtqueue *vqs;
     74    unsigned int nvqs;
     75    /* the first virtqueue which would be used by this vhost dev */
     76    int vq_index;
     77    /* if non-zero, minimum required value for max_queues */
     78    int num_queues;
     79    uint64_t features;
     80    uint64_t acked_features;
     81    uint64_t backend_features;
     82    uint64_t protocol_features;
     83    uint64_t max_queues;
     84    uint64_t backend_cap;
     85    bool started;
     86    bool log_enabled;
     87    uint64_t log_size;
     88    Error *migration_blocker;
     89    const VhostOps *vhost_ops;
     90    void *opaque;
     91    struct vhost_log *log;
     92    QLIST_ENTRY(vhost_dev) entry;
     93    QLIST_HEAD(, vhost_iommu) iommu_list;
     94    IOMMUNotifier n;
     95    const VhostDevConfigOps *config_ops;
     96};
     97
     98extern const VhostOps kernel_ops;
     99extern const VhostOps user_ops;
    100extern const VhostOps vdpa_ops;
    101
    102struct vhost_net {
    103    struct vhost_dev dev;
    104    struct vhost_virtqueue vqs[2];
    105    int backend;
    106    NetClientState *nc;
    107};
    108
    109int vhost_dev_init(struct vhost_dev *hdev, void *opaque,
    110                   VhostBackendType backend_type,
    111                   uint32_t busyloop_timeout, Error **errp);
    112void vhost_dev_cleanup(struct vhost_dev *hdev);
    113int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev);
    114void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev);
    115int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev);
    116void vhost_dev_disable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev);
    117
    118/* Test and clear masked event pending status.
    119 * Should be called after unmask to avoid losing events.
    120 */
    121bool vhost_virtqueue_pending(struct vhost_dev *hdev, int n);
    122
    123/* Mask/unmask events from this vq.
    124 */
    125void vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n,
    126                          bool mask);
    127uint64_t vhost_get_features(struct vhost_dev *hdev, const int *feature_bits,
    128                            uint64_t features);
    129void vhost_ack_features(struct vhost_dev *hdev, const int *feature_bits,
    130                        uint64_t features);
    131bool vhost_has_free_slot(void);
    132
    133int vhost_net_set_backend(struct vhost_dev *hdev,
    134                          struct vhost_vring_file *file);
    135
    136int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write);
    137int vhost_dev_get_config(struct vhost_dev *hdev, uint8_t *config,
    138                         uint32_t config_len, Error **errp);
    139int vhost_dev_set_config(struct vhost_dev *dev, const uint8_t *data,
    140                         uint32_t offset, uint32_t size, uint32_t flags);
    141/* notifier callback in case vhost device config space changed
    142 */
    143void vhost_dev_set_config_notifier(struct vhost_dev *dev,
    144                                   const VhostDevConfigOps *ops);
    145
    146void vhost_dev_reset_inflight(struct vhost_inflight *inflight);
    147void vhost_dev_free_inflight(struct vhost_inflight *inflight);
    148void vhost_dev_save_inflight(struct vhost_inflight *inflight, QEMUFile *f);
    149int vhost_dev_load_inflight(struct vhost_inflight *inflight, QEMUFile *f);
    150int vhost_dev_prepare_inflight(struct vhost_dev *hdev, VirtIODevice *vdev);
    151int vhost_dev_set_inflight(struct vhost_dev *dev,
    152                           struct vhost_inflight *inflight);
    153int vhost_dev_get_inflight(struct vhost_dev *dev, uint16_t queue_size,
    154                           struct vhost_inflight *inflight);
    155#endif