Low-level Virtqueue.
More...
#include <virtqueue>
|
| enum | |
| | Fixed alignment values for different parts of a virtqueue.
|
|
| void | disable () |
| | Completely disable the queue.
|
| unsigned long | total_size () const |
| | Calculate the total size of this virtqueue.
|
|
unsigned long | avail_offset () const |
| | Get the offset of the available ring from the descriptor table.
|
|
unsigned long | used_offset () const |
| | Get the offset of the used ring from the descriptor table.
|
| void | setup (unsigned num, void *desc, void *avail, void *used, L4Re::Util::Dbg msg_dev=L4Re::Util::Dbg{2}) |
| | Enable this queue.
|
| void | setup_simple (unsigned num, void *ring, L4Re::Util::Dbg msg_dev=L4Re::Util::Dbg{2}) |
| | Enable this queue.
|
| void | dump (Desc const *d, L4Re::Util::Dbg dbg=L4Re::Util::Dbg{}) const |
| | Dump a descriptor for this queue.
|
| bool | ready () const |
| | Test if this queue is in working state.
|
| unsigned | num () const |
| bool | no_notify_guest () const |
| | Get the no IRQ flag of this queue.
|
| bool | no_notify_host () const |
| | Get the no notify flag of this queue.
|
| void | no_notify_host (bool value) |
| | Set the no-notify flag for this queue.
|
| l4_uint16_t | get_avail_idx () const |
| | Get available index from available ring (for debugging).
|
| l4_uint16_t | get_tail_avail_idx () const |
| | Get tail-available index stored in local state (for debugging).
|
|
| static unsigned long | total_size (unsigned num) |
| | Calculate the total size for a virtqueue of the given dimensions.
|
| static unsigned long | desc_size (unsigned num) |
| | Calculate the size of the descriptor table for num entries.
|
| static unsigned long | desc_align () |
| | Get the alignment in zero LSBs needed for the descriptor table.
|
| static unsigned long | avail_size (unsigned num) |
| | Calculate the size of the available ring for num entries.
|
| static unsigned long | avail_align () |
| | Get the alignment in zero LSBs needed for the available ring.
|
| static unsigned long | used_size (unsigned num) |
| | Calculate the size of the used ring for num entries.
|
| static unsigned long | used_align () |
| | Get the alignment in zero LSBs needed for the used ring.
|
|
|
| Virtqueue ()=default |
| | Create a disabled virtqueue.
|
|
|
Desc * | _desc = nullptr |
| | pointer to descriptor table, NULL if queue is off.
|
|
Avail * | _avail = nullptr |
| | pointer to available ring.
|
|
Used * | _used = nullptr |
| | pointer to used ring.
|
|
l4_uint16_t | _current_avail = 0 |
| | The life counter for the queue.
|
|
l4_uint16_t | _idx_mask = 0 |
| | mask used for indexing into the descriptor table and the rings.
|
Low-level Virtqueue.
This class represents a single virtqueue, with a local running available index.
- Note
- The Virtqueue implementation is not thread-safe.
Definition at line 86 of file virtqueue.
◆ avail_align()
| unsigned long L4virtio::Virtqueue::avail_align |
( |
| ) |
|
|
inlinestatic |
Get the alignment in zero LSBs needed for the available ring.
- Returns
- The alignment in zero LSBs needed for an available ring.
Definition at line 295 of file virtqueue.
◆ avail_size()
| unsigned long L4virtio::Virtqueue::avail_size |
( |
unsigned | num | ) |
|
|
inlinestatic |
◆ desc_align()
| unsigned long L4virtio::Virtqueue::desc_align |
( |
| ) |
|
|
inlinestatic |
Get the alignment in zero LSBs needed for the descriptor table.
- Returns
- The alignment in zero LSBs needed for a descriptor table.
Definition at line 277 of file virtqueue.
◆ desc_size()
| unsigned long L4virtio::Virtqueue::desc_size |
( |
unsigned | num | ) |
|
|
inlinestatic |
◆ disable()
| void L4virtio::Virtqueue::disable |
( |
| ) |
|
|
inline |
◆ dump()
| void L4virtio::Virtqueue::dump |
( |
Desc const * | d, |
|
|
L4Re::Util::Dbg | dbg = L4Re::Util::Dbg{} ) const |
|
inline |
Dump a descriptor for this queue.
- Parameters
-
| d | Descriptor pointer. |
| dbg | Debug channel for printing the information. |
- Precondition
- the queue must be in working state.
Definition at line 409 of file virtqueue.
◆ get_avail_idx()
| l4_uint16_t L4virtio::Virtqueue::get_avail_idx |
( |
| ) |
const |
|
inline |
Get available index from available ring (for debugging).
- Precondition
- Queue must be in a working state.
- Returns
- current index in the available ring (shared between device model and device driver).
Definition at line 468 of file virtqueue.
References _avail.
◆ get_tail_avail_idx()
| l4_uint16_t L4virtio::Virtqueue::get_tail_avail_idx |
( |
| ) |
const |
|
inline |
Get tail-available index stored in local state (for debugging).
- Returns
- current tail index for the the available ring.
Definition at line 475 of file virtqueue.
References _current_avail.
◆ no_notify_guest()
| bool L4virtio::Virtqueue::no_notify_guest |
( |
| ) |
const |
|
inline |
◆ no_notify_host() [1/2]
| bool L4virtio::Virtqueue::no_notify_host |
( |
| ) |
const |
|
inline |
Get the no notify flag of this queue.
- Precondition
- queue must be in working state.
- Returns
- true if the host does not want to get IRQs (currently).
Definition at line 444 of file virtqueue.
References _used.
◆ no_notify_host() [2/2]
| void L4virtio::Virtqueue::no_notify_host |
( |
bool | value | ) |
|
|
inline |
Set the no-notify flag for this queue.
- Precondition
- Queue must be in a working state.
Definition at line 455 of file virtqueue.
References _used.
◆ num()
| unsigned L4virtio::Virtqueue::num |
( |
| ) |
const |
|
inline |
- Returns
- The number of entries in the ring.
Definition at line 421 of file virtqueue.
References _idx_mask.
Referenced by avail_size(), desc_size(), L4virtio::Driver::Virtqueue::init_queue(), L4virtio::Driver::Virtqueue::init_queue(), L4virtio::Driver::Virtqueue::initialize_rings(), setup(), setup_simple(), L4virtio::Svr::Request_processor::start(), total_size(), total_size(), and used_size().
◆ ready()
| bool L4virtio::Virtqueue::ready |
( |
| ) |
const |
|
inline |
◆ setup()
| void L4virtio::Virtqueue::setup |
( |
unsigned | num, |
|
|
void * | desc, |
|
|
void * | avail, |
|
|
void * | used, |
|
|
L4Re::Util::Dbg | msg_dev = L4Re::Util::Dbg{2} ) |
|
inline |
Enable this queue.
- Parameters
-
| num | The number of entries in the descriptor table, the available ring, and the used ring (must be a power of 2). |
| desc | The address of the descriptor table. (Must be Desc_align aligned and at least desc_size(num) bytes in size.) |
| avail | The address of the available ring. (Must be Avail_align aligned and at least avail_size(num) bytes in size.) |
| used | The address of the used ring. (Must be Used_align aligned and at least used_size(num) bytes in size.) |
| msg_dev | Debug channel for developer-related information. Verbosity of L4Re::Util::Dbg(2) by default. |
Due to the data type of the descriptors, the queue can have a maximum size of 2^16.
Definition at line 359 of file virtqueue.
References num().
Referenced by L4virtio::Svr::Device_t< No_custom_data >::setup_queue().
◆ setup_simple()
| void L4virtio::Virtqueue::setup_simple |
( |
unsigned | num, |
|
|
void * | ring, |
|
|
L4Re::Util::Dbg | msg_dev = L4Re::Util::Dbg{2} ) |
|
inline |
Enable this queue.
- Parameters
-
| num | The number of entries in the descriptor table, the available ring, and the used ring (must be a power of 2). |
| ring | The base address for the queue data structure. The memory block at ring must be at least total_size(num) bytes in size and have an alignment of Desc_align (desc_align()) bits. |
| msg_dev | Debug channel for developer-related information. Verbosity of L4Re::Util::Dbg(2) by default. |
Due to the data type of the descriptors, the queue can have a maximum size of 2^16.
Definition at line 391 of file virtqueue.
References num().
◆ total_size() [1/2]
| unsigned long L4virtio::Virtqueue::total_size |
( |
| ) |
const |
|
inline |
◆ total_size() [2/2]
| unsigned long L4virtio::Virtqueue::total_size |
( |
unsigned | num | ) |
|
|
inlinestatic |
Calculate the total size for a virtqueue of the given dimensions.
- Parameters
-
| num | The number of entries in the descriptor table, the available ring, and the used ring (must be a power of 2). |
- Returns
- The total size in bytes of the queue data structures.
Definition at line 253 of file virtqueue.
References avail_size(), desc_size(), l4_round_size(), num(), and used_size().
◆ used_align()
| unsigned long L4virtio::Virtqueue::used_align |
( |
| ) |
|
|
inlinestatic |
Get the alignment in zero LSBs needed for the used ring.
- Returns
- The alignment in zero LSBs needed for an used ring.
Definition at line 314 of file virtqueue.
◆ used_size()
| unsigned long L4virtio::Virtqueue::used_size |
( |
unsigned | num | ) |
|
|
inlinestatic |
The documentation for this class was generated from the following file: