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-serial.h (6365B)


      1/*
      2 * Virtio Serial / Console Support
      3 *
      4 * Copyright IBM, Corp. 2008
      5 * Copyright Red Hat, Inc. 2009, 2010
      6 *
      7 * Authors:
      8 *  Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
      9 *  Amit Shah <amit.shah@redhat.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
     16#ifndef QEMU_VIRTIO_SERIAL_H
     17#define QEMU_VIRTIO_SERIAL_H
     18
     19#include "standard-headers/linux/virtio_console.h"
     20#include "hw/virtio/virtio.h"
     21#include "qom/object.h"
     22
     23struct virtio_serial_conf {
     24    /* Max. number of ports we can have for a virtio-serial device */
     25    uint32_t max_virtserial_ports;
     26};
     27
     28#define TYPE_VIRTIO_SERIAL_PORT "virtio-serial-port"
     29OBJECT_DECLARE_TYPE(VirtIOSerialPort, VirtIOSerialPortClass,
     30                    VIRTIO_SERIAL_PORT)
     31
     32typedef struct VirtIOSerial VirtIOSerial;
     33
     34#define TYPE_VIRTIO_SERIAL_BUS "virtio-serial-bus"
     35OBJECT_DECLARE_SIMPLE_TYPE(VirtIOSerialBus, VIRTIO_SERIAL_BUS)
     36
     37
     38struct VirtIOSerialPortClass {
     39    DeviceClass parent_class;
     40
     41    /* Is this a device that binds with hvc in the guest? */
     42    bool is_console;
     43
     44    /*
     45     * The per-port (or per-app) realize function that's called when a
     46     * new device is found on the bus.
     47     */
     48    DeviceRealize realize;
     49    /*
     50     * Per-port unrealize function that's called when a port gets
     51     * hot-unplugged or removed.
     52     */
     53    DeviceUnrealize unrealize;
     54
     55    /* Callbacks for guest events */
     56        /* Guest opened/closed device. */
     57    void (*set_guest_connected)(VirtIOSerialPort *port, int guest_connected);
     58
     59    /* Enable/disable backend for virtio serial port */
     60    void (*enable_backend)(VirtIOSerialPort *port, bool enable);
     61
     62        /* Guest is now ready to accept data (virtqueues set up). */
     63    void (*guest_ready)(VirtIOSerialPort *port);
     64
     65        /*
     66         * Guest has enqueued a buffer for the host to write into.
     67         * Called each time a buffer is enqueued by the guest;
     68         * irrespective of whether there already were free buffers the
     69         * host could have consumed.
     70         *
     71         * This is dependent on both the guest and host end being
     72         * connected.
     73         */
     74    void (*guest_writable)(VirtIOSerialPort *port);
     75
     76    /*
     77     * Guest wrote some data to the port. This data is handed over to
     78     * the app via this callback.  The app can return a size less than
     79     * 'len'.  In this case, throttling will be enabled for this port.
     80     */
     81    ssize_t (*have_data)(VirtIOSerialPort *port, const uint8_t *buf,
     82                         ssize_t len);
     83};
     84
     85/*
     86 * This is the state that's shared between all the ports.  Some of the
     87 * state is configurable via command-line options. Some of it can be
     88 * set by individual devices in their initfn routines. Some of the
     89 * state is set by the generic qdev device init routine.
     90 */
     91struct VirtIOSerialPort {
     92    DeviceState dev;
     93
     94    QTAILQ_ENTRY(VirtIOSerialPort) next;
     95
     96    /*
     97     * This field gives us the virtio device as well as the qdev bus
     98     * that we are associated with
     99     */
    100    VirtIOSerial *vser;
    101
    102    VirtQueue *ivq, *ovq;
    103
    104    /*
    105     * This name is sent to the guest and exported via sysfs.
    106     * The guest could create symlinks based on this information.
    107     * The name is in the reverse fqdn format, like org.qemu.console.0
    108     */
    109    char *name;
    110
    111    /*
    112     * This id helps identify ports between the guest and the host.
    113     * The guest sends a "header" with this id with each data packet
    114     * that it sends and the host can then find out which associated
    115     * device to send out this data to
    116     */
    117    uint32_t id;
    118
    119    /*
    120     * This is the elem that we pop from the virtqueue.  A slow
    121     * backend that consumes guest data (e.g. the file backend for
    122     * qemu chardevs) can cause the guest to block till all the output
    123     * is flushed.  This isn't desired, so we keep a note of the last
    124     * element popped and continue consuming it once the backend
    125     * becomes writable again.
    126     */
    127    VirtQueueElement *elem;
    128
    129    /*
    130     * The index and the offset into the iov buffer that was popped in
    131     * elem above.
    132     */
    133    uint32_t iov_idx;
    134    uint64_t iov_offset;
    135
    136    /*
    137     * When unthrottling we use a bottom-half to call flush_queued_data.
    138     */
    139    QEMUBH *bh;
    140
    141    /* Is the corresponding guest device open? */
    142    bool guest_connected;
    143    /* Is this device open for IO on the host? */
    144    bool host_connected;
    145    /* Do apps not want to receive data? */
    146    bool throttled;
    147};
    148
    149/* The virtio-serial bus on top of which the ports will ride as devices */
    150struct VirtIOSerialBus {
    151    BusState qbus;
    152
    153    /* This is the parent device that provides the bus for ports. */
    154    VirtIOSerial *vser;
    155
    156    /* The maximum number of ports that can ride on top of this bus */
    157    uint32_t max_nr_ports;
    158};
    159
    160typedef struct VirtIOSerialPostLoad {
    161    QEMUTimer *timer;
    162    uint32_t nr_active_ports;
    163    struct {
    164        VirtIOSerialPort *port;
    165        uint8_t host_connected;
    166    } *connected;
    167} VirtIOSerialPostLoad;
    168
    169struct VirtIOSerial {
    170    VirtIODevice parent_obj;
    171
    172    VirtQueue *c_ivq, *c_ovq;
    173    /* Arrays of ivqs and ovqs: one per port */
    174    VirtQueue **ivqs, **ovqs;
    175
    176    VirtIOSerialBus bus;
    177
    178    QTAILQ_HEAD(, VirtIOSerialPort) ports;
    179
    180    QLIST_ENTRY(VirtIOSerial) next;
    181
    182    /* bitmap for identifying active ports */
    183    uint32_t *ports_map;
    184
    185    struct VirtIOSerialPostLoad *post_load;
    186
    187    virtio_serial_conf serial;
    188
    189    uint64_t host_features;
    190};
    191
    192/* Interface to the virtio-serial bus */
    193
    194/*
    195 * Open a connection to the port
    196 *   Returns 0 on success (always).
    197 */
    198int virtio_serial_open(VirtIOSerialPort *port);
    199
    200/*
    201 * Close the connection to the port
    202 *   Returns 0 on success (always).
    203 */
    204int virtio_serial_close(VirtIOSerialPort *port);
    205
    206/*
    207 * Send data to Guest
    208 */
    209ssize_t virtio_serial_write(VirtIOSerialPort *port, const uint8_t *buf,
    210                            size_t size);
    211
    212/*
    213 * Query whether a guest is ready to receive data.
    214 */
    215size_t virtio_serial_guest_ready(VirtIOSerialPort *port);
    216
    217/*
    218 * Flow control: Ports can signal to the virtio-serial core to stop
    219 * sending data or re-start sending data, depending on the 'throttle'
    220 * value here.
    221 */
    222void virtio_serial_throttle_port(VirtIOSerialPort *port, bool throttle);
    223
    224#define TYPE_VIRTIO_SERIAL "virtio-serial-device"
    225OBJECT_DECLARE_SIMPLE_TYPE(VirtIOSerial, VIRTIO_SERIAL)
    226
    227#endif