Go to the documentation of this file.
41 #include "debug/VIO.hh"
42 #include "params/VirtIODeviceBase.hh"
43 #include "params/VirtIODummyDevice.hh"
47 : memProxy(&_memProxy), queue(&_queue),
byteOrder(
bo), _index(descIndex),
54 *
this = std::forward<VirtDescriptor>(other);
64 memProxy = std::move(rhs.memProxy);
65 queue = std::move(rhs.queue);
67 _index = std::move(rhs._index);
68 desc = std::move(rhs.desc);
81 assert(_index < queue->getSize());
87 "VirtDescriptor(%i): Addr: 0x%x, Len: %i, Flags: 0x%x, "
101 panic(
"Loop in descriptor chain!\n");
110 DPRINTF(VIO,
"Descriptor[%i]: "
111 "Addr: 0x%x, Len: %i, Flags: 0x%x, Next: 0x%x\n",
146 DPRINTF(VIO,
"VirtDescriptor(%p, 0x%x, %i)::read: offset: %i, dst: 0x%x, size: %i\n",
150 panic(
"Trying to read from outgoing buffer\n");
158 DPRINTF(VIO,
"VirtDescriptor(%p, 0x%x, %i)::write: offset: %i, src: 0x%x, size: %i\n",
162 panic(
"Trying to write to incoming buffer\n");
171 const size_t full_size(
size);
173 if (offset < desc->
size()) {
185 panic(
"Failed to read %i bytes from chain of %i bytes @ offset %i\n",
194 const size_t full_size(
size);
196 if (offset < desc->
size()) {
208 panic(
"Failed to write %i bytes into chain of %i bytes @ offset %i\n",
228 :
byteOrder(
bo), _size(size), _address(0), memProxy(proxy),
229 avail(proxy,
bo, size), used(proxy,
bo, size),
262 _size *
sizeof(uint16_t));
263 const Addr addr_used((addr_avail_end +
sizeof(uint16_t) +
274 DPRINTF(VIO,
"consumeDescriptor: _last_avail: %i, avail.idx: %i (->%i)\n",
293 DPRINTF(VIO,
"produceDescriptor: dscIdx: %i, len: %i, used.idx: %i\n",
330 deviceId(
id), configSize(config_size), deviceFeatures(features),
331 _deviceStatus(0), _queueSelect(0)
374 DPRINTF(VIO,
"onNotify: idx: %i\n", idx);
376 panic(
"Guest tried to notify queue (%i), but only %i "
377 "queues registered.\n",
386 DPRINTF(VIO,
"Setting guest features: 0x%x\n", features);
388 panic(
"Guest tried to enable unsupported features:\n"
389 "Device features: 0x%x\n"
390 "Requested features: 0x%x\n",
401 DPRINTF(VIO,
"ACK: %i, DRIVER: %i, DRIVER_OK: %i, FAILED: %i\n",
410 panic(
"Unhandled device config read (offset: 0x%x).\n", cfgOffset);
416 panic(
"Unhandled device config write (offset: 0x%x).\n", cfgOffset);
422 const unsigned size(pkt->
getSize());
425 panic(
"Config read out of bounds.\n");
428 pkt->
setData(
const_cast<uint8_t *
>(cfg) + cfgOffset);
434 const unsigned size(pkt->
getSize());
437 panic(
"Config write out of bounds.\n");
440 pkt->
writeData((uint8_t *)cfg + cfgOffset);
489 VirtIODummyDeviceParams::create()
void onNotify(QueueID index)
Driver is requesting service.
size_t size() const
Retrieve the size of this descriptor.
QueueID _queueSelect
Queue select register (set by guest)
PortProxy * memProxy
Pointer to memory proxy.
void unserializeSection(CheckpointIn &cp, const char *name)
Unserialize an a child object.
Base wrapper around a virtqueue.
Index index() const
Get the descriptor's index into the virtqueue.
std::vector< VirtQueue * > _queues
List of virtual queues supported by this device.
void produceDescriptor(VirtDescriptor *desc, uint32_t len)
Send a descriptor chain to the guest.
virtual void onNotify()
Notify queue of pending events.
#define UNSERIALIZE_SCALAR(scalar)
virtual void readConfig(PacketPtr pkt, Addr cfgOffset)
Read from the configuration space of a device.
void writeData(uint8_t *p) const
Copy data from the packet to the memory at the provided pointer.
ByteOrder byteOrder(const ThreadContext *tc)
FeatureBits guestFeatures
Feature set accepted by the guest.
void registerQueue(VirtQueue &queue)
Register a new VirtQueue with the device model.
const VirtQueue & getCurrentQueue() const
Convenience method to get the currently selected queue.
void unserialize(CheckpointIn &cp) override
Unserialize an object.
void readHeader()
Update the ring buffer header with data from the guest.
void dumpChain() const
Dump the contents of a descriptor chain starting at this descriptor.
uint16_t _last_avail
Offset of last consumed descriptor in the VirtQueue::avail ring.
Base class for all VirtIO-based devices.
uint32_t getQueueAddress() const
Get the host physical address of the currently active queue.
VirtDescriptor & operator=(VirtDescriptor &&rhs) noexcept
uint16_t DeviceId
Device Type (sometimes known as subsystem ID)
void update()
Populate this descriptor with data from the guest.
const FeatureBits deviceFeatures
Feature set offered by the device.
VirtIODeviceBase(Params *params, DeviceId id, size_t config_size, FeatureBits features)
void serializeSection(CheckpointOut &cp, const char *name) const
Serialize an object into a new section.
VirtRing< struct vring_used_elem > used
Ring of used (outgoing) descriptors.
void setQueueAddress(uint32_t address)
Change the host physical address of the currently active queue.
void setData(const uint8_t *p)
Copy data into the packet from the provided pointer.
void setAddress(Addr address)
Set the base address of this queue.
bool hasNext() const
Is this descriptor chained to another descriptor?
void writeBlob(Addr addr, const void *p, int size) const
Same as tryWriteBlob, but insists on success.
ByteOrder byteOrder
The byte order the descriptor is stored in.
std::vector< VirtDescriptor > descriptors
Vector of pre-created descriptors indexed by their index into the queue.
const size_t configSize
Size of the device's configuration space.
bool isIncoming() const
Check if this is a read-only descriptor (incoming data).
void dump() const
Dump the contents of a queue.
static const Addr ALIGN_SIZE
Addr getAddress() const
Get the guest physical address of this queue.
VirtQueue * queue
Pointer to virtqueue owning this descriptor.
void dump() const
Dump the contents of a descriptor.
void unserialize(CheckpointIn &cp) override
Unserialize an object.
virtual void onNotifyDescriptor(VirtDescriptor *desc)
Notify queue of pending incoming descriptor.
VirtDescriptor * getDescriptor(VirtDescriptor::Index index)
Get a pointer to a specific descriptor in the queue.
Index _index
Index in virtqueue.
void readConfigBlob(PacketPtr pkt, Addr cfgOffset, const uint8_t *cfg)
Read configuration data from a device structure.
VirtRing< VirtDescriptor::Index > avail
Ring of available (incoming) descriptors.
void chainWrite(size_t offset, const uint8_t *src, size_t size)
Write to a descriptor chain.
void read(size_t offset, uint8_t *dst, size_t size) const
Read the contents of a descriptor.
size_t chainSize() const
Retrieve the size of this descriptor chain.
std::vector< T > ring
Elements in ring in host byte order.
vring_desc desc
Underlying descriptor.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
void serialize(CheckpointOut &cp) const override
Serialize an object.
void makeResponse()
Take a request packet and modify it in place to be suitable for returning as a response to that reque...
void setAddress(Addr addr)
Set the base address of the VirtIO ring buffer.
#define SERIALIZE_SCALAR(scalar)
#define DDUMP(x, data, count)
DPRINTF is a debugging trace facility that allows one to selectively enable tracing statements.
void setGuestFeatures(FeatureBits features)
Set feature bits accepted by the guest driver.
uint16_t Index
Descriptor index in virtqueue.
void chainRead(size_t offset, uint8_t *dst, size_t size) const
Read the contents of a descriptor chain.
This object is a proxy for a port or other object which implements the functional response protocol,...
void updateChain()
Populate this descriptor chain with data from the guest.
const uint16_t _size
Queue size in terms of number of descriptors.
void setDeviceStatus(DeviceStatus status)
Update device status and optionally reset device.
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
void paramIn(CheckpointIn &cp, const string &name, ExtMachInst &machInst)
static const Addr ALIGN_BITS
Page size used by VirtIO. It's hard-coded to 4096 bytes in the spec for historical reasons.
bool isOutgoing() const
Check if this is a write-only descriptor (outgoing data).
Header header
Ring buffer header in host byte order.
std::ostream CheckpointOut
VirtIODummyDevice(VirtIODummyDeviceParams *params)
void write(size_t offset, const uint8_t *src, size_t size)
Write to the contents of a descriptor.
VirtDescriptor * consumeDescriptor()
Get an incoming descriptor chain from the queue.
T gtoh(T value, ByteOrder guest_byte_order)
void serialize(CheckpointOut &cp) const override
Serialize an object.
virtual ~VirtIODeviceBase()
DeviceStatus _deviceStatus
Status of the device.
Addr _address
Base address of the queue.
void readBlob(Addr addr, void *p, int size) const
Higher level interfaces based on the above.
~VirtDescriptor() noexcept
std::string csprintf(const char *format, const Args &...args)
VirtDescriptor * next() const
Get the pointer to the next descriptor in a chain.
void writeConfigBlob(PacketPtr pkt, Addr cfgOffset, uint8_t *cfg)
Write configuration data to a device structure.
VirtIO descriptor (chain) wrapper.
#define panic(...)
This implements a cprintf based panic() function.
virtual void writeConfig(PacketPtr pkt, Addr cfgOffset)
Write to the configuration space of a device.
virtual void reset()
Driver-request device reset.
Abstract superclass for simulation objects.
Generated on Wed Sep 30 2020 14:02:08 for gem5 by doxygen 1.8.17