gem5  v21.0.1.0
base.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014, 2016, 2021 ARM Limited
3  * All rights reserved
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions are
16  * met: redistributions of source code must retain the above copyright
17  * notice, this list of conditions and the following disclaimer;
18  * redistributions in binary form must reproduce the above copyright
19  * notice, this list of conditions and the following disclaimer in the
20  * documentation and/or other materials provided with the distribution;
21  * neither the name of the copyright holders nor the names of its
22  * contributors may be used to endorse or promote products derived from
23  * this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  */
37 
38 #include "dev/virtio/base.hh"
39 
40 #include "base/trace.hh"
41 #include "debug/VIO.hh"
42 #include "params/VirtIODeviceBase.hh"
43 #include "params/VirtIODummyDevice.hh"
44 #include "sim/serialize.hh"
45 
47  VirtQueue &_queue, Index descIndex)
48  : memProxy(&_memProxy), queue(&_queue), byteOrder(bo), _index(descIndex),
49  desc{0, 0, 0, 0}
50 {
51 }
52 
54 {
55  *this = std::forward<VirtDescriptor>(other);
56 }
57 
59 {
60 }
61 
64 {
65  memProxy = std::move(rhs.memProxy);
66  queue = std::move(rhs.queue);
67  byteOrder = std::move(rhs.byteOrder);
68  _index = std::move(rhs._index);
69  desc = std::move(rhs.desc);
70 
71  return *this;
72 }
73 
74 void
76 {
77  const Addr vq_addr(queue->getAddress());
78  // Check if the queue has been initialized yet
79  if (vq_addr == 0)
80  return;
81 
82  assert(_index < queue->getSize());
83  const Addr desc_addr(vq_addr + sizeof(desc) * _index);
84  vring_desc guest_desc;
85  memProxy->readBlob(desc_addr, &guest_desc, sizeof(guest_desc));
86  desc = gtoh(guest_desc, byteOrder);
87  DPRINTF(VIO,
88  "VirtDescriptor(%i): Addr: 0x%x, Len: %i, Flags: 0x%x, "
89  "Next: 0x%x\n",
91 }
92 
93 void
95 {
96  VirtDescriptor *desc(this);
97  do {
98  desc->update();
99  } while ((desc = desc->next()) != NULL && desc != this);
100 
101  if (desc == this)
102  panic("Loop in descriptor chain!\n");
103 }
104 
105 void
107 {
108  if (!DTRACE(VIO))
109  return;
110 
111  DPRINTF(VIO, "Descriptor[%i]: "
112  "Addr: 0x%x, Len: %i, Flags: 0x%x, Next: 0x%x\n",
114 
115  if (isIncoming()) {
116  uint8_t data[desc.len];
117  read(0, data, desc.len);
118  DDUMP(VIO, data, desc.len);
119  }
120 }
121 
122 void
124 {
125  if (!DTRACE(VIO))
126  return;
127 
128  const VirtDescriptor *desc(this);
129  do {
130  desc->dump();
131  } while ((desc = desc->next()) != NULL);
132 }
133 
136 {
137  if (hasNext()) {
138  return queue->getDescriptor(desc.next);
139  } else {
140  return NULL;
141  }
142 }
143 
144 void
145 VirtDescriptor::read(size_t offset, uint8_t *dst, size_t size) const
146 {
147  DPRINTF(VIO, "VirtDescriptor(%p, 0x%x, %i)::read: offset: %i, dst: 0x%x, size: %i\n",
148  this, desc.addr, desc.len, offset, (long)dst, size);
149  assert(size <= desc.len - offset);
150  if (!isIncoming())
151  panic("Trying to read from outgoing buffer\n");
152 
153  memProxy->readBlob(desc.addr + offset, dst, size);
154 }
155 
156 void
157 VirtDescriptor::write(size_t offset, const uint8_t *src, size_t size)
158 {
159  DPRINTF(VIO, "VirtDescriptor(%p, 0x%x, %i)::write: offset: %i, src: 0x%x, size: %i\n",
160  this, desc.addr, desc.len, offset, (long)src, size);
161  assert(size <= desc.len - offset);
162  if (!isOutgoing())
163  panic("Trying to write to incoming buffer\n");
164 
166 }
167 
168 void
169 VirtDescriptor::chainRead(size_t offset, uint8_t *dst, size_t size) const
170 {
171  const VirtDescriptor *desc(this);
172  const size_t full_size(size);
173  do {
174  if (offset < desc->size()) {
175  const size_t chunk_size(std::min(desc->size() - offset, size));
176  desc->read(offset, dst, chunk_size);
177  dst += chunk_size;
178  size -= chunk_size;
179  offset = 0;
180  } else {
181  offset -= desc->size();
182  }
183  } while ((desc = desc->next()) != NULL && desc->isIncoming() && size > 0);
184 
185  if (size != 0) {
186  panic("Failed to read %i bytes from chain of %i bytes @ offset %i\n",
187  full_size, chainSize(), offset);
188  }
189 }
190 
191 void
192 VirtDescriptor::chainWrite(size_t offset, const uint8_t *src, size_t size)
193 {
194  VirtDescriptor *desc(this);
195  const size_t full_size(size);
196  do {
197  if (offset < desc->size()) {
198  const size_t chunk_size(std::min(desc->size() - offset, size));
199  desc->write(offset, src, chunk_size);
200  src += chunk_size;
201  size -= chunk_size;
202  offset = 0;
203  } else {
204  offset -= desc->size();
205  }
206  } while ((desc = desc->next()) != NULL && size > 0);
207 
208  if (size != 0) {
209  panic("Failed to write %i bytes into chain of %i bytes @ offset %i\n",
210  full_size, chainSize(), offset);
211  }
212 }
213 
214 size_t
216 {
217  size_t size(0);
218  const VirtDescriptor *desc(this);
219  do {
220  size += desc->size();
221  } while ((desc = desc->next()) != NULL);
222 
223  return size;
224 }
225 
226 
227 
228 VirtQueue::VirtQueue(PortProxy &proxy, ByteOrder bo, uint16_t size)
229  : byteOrder(bo), _size(size), _address(0), memProxy(proxy),
230  avail(proxy, bo, size), used(proxy, bo, size),
231  _last_avail(0)
232 {
233  descriptors.reserve(_size);
234  for (int i = 0; i < _size; ++i)
235  descriptors.emplace_back(proxy, bo, *this, i);
236 }
237 
238 void
240 {
243 }
244 
245 void
247 {
248  Addr addr_in;
249 
250  paramIn(cp, "_address", addr_in);
252 
253  // Use the address setter to ensure that the ring buffer addresses
254  // are updated as well.
255  setAddress(addr_in);
256 }
257 
258 void
260 {
261  _address = 0;
262  _last_avail = 0;
263 
264  avail.reset();
265  used.reset();
266 }
267 
268 void
270 {
271  const Addr addr_avail(address + _size * sizeof(struct vring_desc));
272  const Addr addr_avail_end(addr_avail + sizeof(struct vring_avail) +
273  _size * sizeof(uint16_t));
274  const Addr addr_used((addr_avail_end + sizeof(uint16_t) +
275  (ALIGN_SIZE - 1)) & ~(ALIGN_SIZE - 1));
276  _address = address;
277  avail.setAddress(addr_avail);
278  used.setAddress(addr_used);
279 }
280 
283 {
284  avail.read();
285  DPRINTF(VIO, "consumeDescriptor: _last_avail: %i, avail.idx: %i (->%i)\n",
286  _last_avail, avail.header.index,
287  avail.ring[_last_avail % used.ring.size()]);
288  if (_last_avail == avail.header.index)
289  return NULL;
290 
292  ++_last_avail;
293 
295  d->updateChain();
296 
297  return d;
298 }
299 
300 void
302 {
303  used.readHeader();
304  DPRINTF(VIO, "produceDescriptor: dscIdx: %i, len: %i, used.idx: %i\n",
305  desc->index(), len, used.header.index);
306 
307  struct vring_used_elem &e(used.ring[used.header.index % used.ring.size()]);
308  e.id = desc->index();
309  e.len = len;
310  used.header.index += 1;
311  used.write();
312 }
313 
314 void
316 {
317  if (!DTRACE(VIO))
318  return;
319 
320  for (const VirtDescriptor &d : descriptors)
321  d.dump();
322 }
323 
324 void
326 {
327  DPRINTF(VIO, "onNotify\n");
328 
329  // Consume all pending descriptors from the input queue.
330  VirtDescriptor *d;
331  while ((d = consumeDescriptor()) != NULL)
333 }
334 
335 
337  size_t config_size, FeatureBits features)
338  : SimObject(params),
339  guestFeatures(0),
340  byteOrder(params.byte_order),
341  deviceId(id), configSize(config_size), deviceFeatures(features),
342  _deviceStatus(0), _queueSelect(0)
343 {
344 }
345 
346 
348 {
349 }
350 
351 void
353 {
357  for (QueueID i = 0; i < _queues.size(); ++i)
358  _queues[i]->serializeSection(cp, csprintf("_queues.%i", i));
359 }
360 
361 void
363 {
367  for (QueueID i = 0; i < _queues.size(); ++i)
368  _queues[i]->unserializeSection(cp, csprintf("_queues.%i", i));
369 }
370 
371 void
373 {
374  _queueSelect = 0;
375  guestFeatures = 0;
376  _deviceStatus = 0;
377 
378  for (QueueID i = 0; i < _queues.size(); ++i)
379  _queues[i]->reset();
380 }
381 
382 void
384 {
385  DPRINTF(VIO, "onNotify: idx: %i\n", idx);
386  if (idx >= _queues.size()) {
387  panic("Guest tried to notify queue (%i), but only %i "
388  "queues registered.\n",
389  idx, _queues.size());
390  }
391  _queues[idx]->onNotify();
392 }
393 
394 void
396 {
397  DPRINTF(VIO, "Setting guest features: 0x%x\n", features);
398  if (~deviceFeatures & features) {
399  panic("Guest tried to enable unsupported features:\n"
400  "Device features: 0x%x\n"
401  "Requested features: 0x%x\n",
402  deviceFeatures, features);
403  }
404  guestFeatures = features;
405 }
406 
407 
408 void
410 {
412  DPRINTF(VIO, "ACK: %i, DRIVER: %i, DRIVER_OK: %i, FAILED: %i\n",
413  status.acknowledge, status.driver, status.driver_ok, status.failed);
414  if (status == 0)
415  reset();
416 }
417 
418 void
420 {
421  panic("Unhandled device config read (offset: 0x%x).\n", cfgOffset);
422 }
423 
424 void
426 {
427  panic("Unhandled device config write (offset: 0x%x).\n", cfgOffset);
428 }
429 
430 void
431 VirtIODeviceBase::readConfigBlob(PacketPtr pkt, Addr cfgOffset, const uint8_t *cfg)
432 {
433  const unsigned size(pkt->getSize());
434 
435  if (cfgOffset + size > configSize)
436  panic("Config read out of bounds.\n");
437 
438  pkt->makeResponse();
439  pkt->setData(const_cast<uint8_t *>(cfg) + cfgOffset);
440 }
441 
442 void
443 VirtIODeviceBase::writeConfigBlob(PacketPtr pkt, Addr cfgOffset, uint8_t *cfg)
444 {
445  const unsigned size(pkt->getSize());
446 
447  if (cfgOffset + size > configSize)
448  panic("Config write out of bounds.\n");
449 
450  pkt->makeResponse();
451  pkt->writeData((uint8_t *)cfg + cfgOffset);
452 }
453 
454 
455 const VirtQueue &
457 {
458  if (_queueSelect >= _queues.size())
459  panic("Guest tried to access non-existing VirtQueue (%i).\n", _queueSelect);
460 
461  return *_queues[_queueSelect];
462 }
463 
464 VirtQueue &
466 {
467  if (_queueSelect >= _queues.size())
468  panic("Guest tried to access non-existing VirtQueue (%i).\n", _queueSelect);
469 
470  return *_queues[_queueSelect];
471 }
472 
473 void
475 {
477 }
478 
479 uint32_t
481 {
482  Addr address(getCurrentQueue().getAddress());
483  assert(!(address & ((1 >> VirtQueue::ALIGN_BITS) - 1)));
484  return address >> VirtQueue::ALIGN_BITS;
485 }
486 
487 void
489 {
490  _queues.push_back(&queue);
491 }
492 
493 
494 VirtIODummyDevice::VirtIODummyDevice(const VirtIODummyDeviceParams &params)
495  : VirtIODeviceBase(params, ID_INVALID, 0, 0)
496 {
497 }
VirtQueue::VirtRing::read
void read()
Definition: base.hh:511
VirtIODeviceBase::onNotify
void onNotify(QueueID index)
Driver is requesting service.
Definition: base.cc:383
VirtDescriptor::size
size_t size() const
Retrieve the size of this descriptor.
Definition: base.hh:206
ArmISA::status
Bitfield< 5, 0 > status
Definition: miscregs_types.hh:417
VirtIODeviceBase::_queueSelect
QueueID _queueSelect
Queue select register (set by guest)
Definition: base.hh:888
VirtDescriptor::memProxy
PortProxy * memProxy
Pointer to memory proxy.
Definition: base.hh:272
Serializable::unserializeSection
void unserializeSection(CheckpointIn &cp, const char *name)
Unserialize an a child object.
Definition: serialize.cc:177
VirtDescriptor::VirtDescriptor
VirtDescriptor()
VirtQueue
Base wrapper around a virtqueue.
Definition: base.hh:295
VirtDescriptor::index
Index index() const
Get the descriptor's index into the virtqueue.
Definition: base.hh:137
SimObject::Params
SimObjectParams Params
Definition: sim_object.hh:162
VirtIODeviceBase::_queues
std::vector< VirtQueue * > _queues
List of virtual queues supported by this device.
Definition: base.hh:891
VirtQueue::produceDescriptor
void produceDescriptor(VirtDescriptor *desc, uint32_t len)
Send a descriptor chain to the guest.
Definition: base.cc:301
data
const char data[]
Definition: circlebuf.test.cc:47
VirtQueue::onNotify
virtual void onNotify()
Notify queue of pending events.
Definition: base.cc:325
MipsISA::index
Bitfield< 30, 0 > index
Definition: pra_constants.hh:44
serialize.hh
UNSERIALIZE_SCALAR
#define UNSERIALIZE_SCALAR(scalar)
Definition: serialize.hh:591
VirtIODeviceBase::readConfig
virtual void readConfig(PacketPtr pkt, Addr cfgOffset)
Read from the configuration space of a device.
Definition: base.cc:419
Packet::writeData
void writeData(uint8_t *p) const
Copy data from the packet to the memory at the provided pointer.
Definition: packet.hh:1255
ArmISA::byteOrder
ByteOrder byteOrder(const ThreadContext *tc)
Definition: utility.hh:430
VirtIODeviceBase::guestFeatures
FeatureBits guestFeatures
Feature set accepted by the guest.
Definition: base.hh:659
ArmISA::i
Bitfield< 7 > i
Definition: miscregs_types.hh:63
VirtIODeviceBase::registerQueue
void registerQueue(VirtQueue &queue)
Register a new VirtQueue with the device model.
Definition: base.cc:488
VirtIODeviceBase::getCurrentQueue
const VirtQueue & getCurrentQueue() const
Convenience method to get the currently selected queue.
Definition: base.cc:456
vring_desc::addr
uint64_t addr
Definition: virtio_ring.h:64
VirtQueue::unserialize
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: base.cc:246
VirtQueue::VirtRing::readHeader
void readHeader()
Update the ring buffer header with data from the guest.
Definition: base.hh:492
VirtDescriptor::dumpChain
void dumpChain() const
Dump the contents of a descriptor chain starting at this descriptor.
Definition: base.cc:123
VirtQueue::_last_avail
uint16_t _last_avail
Offset of last consumed descriptor in the VirtQueue::avail ring.
Definition: base.hh:561
VirtIODeviceBase
Base class for all VirtIO-based devices.
Definition: base.hh:578
vring_desc::len
uint32_t len
Definition: virtio_ring.h:66
PowerISA::bo
Bitfield< 25, 21 > bo
Definition: types.hh:62
DTRACE
#define DTRACE(x)
Definition: debug.hh:156
VirtIODeviceBase::getQueueAddress
uint32_t getQueueAddress() const
Get the host physical address of the currently active queue.
Definition: base.cc:480
VirtDescriptor::operator=
VirtDescriptor & operator=(VirtDescriptor &&rhs) noexcept
Definition: base.cc:63
VirtIODeviceBase::DeviceId
uint16_t DeviceId
Device Type (sometimes known as subsystem ID)
Definition: base.hh:590
VirtDescriptor::update
void update()
Populate this descriptor with data from the guest.
Definition: base.cc:75
Packet::getSize
unsigned getSize() const
Definition: packet.hh:765
VirtQueue::VirtQueue
VirtQueue()
VirtIODeviceBase::deviceFeatures
const FeatureBits deviceFeatures
Feature set offered by the device.
Definition: base.hh:870
Serializable::serializeSection
void serializeSection(CheckpointOut &cp, const char *name) const
Serialize an object into a new section.
Definition: serialize.cc:170
VirtQueue::used
VirtRing< struct vring_used_elem > used
Ring of used (outgoing) descriptors.
Definition: base.hh:557
VirtIODeviceBase::setQueueAddress
void setQueueAddress(uint32_t address)
Change the host physical address of the currently active queue.
Definition: base.cc:474
Packet::setData
void setData(const uint8_t *p)
Copy data into the packet from the provided pointer.
Definition: packet.hh:1226
VirtQueue::setAddress
void setAddress(Addr address)
Set the base address of this queue.
Definition: base.cc:269
VirtDescriptor::hasNext
bool hasNext() const
Is this descriptor chained to another descriptor?
Definition: base.hh:213
base.hh
PortProxy::writeBlob
void writeBlob(Addr addr, const void *p, int size) const
Same as tryWriteBlob, but insists on success.
Definition: port_proxy.hh:187
VirtDescriptor::byteOrder
ByteOrder byteOrder
The byte order the descriptor is stored in.
Definition: base.hh:277
VirtQueue::descriptors
std::vector< VirtDescriptor > descriptors
Vector of pre-created descriptors indexed by their index into the queue.
Definition: base.hh:565
cp
Definition: cprintf.cc:37
VirtIODeviceBase::configSize
const size_t configSize
Size of the device's configuration space.
Definition: base.hh:867
VirtDescriptor::isIncoming
bool isIncoming() const
Check if this is a read-only descriptor (incoming data).
Definition: base.hh:223
VirtQueue::dump
void dump() const
Dump the contents of a queue.
Definition: base.cc:315
DPRINTF
#define DPRINTF(x,...)
Definition: trace.hh:237
VirtQueue::ALIGN_SIZE
static const Addr ALIGN_SIZE
Definition: base.hh:423
VirtQueue::getAddress
Addr getAddress() const
Get the guest physical address of this queue.
Definition: base.hh:327
VirtDescriptor::queue
VirtQueue * queue
Pointer to virtqueue owning this descriptor.
Definition: base.hh:274
VirtDescriptor::dump
void dump() const
Dump the contents of a descriptor.
Definition: base.cc:106
VirtIODeviceBase::unserialize
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: base.cc:362
ArmISA::d
Bitfield< 9 > d
Definition: miscregs_types.hh:60
VirtQueue::onNotifyDescriptor
virtual void onNotifyDescriptor(VirtDescriptor *desc)
Notify queue of pending incoming descriptor.
Definition: base.hh:407
VirtQueue::getDescriptor
VirtDescriptor * getDescriptor(VirtDescriptor::Index index)
Get a pointer to a specific descriptor in the queue.
Definition: base.hh:345
VirtDescriptor::_index
Index _index
Index in virtqueue.
Definition: base.hh:280
VirtIODeviceBase::readConfigBlob
void readConfigBlob(PacketPtr pkt, Addr cfgOffset, const uint8_t *cfg)
Read configuration data from a device structure.
Definition: base.cc:431
VirtQueue::avail
VirtRing< VirtDescriptor::Index > avail
Ring of available (incoming) descriptors.
Definition: base.hh:555
VirtIODeviceBase::FeatureBits
uint32_t FeatureBits
Definition: base.hh:582
VirtIODeviceBase::QueueID
uint16_t QueueID
Definition: base.hh:581
VirtDescriptor::chainWrite
void chainWrite(size_t offset, const uint8_t *src, size_t size)
Write to a descriptor chain.
Definition: base.cc:192
VirtDescriptor::read
void read(size_t offset, uint8_t *dst, size_t size) const
Read the contents of a descriptor.
Definition: base.cc:145
VirtDescriptor::chainSize
size_t chainSize() const
Retrieve the size of this descriptor chain.
Definition: base.cc:215
VirtQueue::VirtRing::ring
std::vector< T > ring
Elements in ring in host byte order.
Definition: base.hh:540
VirtDescriptor::desc
vring_desc desc
Underlying descriptor.
Definition: base.hh:283
VirtQueue::VirtRing::write
void write()
Definition: base.hh:524
VirtIODeviceBase::VirtIODeviceBase
VirtIODeviceBase(const Params &params, DeviceId id, size_t config_size, FeatureBits features)
Definition: base.cc:336
vring_avail
Definition: virtio_ring.h:73
Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:148
VirtQueue::serialize
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: base.cc:239
Packet::makeResponse
void makeResponse()
Take a request packet and modify it in place to be suitable for returning as a response to that reque...
Definition: packet.hh:1005
VirtQueue::VirtRing::setAddress
void setAddress(Addr addr)
Set the base address of the VirtIO ring buffer.
Definition: base.hh:488
SERIALIZE_SCALAR
#define SERIALIZE_SCALAR(scalar)
Definition: serialize.hh:584
DDUMP
#define DDUMP(x, data, count)
DPRINTF is a debugging trace facility that allows one to selectively enable tracing statements.
Definition: trace.hh:236
ArmISA::e
Bitfield< 9 > e
Definition: miscregs_types.hh:61
VirtIODeviceBase::setGuestFeatures
void setGuestFeatures(FeatureBits features)
Set feature bits accepted by the guest driver.
Definition: base.cc:395
vring_desc::next
uint16_t next
Definition: virtio_ring.h:70
VirtDescriptor::Index
uint16_t Index
Descriptor index in virtqueue.
Definition: base.hh:114
VirtIODummyDevice::VirtIODummyDevice
VirtIODummyDevice(const VirtIODummyDeviceParams &params)
Definition: base.cc:494
vring_desc::flags
uint16_t flags
Definition: virtio_ring.h:68
vring_desc
Definition: virtio_ring.h:62
VirtDescriptor::chainRead
void chainRead(size_t offset, uint8_t *dst, size_t size) const
Read the contents of a descriptor chain.
Definition: base.cc:169
PortProxy
This object is a proxy for a port or other object which implements the functional response protocol,...
Definition: port_proxy.hh:80
VirtDescriptor::updateChain
void updateChain()
Populate this descriptor chain with data from the guest.
Definition: base.cc:94
vring_used_elem
Definition: virtio_ring.h:80
VirtQueue::_size
const uint16_t _size
Queue size in terms of number of descriptors.
Definition: base.hh:445
VirtIODeviceBase::setDeviceStatus
void setDeviceStatus(DeviceStatus status)
Update device status and optionally reset device.
Definition: base.cc:409
Packet
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition: packet.hh:258
ArmISA::len
Bitfield< 18, 16 > len
Definition: miscregs_types.hh:439
VirtQueue::ALIGN_BITS
static const Addr ALIGN_BITS
Page size used by VirtIO. It's hard-coded to 4096 bytes in the spec for historical reasons.
Definition: base.hh:422
VirtDescriptor::isOutgoing
bool isOutgoing() const
Check if this is a write-only descriptor (outgoing data).
Definition: base.hh:225
VirtQueue::VirtRing::header
Header header
Ring buffer header in host byte order.
Definition: base.hh:538
CheckpointOut
std::ostream CheckpointOut
Definition: serialize.hh:64
VirtDescriptor::write
void write(size_t offset, const uint8_t *src, size_t size)
Write to the contents of a descriptor.
Definition: base.cc:157
trace.hh
VirtQueue::consumeDescriptor
VirtDescriptor * consumeDescriptor()
Get an incoming descriptor chain from the queue.
Definition: base.cc:282
gtoh
T gtoh(T value, ByteOrder guest_byte_order)
Definition: byteswap.hh:163
VirtIODeviceBase::serialize
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: base.cc:352
VirtIODeviceBase::~VirtIODeviceBase
virtual ~VirtIODeviceBase()
Definition: base.cc:347
VirtQueue::reset
void reset()
Reset cached state in this queue and in the associated ring buffers.
Definition: base.cc:259
VirtIODeviceBase::_deviceStatus
DeviceStatus _deviceStatus
Status of the device.
Definition: base.hh:885
VirtQueue::_address
Addr _address
Base address of the queue.
Definition: base.hh:447
paramIn
void paramIn(CheckpointIn &cp, const std::string &name, ExtMachInst &machInst)
Definition: types.cc:69
CheckpointIn
Definition: serialize.hh:68
PortProxy::readBlob
void readBlob(Addr addr, void *p, int size) const
Higher level interfaces based on the above.
Definition: port_proxy.hh:177
VirtQueue::VirtRing::reset
void reset()
Reset any state in the ring buffer.
Definition: base.hh:477
VirtDescriptor::~VirtDescriptor
~VirtDescriptor() noexcept
Definition: base.cc:58
csprintf
std::string csprintf(const char *format, const Args &...args)
Definition: cprintf.hh:158
ArmISA::id
Bitfield< 33 > id
Definition: miscregs_types.hh:247
VirtDescriptor::next
VirtDescriptor * next() const
Get the pointer to the next descriptor in a chain.
Definition: base.cc:135
VirtIODeviceBase::writeConfigBlob
void writeConfigBlob(PacketPtr pkt, Addr cfgOffset, uint8_t *cfg)
Write configuration data to a device structure.
Definition: base.cc:443
VirtDescriptor
VirtIO descriptor (chain) wrapper.
Definition: base.hh:110
panic
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:171
ArmISA::offset
Bitfield< 23, 0 > offset
Definition: types.hh:153
VirtIODeviceBase::writeConfig
virtual void writeConfig(PacketPtr pkt, Addr cfgOffset)
Write to the configuration space of a device.
Definition: base.cc:425
VirtIODeviceBase::reset
virtual void reset()
Driver-request device reset.
Definition: base.cc:372
SimObject
Abstract superclass for simulation objects.
Definition: sim_object.hh:141

Generated on Tue Jun 22 2021 15:28:25 for gem5 by doxygen 1.8.17