gem5  v21.0.1.0
base.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014, 2016-2017, 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 #ifndef __DEV_VIRTIO_BASE_HH__
39 #define __DEV_VIRTIO_BASE_HH__
40 
41 #include <cstdint>
42 #include <functional>
43 #include <vector>
44 
45 #include "base/bitunion.hh"
46 #include "base/types.hh"
47 #include "dev/virtio/virtio_ring.h"
48 #include "mem/port_proxy.hh"
49 #include "sim/serialize.hh"
50 #include "sim/sim_object.hh"
51 
52 struct VirtIODeviceBaseParams;
53 struct VirtIODummyDeviceParams;
54 
55 class VirtQueue;
56 
71 template <> inline vring_used_elem
73  v.id = swap_byte(v.id);
74  v.len = swap_byte(v.len);
75  return v;
76 }
77 
78 template <> inline vring_desc
80  v.addr = swap_byte(v.addr);
81  v.len = swap_byte(v.len);
82  v.flags = swap_byte(v.flags);
83  v.next = swap_byte(v.next);
84  return v;
85 }
86 
111 {
112  public:
114  typedef uint16_t Index;
115 
126  VirtDescriptor(PortProxy &memProxy, ByteOrder bo,
128  // WORKAROUND: The noexcept declaration works around a bug where
129  // gcc 4.7 tries to call the wrong constructor when emplacing
130  // something into a vector.
131  VirtDescriptor(VirtDescriptor &&other) noexcept;
132  ~VirtDescriptor() noexcept;
133 
134  VirtDescriptor &operator=(VirtDescriptor &&rhs) noexcept;
135 
137  Index index() const { return _index; }
138 
140  void update();
141 
143  void updateChain();
152  void dump() const;
157  void dumpChain() const;
178  void read(size_t offset, uint8_t *dst, size_t size) const;
193  void write(size_t offset, const uint8_t *src, size_t size);
206  size_t size() const { return desc.len; }
207 
213  bool hasNext() const { return desc.flags & VRING_DESC_F_NEXT; }
220  VirtDescriptor *next() const;
221 
223  bool isIncoming() const { return !isOutgoing(); }
225  bool isOutgoing() const { return desc.flags & VRING_DESC_F_WRITE; }
226 
227 
240  void chainRead(size_t offset, uint8_t *dst, size_t size) const;
253  void chainWrite(size_t offset, const uint8_t *src, size_t size);
262  size_t chainSize() const;
265  private:
266  // Remove default constructor
267  VirtDescriptor();
268  // Prevent copying
269  VirtDescriptor(const VirtDescriptor &other);
270 
275 
277  ByteOrder byteOrder;
278 
281 
284 };
285 
295 class VirtQueue : public Serializable {
296 public:
297  virtual ~VirtQueue() {};
298 
302  void serialize(CheckpointOut &cp) const override;
303  void unserialize(CheckpointIn &cp) override;
304 
314  void reset();
315 
321  void setAddress(Addr address);
327  Addr getAddress() const { return _address; }
328 
334  uint16_t getSize() const { return _size; }
335 
346  return &descriptors[index];
347  }
378  void produceDescriptor(VirtDescriptor *desc, uint32_t len);
396  virtual void onNotify();
407  virtual void onNotifyDescriptor(VirtDescriptor *desc) {};
414  void dump() const;
422  static const Addr ALIGN_BITS = 12;
423  static const Addr ALIGN_SIZE = 1 << ALIGN_BITS;
426  protected:
436  VirtQueue(PortProxy &proxy, ByteOrder bo, uint16_t size);
437 
439  ByteOrder byteOrder;
440 
441  private:
442  VirtQueue();
443 
445  const uint16_t _size;
450 
451  private:
459  template<typename T>
460  class VirtRing
461  {
462  public:
463  typedef uint16_t Flags;
464  typedef uint16_t Index;
465 
466  struct M5_ATTR_PACKED Header {
469  };
470 
471  VirtRing<T>(PortProxy &proxy, ByteOrder bo, uint16_t size) :
472  header{0, 0}, ring(size), _proxy(proxy), _base(0), byteOrder(bo)
473  {}
474 
476  void
478  {
479  header = {0, 0};
480  _base = 0;
481  };
482 
489 
491  void
493  {
494  assert(_base != 0);
495  _proxy.readBlob(_base, &header, sizeof(header));
498  }
499 
500  void
502  {
503  Header out;
504  assert(_base != 0);
505  out.flags = htog(header.flags, byteOrder);
506  out.index = htog(header.index, byteOrder);
507  _proxy.writeBlob(_base, &out, sizeof(out));
508  }
509 
510  void
512  {
513  readHeader();
514 
515  /* Read and byte-swap the elements in the ring */
516  T temp[ring.size()];
517  _proxy.readBlob(_base + sizeof(header),
518  temp, sizeof(T) * ring.size());
519  for (int i = 0; i < ring.size(); ++i)
520  ring[i] = gtoh(temp[i], byteOrder);
521  }
522 
523  void
525  {
526  assert(_base != 0);
527  /* Create a byte-swapped copy of the ring and write it to
528  * guest memory. */
529  T temp[ring.size()];
530  for (int i = 0; i < ring.size(); ++i)
531  temp[i] = htog(ring[i], byteOrder);
532  _proxy.writeBlob(_base + sizeof(header),
533  temp, sizeof(T) * ring.size());
534  writeHeader();
535  }
536 
538  Header header;
541 
542  private:
543  // Remove default constructor
544  VirtRing<T>();
545 
551  ByteOrder byteOrder;
552  };
553 
558 
561  uint16_t _last_avail;
562 
566 };
567 
579 {
580  public:
581  typedef uint16_t QueueID;
582  typedef uint32_t FeatureBits;
588  typedef uint16_t VirtAddress;
590  typedef uint16_t DeviceId;
591 
592  BitUnion8(DeviceStatus)
593  Bitfield<7> failed;
594  Bitfield<2> driver_ok;
595  Bitfield<1> driver;
596  Bitfield<0> acknowledge;
597  EndBitUnion(DeviceStatus)
598 
599  typedef VirtIODeviceBaseParams Params;
600  VirtIODeviceBase(const Params &params, DeviceId id, size_t config_size,
601  FeatureBits features);
602  virtual ~VirtIODeviceBase();
603 
604  public:
608  void serialize(CheckpointOut &cp) const override;
609  void unserialize(CheckpointIn &cp) override;
613  protected:
628  void
630  {
631  assert(transKick);
632  transKick();
633  };
634 
646  void registerQueue(VirtQueue &queue);
647 
648 
662  public:
680  virtual void readConfig(PacketPtr pkt, Addr cfgOffset);
695  virtual void writeConfig(PacketPtr pkt, Addr cfgOffset);
696 
709  virtual void reset();
712  protected:
724  void readConfigBlob(PacketPtr pkt, Addr cfgOffset, const uint8_t *cfg);
725 
733  void writeConfigBlob(PacketPtr pkt, Addr cfgOffset, uint8_t *cfg);
734 
738  ByteOrder byteOrder;
739 
742  public:
752  void
753  registerKickCallback(const std::function<void()> &callback)
754  {
755  assert(!transKick);
756  transKick = callback;
757  }
758 
759 
769  void onNotify(QueueID index);
770 
771 
781  void setQueueSelect(QueueID idx) { _queueSelect = idx; }
791  QueueID getQueueSelect() const { return _queueSelect; }
792 
807  void setQueueAddress(uint32_t address);
821  uint32_t getQueueAddress() const;
822 
829  uint16_t getQueueSize() const { return getCurrentQueue().getSize(); }
830 
839  void setDeviceStatus(DeviceStatus status);
840 
846  DeviceStatus getDeviceStatus() const { return _deviceStatus; }
847 
854  void setGuestFeatures(FeatureBits features);
855 
862 
865 
867  const size_t configSize;
868 
873  private:
875  const VirtQueue &getCurrentQueue() const;
878 
885  DeviceStatus _deviceStatus;
886 
889 
892 
894  std::function<void()> transKick;
895 };
896 
898 {
899  public:
900  VirtIODummyDevice(const VirtIODummyDeviceParams &params);
901 
902  protected:
904  static const DeviceId ID_INVALID = 0x00;
905 };
906 
907 #endif // __DEV_VIRTIO_BASE_HH__
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::EndBitUnion
EndBitUnion(DeviceStatus) typedef VirtIODeviceBaseParams Params
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
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
VirtIODeviceBase::driver_ok
Bitfield< 2 > driver_ok
Definition: base.hh:594
VirtQueue::produceDescriptor
void produceDescriptor(VirtDescriptor *desc, uint32_t len)
Send a descriptor chain to the guest.
Definition: base.cc:301
VirtQueue::VirtRing::byteOrder
ByteOrder byteOrder
Byte order in the ring.
Definition: base.hh:551
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
VirtIODeviceBase::readConfig
virtual void readConfig(PacketPtr pkt, Addr cfgOffset)
Read from the configuration space of a device.
Definition: base.cc:419
VirtIODeviceBase::guestFeatures
FeatureBits guestFeatures
Feature set accepted by the guest.
Definition: base.hh:659
ArmISA::i
Bitfield< 7 > i
Definition: miscregs_types.hh:63
VirtQueue::VirtRing::_proxy
PortProxy & _proxy
Guest physical memory proxy.
Definition: base.hh:547
VirtIODeviceBase::registerQueue
void registerQueue(VirtQueue &queue)
Register a new VirtQueue with the device model.
Definition: base.cc:488
VirtQueue::VirtRing::_base
Addr _base
Guest physical base address of the ring buffer.
Definition: base.hh:549
Flags
Wrapper that groups a few flag bits under the same undelying container.
Definition: flags.hh:41
VirtIODeviceBase::getCurrentQueue
const VirtQueue & getCurrentQueue() const
Convenience method to get the currently selected queue.
Definition: base.cc:456
VirtIODummyDevice::ID_INVALID
static const DeviceId ID_INVALID
VirtIO device ID.
Definition: base.hh:904
Serializable
Basic support for object serialization.
Definition: serialize.hh:175
VirtQueue::unserialize
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: base.cc:246
VirtIODeviceBase::getDeviceStatus
DeviceStatus getDeviceStatus() const
Retrieve the device status.
Definition: base.hh:846
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
VRING_DESC_F_NEXT
#define VRING_DESC_F_NEXT
Definition: virtio_ring.h:37
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
VirtIODeviceBase::getQueueAddress
uint32_t getQueueAddress() const
Get the host physical address of the currently active queue.
Definition: base.cc:480
std::vector
STL vector class.
Definition: stl.hh:37
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
VirtIODeviceBase::getGuestFeatures
FeatureBits getGuestFeatures() const
Get features accepted by the guest driver.
Definition: base.hh:861
VirtQueue::VirtQueue
VirtQueue()
VirtIODeviceBase::deviceFeatures
const FeatureBits deviceFeatures
Feature set offered by the device.
Definition: base.hh:870
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
VirtQueue::VirtRing::Header::flags
Flags flags
Definition: base.hh:467
VirtQueue::getSize
uint16_t getSize() const
Get the number of descriptors available in this queue.
Definition: base.hh:334
VirtIODeviceBase::getQueueSelect
QueueID getQueueSelect() const
Get the currently active queue.
Definition: base.hh:791
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
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::~VirtQueue
virtual ~VirtQueue()
Definition: base.hh:297
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::VirtRing::Header
Definition: base.hh:466
VirtQueue::dump
void dump() const
Dump the contents of a queue.
Definition: base.cc:315
sim_object.hh
VirtQueue::VirtRing::Flags
uint16_t Flags
Definition: base.hh:463
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
VirtQueue::onNotifyDescriptor
virtual void onNotifyDescriptor(VirtDescriptor *desc)
Notify queue of pending incoming descriptor.
Definition: base.hh:407
htog
T htog(T value, ByteOrder guest_byte_order)
Definition: byteswap.hh:156
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
bitunion.hh
port_proxy.hh
VirtQueue::avail
VirtRing< VirtDescriptor::Index > avail
Ring of available (incoming) descriptors.
Definition: base.hh:555
VirtIODeviceBase::VirtAddress
uint16_t VirtAddress
This is a VirtQueue address as exposed through the low-level interface. The address needs to be multi...
Definition: base.hh:588
VirtIODeviceBase::FeatureBits
uint32_t FeatureBits
Definition: base.hh:582
VirtIODeviceBase::QueueID
uint16_t QueueID
Definition: base.hh:581
VirtQueue::byteOrder
ByteOrder byteOrder
Byte order in this queue.
Definition: base.hh:439
swap_byte
vring_used_elem swap_byte(vring_used_elem v)
Definition: base.hh:72
VirtIODummyDevice
Definition: base.hh:897
VirtDescriptor::chainWrite
void chainWrite(size_t offset, const uint8_t *src, size_t size)
Write to a descriptor chain.
Definition: base.cc:192
VirtIODeviceBase::getQueueSize
uint16_t getQueueSize() const
Get the size (descriptors) of the currently active queue.
Definition: base.hh:829
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
Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:148
VirtQueue::VirtRing::Header::index
Index index
Definition: base.hh:468
VirtQueue::serialize
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: base.cc:239
VirtQueue::VirtRing::setAddress
void setAddress(Addr addr)
Set the base address of the VirtIO ring buffer.
Definition: base.hh:488
VirtIODeviceBase::BitUnion8
BitUnion8(DeviceStatus) Bitfield< 7 > failed
VirtIODeviceBase::setGuestFeatures
void setGuestFeatures(FeatureBits features)
Set feature bits accepted by the guest driver.
Definition: base.cc:395
X86ISA::addr
Bitfield< 3 > addr
Definition: types.hh:80
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
VirtIODeviceBase::setQueueSelect
void setQueueSelect(QueueID idx)
Change currently active queue.
Definition: base.hh:781
VirtIODeviceBase::deviceId
const DeviceId deviceId
Device ID (sometimes known as subsystem ID)
Definition: base.hh:864
VirtIODeviceBase::driver
Bitfield< 1 > driver
Definition: base.hh:595
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
types.hh
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
VirtIODeviceBase::acknowledge
Bitfield< 0 > acknowledge
Definition: base.hh:596
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
VRING_DESC_F_WRITE
#define VRING_DESC_F_WRITE
Definition: virtio_ring.h:39
SimObject::params
const Params & params() const
Definition: sim_object.hh:168
VirtIODeviceBase::transKick
std::function< void()> transKick
Callbacks to kick the guest through the transport layer
Definition: base.hh:894
VirtQueue::VirtRing
VirtIO ring buffer wrapper.
Definition: base.hh:460
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
virtio_ring.h
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
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::writeHeader
void writeHeader()
Definition: base.hh:501
VirtIODeviceBase::kick
void kick()
Inform the guest of available buffers.
Definition: base.hh:629
VirtQueue::VirtRing::reset
void reset()
Reset any state in the ring buffer.
Definition: base.hh:477
VirtDescriptor::~VirtDescriptor
~VirtDescriptor() noexcept
Definition: base.cc:58
VirtQueue::memProxy
PortProxy & memProxy
Guest physical memory proxy.
Definition: base.hh:449
ArmISA::v
Bitfield< 28 > v
Definition: miscregs_types.hh:51
VirtIODeviceBase::byteOrder
ByteOrder byteOrder
The byte order of the queues, descriptors, etc.
Definition: base.hh:738
VirtIODeviceBase::registerKickCallback
void registerKickCallback(const std::function< void()> &callback)
Register a callback to kick the guest through the transport interface.
Definition: base.hh:753
VirtDescriptor::next
VirtDescriptor * next() const
Get the pointer to the next descriptor in a chain.
Definition: base.cc:135
VirtQueue::VirtRing::Index
uint16_t Index
Definition: base.hh:464
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
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