38#ifndef __DEV_VIRTIO_BASE_HH__
39#define __DEV_VIRTIO_BASE_HH__
56struct VirtIODeviceBaseParams;
57struct VirtIODummyDeviceParams;
75inline std::enable_if_t<std::is_same_v<T, vring_used_elem>, T>
84inline std::enable_if_t<std::is_same_v<T, vring_desc>, T>
527 temp,
sizeof(T) *
ring.size());
528 for (
int i = 0;
i <
ring.size(); ++
i)
539 for (
int i = 0;
i <
ring.size(); ++
i)
542 temp,
sizeof(T) *
ring.size());
608 typedef VirtIODeviceBaseParams
Params;
718 virtual void reset();
Defines global host-dependent types: Counter, Tick, and (indirectly) {int,uint}{8,...
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
This object is a proxy for a port or other object which implements the functional response protocol,...
void readBlob(Addr addr, void *p, uint64_t size) const
Higher level interfaces based on the above.
void writeBlob(Addr addr, const void *p, uint64_t size) const
Same as tryWriteBlob, but insists on success.
Basic support for object serialization.
Abstract superclass for simulation objects.
VirtIO descriptor (chain) wrapper.
bool isOutgoing() const
Check if this is a write-only descriptor (outgoing data).
void update()
Populate this descriptor with data from the guest.
~VirtDescriptor() noexcept
bool hasNext() const
Is this descriptor chained to another descriptor?
PortProxy * memProxy
Pointer to memory proxy.
size_t size() const
Retrieve the size of this descriptor.
void dumpChain() const
Dump the contents of a descriptor chain starting at this descriptor.
ByteOrder byteOrder
The byte order the descriptor is stored in.
Index _index
Index in virtqueue.
VirtDescriptor(const VirtDescriptor &other)
void chainRead(size_t offset, uint8_t *dst, size_t size) const
Read the contents of a descriptor chain.
void dump() const
Dump the contents of a descriptor.
vring_desc desc
Underlying descriptor.
void read(size_t offset, uint8_t *dst, size_t size) const
Read the contents of a descriptor.
uint16_t Index
Descriptor index in virtqueue.
VirtDescriptor * next() const
Get the pointer to the next descriptor in a chain.
Index index() const
Get the descriptor's index into the virtqueue.
void chainWrite(size_t offset, const uint8_t *src, size_t size)
Write to a descriptor chain.
void write(size_t offset, const uint8_t *src, size_t size)
Write to the contents of a descriptor.
size_t chainSize() const
Retrieve the size of this descriptor chain.
VirtQueue * queue
Pointer to virtqueue owning this descriptor.
bool isIncoming() const
Check if this is a read-only descriptor (incoming data).
void updateChain()
Populate this descriptor chain with data from the guest.
Base class for all VirtIO-based devices.
void setDeviceStatus(DeviceStatus status)
Update device status and optionally reset device.
void kick()
Inform the guest of available buffers.
ByteOrder byteOrder
The byte order of the queues, descriptors, etc.
void readConfigBlob(PacketPtr pkt, Addr cfgOffset, const uint8_t *cfg)
Read configuration data from a device structure.
virtual ~VirtIODeviceBase()
const VirtQueue & getCurrentQueue() const
Convenience method to get the currently selected queue.
uint16_t VirtAddress
This is a VirtQueue address as exposed through the low-level interface. The address needs to be multi...
FeatureBits guestFeatures
Feature set accepted by the guest.
Bitfield< 0 > acknowledge
const size_t configSize
Size of the device's configuration space.
VirtIODeviceBase(const Params ¶ms, DeviceId id, size_t config_size, FeatureBits features)
virtual void writeConfig(PacketPtr pkt, Addr cfgOffset)
Write to the configuration space of a device.
FeatureBits getGuestFeatures() const
Get features accepted by the guest driver.
QueueID getQueueSelect() const
Get the currently active queue.
DeviceStatus getDeviceStatus() const
Retrieve the device status.
uint32_t getQueueAddress() const
Get the host physical address of the currently active queue.
void writeConfigBlob(PacketPtr pkt, Addr cfgOffset, uint8_t *cfg)
Write configuration data to a device structure.
QueueID _queueSelect
Queue select register (set by guest)
const FeatureBits deviceFeatures
Feature set offered by the device.
void unserialize(CheckpointIn &cp) override
Unserialize an object.
std::vector< VirtQueue * > _queues
List of virtual queues supported by this device.
virtual void reset()
Driver-request device reset.
std::function< void()> transKick
Callbacks to kick the guest through the transport layer
void onNotify(QueueID index)
Driver is requesting service.
void setQueueSelect(QueueID idx)
Change currently active queue.
void serialize(CheckpointOut &cp) const override
Serialize an object.
uint16_t getQueueSize() const
Get the size (descriptors) of the currently active queue.
BitUnion8(DeviceStatus) Bitfield< 7 > failed
void registerKickCallback(const std::function< void()> &callback)
Register a callback to kick the guest through the transport interface.
virtual void readConfig(PacketPtr pkt, Addr cfgOffset)
Read from the configuration space of a device.
uint16_t DeviceId
Device Type (sometimes known as subsystem ID)
void setQueueAddress(uint32_t address)
Change the host physical address of the currently active queue.
EndBitUnion(DeviceStatus) typedef VirtIODeviceBaseParams Params
const DeviceId deviceId
Device ID (sometimes known as subsystem ID)
void setGuestFeatures(FeatureBits features)
Set feature bits accepted by the guest driver.
void registerQueue(VirtQueue &queue)
Register a new VirtQueue with the device model.
DeviceStatus _deviceStatus
Status of the device.
static const DeviceId ID_INVALID
VirtIO device ID.
VirtIODummyDevice(const VirtIODummyDeviceParams ¶ms)
VirtIO ring buffer wrapper.
void reset()
Reset any state in the ring buffer.
Addr _base
Guest physical base address of the ring buffer.
PortProxy & _proxy
Guest physical memory proxy.
ByteOrder byteOrder
Byte order in the ring.
void readHeader()
Update the ring buffer header with data from the guest.
Header header
Ring buffer header in host byte order.
std::vector< T > ring
Elements in ring in host byte order.
void setAddress(Addr addr)
Set the base address of the VirtIO ring buffer.
Base wrapper around a virtqueue.
void unserialize(CheckpointIn &cp) override
Unserialize an object.
static const Addr ALIGN_BITS
Page size used by VirtIO. It's hard-coded to 4096 bytes in the spec for historical reasons.
void setAddress(Addr address)
Set the base address of this queue.
void produceDescriptor(VirtDescriptor *desc, uint32_t len)
Send a descriptor chain to the guest.
Addr getAddress() const
Get the guest physical address of this queue.
VirtRing< struct vring_used_elem > used
Ring of used (outgoing) descriptors.
std::vector< VirtDescriptor > descriptors
Vector of pre-created descriptors indexed by their index into the queue.
static const Addr ALIGN_SIZE
uint16_t getSize() const
Get the number of descriptors available in this queue.
VirtRing< VirtDescriptor::Index > avail
Ring of available (incoming) descriptors.
virtual void onNotify()
Notify queue of pending events.
uint16_t _last_avail
Offset of last consumed descriptor in the VirtQueue::avail ring.
void reset()
Reset cached state in this queue and in the associated ring buffers.
const uint16_t _size
Queue size in terms of number of descriptors.
void serialize(CheckpointOut &cp) const override
Serialize an object.
PortProxy & memProxy
Guest physical memory proxy.
Addr _address
Base address of the queue.
ByteOrder byteOrder
Byte order in this queue.
VirtDescriptor * consumeDescriptor()
Get an incoming descriptor chain from the queue.
VirtDescriptor * getDescriptor(VirtDescriptor::Index index)
Get a pointer to a specific descriptor in the queue.
void dump() const
Dump the contents of a queue.
virtual void onNotifyDescriptor(VirtDescriptor *desc)
Notify queue of pending incoming descriptor.
const Params & params() const
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
std::enable_if_t< std::is_same_v< T, vring_used_elem >, T > swap_byte(T v)
std::ostream CheckpointOut
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
T gtoh(T value, ByteOrder guest_byte_order)
T htog(T value, ByteOrder guest_byte_order)
PortProxy Object Declaration.
#define VRING_DESC_F_WRITE
#define VRING_DESC_F_NEXT