/**
 * FILE: virtio-demo.h
 * --------------------
 * Common header for the virtio-demo device.
 */

#ifndef QEMU_VIRTIO_DEMO_H
#define QEMU_VIRTIO_DEMO_H

#include "hw/virtio/virtio.h"
#include "sysemu/iothread.h"
#include "standard-headers/linux/virtio_demo.h"
#include "qom/object.h"

#define TYPE_VIRTIO_DEMO "virtio-demo-device"

// Enables one to use a VIRTIO_DEMO()
// macro to obtain reference to a
// struct VirtIODemo from an Object.
// -----------------------------------
// - OBJECT_DECLARE_SIMPLE_TYPE() is used to define classes
// that dont need additional virtual methods declared.
// - OBJECT_DECLARE_TYPE() is used to declare classes
// that need additional virtual methods. (see scsi-disk.c)
OBJECT_DECLARE_SIMPLE_TYPE(VirtIODemo, VIRTIO_DEMO)

// A struct to hold any local VirtIODemo device data.
// Attributes depend on your device semantics.
// - Usually contains the device virtqueues.
// - Contains any data required to implement
// the VirtioDeviceClass (see virtio.h) methods.
struct VirtIODemo
{
    VirtIODevice parent_obj; // seems compulsory; not sure why
    VirtQueue *vq;           // resps from host, reqs from guest.
    uint64_t host_features;  // necessary by virtio spec
};

size_t virtio_demo_handle_mult_iov(VirtIODevice *vdev,
                                    const struct iovec *in_sg, unsigned in_num,
                                    const struct iovec *out_sg,
                                    unsigned out_num);

#endif