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

virtio-pci.h (7460B)


      1/*
      2 * Virtio PCI Bindings
      3 *
      4 * Copyright IBM, Corp. 2007
      5 * Copyright (c) 2009 CodeSourcery
      6 *
      7 * Authors:
      8 *  Anthony Liguori   <aliguori@us.ibm.com>
      9 *  Paul Brook        <paul@codesourcery.com>
     10 *
     11 * This work is licensed under the terms of the GNU GPL, version 2.  See
     12 * the COPYING file in the top-level directory.
     13 */
     14
     15#ifndef QEMU_VIRTIO_PCI_H
     16#define QEMU_VIRTIO_PCI_H
     17
     18#include "hw/pci/msi.h"
     19#include "hw/virtio/virtio-bus.h"
     20#include "qom/object.h"
     21
     22
     23/* virtio-pci-bus */
     24
     25typedef struct VirtioBusState VirtioPCIBusState;
     26typedef struct VirtioBusClass VirtioPCIBusClass;
     27
     28#define TYPE_VIRTIO_PCI_BUS "virtio-pci-bus"
     29DECLARE_OBJ_CHECKERS(VirtioPCIBusState, VirtioPCIBusClass,
     30                     VIRTIO_PCI_BUS, TYPE_VIRTIO_PCI_BUS)
     31
     32enum {
     33    VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION_BIT,
     34    VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT,
     35    VIRTIO_PCI_FLAG_MIGRATE_EXTRA_BIT,
     36    VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY_BIT,
     37    VIRTIO_PCI_FLAG_DISABLE_PCIE_BIT,
     38    VIRTIO_PCI_FLAG_PAGE_PER_VQ_BIT,
     39    VIRTIO_PCI_FLAG_ATS_BIT,
     40    VIRTIO_PCI_FLAG_INIT_DEVERR_BIT,
     41    VIRTIO_PCI_FLAG_INIT_LNKCTL_BIT,
     42    VIRTIO_PCI_FLAG_INIT_PM_BIT,
     43    VIRTIO_PCI_FLAG_INIT_FLR_BIT,
     44    VIRTIO_PCI_FLAG_AER_BIT,
     45    VIRTIO_PCI_FLAG_ATS_PAGE_ALIGNED_BIT,
     46};
     47
     48/* Need to activate work-arounds for buggy guests at vmstate load. */
     49#define VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION \
     50    (1 << VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION_BIT)
     51
     52/* Performance improves when virtqueue kick processing is decoupled from the
     53 * vcpu thread using ioeventfd for some devices. */
     54#define VIRTIO_PCI_FLAG_USE_IOEVENTFD   (1 << VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT)
     55
     56/* virtio version flags */
     57#define VIRTIO_PCI_FLAG_DISABLE_PCIE (1 << VIRTIO_PCI_FLAG_DISABLE_PCIE_BIT)
     58
     59/* migrate extra state */
     60#define VIRTIO_PCI_FLAG_MIGRATE_EXTRA (1 << VIRTIO_PCI_FLAG_MIGRATE_EXTRA_BIT)
     61
     62/* have pio notification for modern device ? */
     63#define VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY \
     64    (1 << VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY_BIT)
     65
     66/* page per vq flag to be used by split drivers within guests */
     67#define VIRTIO_PCI_FLAG_PAGE_PER_VQ \
     68    (1 << VIRTIO_PCI_FLAG_PAGE_PER_VQ_BIT)
     69
     70/* address space translation service */
     71#define VIRTIO_PCI_FLAG_ATS (1 << VIRTIO_PCI_FLAG_ATS_BIT)
     72
     73/* Init error enabling flags */
     74#define VIRTIO_PCI_FLAG_INIT_DEVERR (1 << VIRTIO_PCI_FLAG_INIT_DEVERR_BIT)
     75
     76/* Init Link Control register */
     77#define VIRTIO_PCI_FLAG_INIT_LNKCTL (1 << VIRTIO_PCI_FLAG_INIT_LNKCTL_BIT)
     78
     79/* Init Power Management */
     80#define VIRTIO_PCI_FLAG_INIT_PM (1 << VIRTIO_PCI_FLAG_INIT_PM_BIT)
     81
     82/* Init Function Level Reset capability */
     83#define VIRTIO_PCI_FLAG_INIT_FLR (1 << VIRTIO_PCI_FLAG_INIT_FLR_BIT)
     84
     85/* Advanced Error Reporting capability */
     86#define VIRTIO_PCI_FLAG_AER (1 << VIRTIO_PCI_FLAG_AER_BIT)
     87
     88/* Page Aligned Address space Translation Service */
     89#define VIRTIO_PCI_FLAG_ATS_PAGE_ALIGNED \
     90  (1 << VIRTIO_PCI_FLAG_ATS_PAGE_ALIGNED_BIT)
     91
     92typedef struct {
     93    MSIMessage msg;
     94    int virq;
     95    unsigned int users;
     96} VirtIOIRQFD;
     97
     98/*
     99 * virtio-pci: This is the PCIDevice which has a virtio-pci-bus.
    100 */
    101#define TYPE_VIRTIO_PCI "virtio-pci"
    102OBJECT_DECLARE_TYPE(VirtIOPCIProxy, VirtioPCIClass, VIRTIO_PCI)
    103
    104struct VirtioPCIClass {
    105    PCIDeviceClass parent_class;
    106    DeviceRealize parent_dc_realize;
    107    void (*realize)(VirtIOPCIProxy *vpci_dev, Error **errp);
    108};
    109
    110typedef struct VirtIOPCIRegion {
    111    MemoryRegion mr;
    112    uint32_t offset;
    113    uint32_t size;
    114    uint32_t type;
    115} VirtIOPCIRegion;
    116
    117typedef struct VirtIOPCIQueue {
    118  uint16_t num;
    119  bool enabled;
    120  uint32_t desc[2];
    121  uint32_t avail[2];
    122  uint32_t used[2];
    123} VirtIOPCIQueue;
    124
    125struct VirtIOPCIProxy {
    126    PCIDevice pci_dev;
    127    MemoryRegion bar;
    128    union {
    129        struct {
    130            VirtIOPCIRegion common;
    131            VirtIOPCIRegion isr;
    132            VirtIOPCIRegion device;
    133            VirtIOPCIRegion notify;
    134            VirtIOPCIRegion notify_pio;
    135        };
    136        VirtIOPCIRegion regs[5];
    137    };
    138    MemoryRegion modern_bar;
    139    MemoryRegion io_bar;
    140    uint32_t legacy_io_bar_idx;
    141    uint32_t msix_bar_idx;
    142    uint32_t modern_io_bar_idx;
    143    uint32_t modern_mem_bar_idx;
    144    int config_cap;
    145    uint32_t flags;
    146    bool disable_modern;
    147    bool ignore_backend_features;
    148    OnOffAuto disable_legacy;
    149    uint32_t class_code;
    150    uint32_t nvectors;
    151    uint32_t dfselect;
    152    uint32_t gfselect;
    153    uint32_t guest_features[2];
    154    VirtIOPCIQueue vqs[VIRTIO_QUEUE_MAX];
    155
    156    VirtIOIRQFD *vector_irqfd;
    157    int nvqs_with_notifiers;
    158    VirtioBusState bus;
    159};
    160
    161static inline bool virtio_pci_modern(VirtIOPCIProxy *proxy)
    162{
    163    return !proxy->disable_modern;
    164}
    165
    166static inline bool virtio_pci_legacy(VirtIOPCIProxy *proxy)
    167{
    168    return proxy->disable_legacy == ON_OFF_AUTO_OFF;
    169}
    170
    171static inline void virtio_pci_force_virtio_1(VirtIOPCIProxy *proxy)
    172{
    173    proxy->disable_modern = false;
    174    proxy->disable_legacy = ON_OFF_AUTO_ON;
    175}
    176
    177static inline void virtio_pci_disable_modern(VirtIOPCIProxy *proxy)
    178{
    179    proxy->disable_modern = true;
    180}
    181
    182/*
    183 * virtio-input-pci: This extends VirtioPCIProxy.
    184 */
    185#define TYPE_VIRTIO_INPUT_PCI "virtio-input-pci"
    186
    187/* Virtio ABI version, if we increment this, we break the guest driver. */
    188#define VIRTIO_PCI_ABI_VERSION          0
    189
    190/* Input for virtio_pci_types_register() */
    191typedef struct VirtioPCIDeviceTypeInfo {
    192    /*
    193     * Common base class for the subclasses below.
    194     *
    195     * Required only if transitional_name or non_transitional_name is set.
    196     *
    197     * We need a separate base type instead of making all types
    198     * inherit from generic_name for two reasons:
    199     * 1) generic_name implements INTERFACE_PCIE_DEVICE, but
    200     *    transitional_name does not.
    201     * 2) generic_name has the "disable-legacy" and "disable-modern"
    202     *    properties, transitional_name and non_transitional name don't.
    203     */
    204    const char *base_name;
    205    /*
    206     * Generic device type.  Optional.
    207     *
    208     * Supports both transitional and non-transitional modes,
    209     * using the disable-legacy and disable-modern properties.
    210     * If disable-legacy=auto, (non-)transitional mode is selected
    211     * depending on the bus where the device is plugged.
    212     *
    213     * Implements both INTERFACE_PCIE_DEVICE and INTERFACE_CONVENTIONAL_PCI_DEVICE,
    214     * but PCI Express is supported only in non-transitional mode.
    215     *
    216     * The only type implemented by QEMU 3.1 and older.
    217     */
    218    const char *generic_name;
    219    /*
    220     * The transitional device type.  Optional.
    221     *
    222     * Implements both INTERFACE_PCIE_DEVICE and INTERFACE_CONVENTIONAL_PCI_DEVICE.
    223     */
    224    const char *transitional_name;
    225    /*
    226     * The non-transitional device type.  Optional.
    227     *
    228     * Implements INTERFACE_CONVENTIONAL_PCI_DEVICE only.
    229     */
    230    const char *non_transitional_name;
    231
    232    /* Parent type.  If NULL, TYPE_VIRTIO_PCI is used */
    233    const char *parent;
    234
    235    /* Same as TypeInfo fields: */
    236    size_t instance_size;
    237    size_t class_size;
    238    void (*instance_init)(Object *obj);
    239    void (*class_init)(ObjectClass *klass, void *data);
    240    InterfaceInfo *interfaces;
    241} VirtioPCIDeviceTypeInfo;
    242
    243/* Register virtio-pci type(s).  @t must be static. */
    244void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t);
    245
    246/**
    247 * virtio_pci_optimal_num_queues:
    248 * @fixed_queues: number of queues that are always present
    249 *
    250 * Returns: The optimal number of queues for a multi-queue device, excluding
    251 * @fixed_queues.
    252 */
    253unsigned virtio_pci_optimal_num_queues(unsigned fixed_queues);
    254
    255#endif