L4Re - L4 Runtime Environment
L4virtio::Virtqueue Class Reference

Low-level Virtqueue. More...

+ Inheritance diagram for L4virtio::Virtqueue:
+ Collaboration diagram for L4virtio::Virtqueue:

Data Structures

class  Avail
 Type of available ring, this is read-only for the host. More...
 
class  Desc
 Descriptor in the descriptor table. More...
 
class  Used
 Used ring. More...
 
struct  Used_elem
 Type of an element of the used ring. More...
 

Public Types

enum  
 Fixed alignment values for different parts of a virtqueue.
 

Public Member Functions

void disable ()
 Completely disable the queue. More...
 
unsigned long total_size () const
 Calculate the total size of this virtqueue. More...
 
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)
 Enable this queue. More...
 
void setup_simple (unsigned num, void *ring)
 Enable this queue. More...
 
void dump (Desc const *d) const
 Dump descriptors for this queue. More...
 
bool ready () const
 Test if this queue is in working state. More...
 
unsigned num () const
 
bool no_notify_guest () const
 Get the no IRQ flag of this queue. More...
 
bool no_notify_host () const
 Get the no notify flag of this queue. More...
 
void no_notify_host (bool value)
 Set the no-notify flag for this queue. More...
 
l4_uint16_t get_avail_idx () const
 Get available index from available ring (for debugging). More...
 
l4_uint16_t get_tail_avail_idx () const
 Get tail-available index stored in local state (for debugging). More...
 

Static Public Member Functions

static unsigned long total_size (unsigned num)
 Calculate the total size for a virtqueue of the given dimensions. More...
 
static unsigned long desc_size (unsigned num)
 Calculate the size of the descriptor table for num entries. More...
 
static unsigned long desc_align ()
 Get the alignment in zero LSBs needed for the descriptor table. More...
 
static unsigned long avail_size (unsigned num)
 Calculate the size of the available ring for num entries. More...
 
static unsigned long avail_align ()
 Get the alignment in zero LSBs needed for the available ring. More...
 
static unsigned long used_size (unsigned num)
 Calculate the size of the used ring for num entries. More...
 
static unsigned long used_align ()
 Get the alignment in zero LSBs needed for the used ring. More...
 

Protected Member Functions

 Virtqueue ()
 Create a disabled virtqueue.
 

Protected Attributes

Desc_desc
 pointer to descriptor table, NULL if queue is off.
 
Avail_avail
 pointer to available ring.
 
Used_used
 pointer to used ring.
 
l4_uint16_t _current_avail
 The life counter for the queue.
 
l4_uint16_t _idx_mask
 mask used for indexing into the descriptor table and the rings.
 

Detailed Description

Low-level Virtqueue.

This class represents a single virtqueue, with a local running available index.

Definition at line 87 of file virtqueue.

Member Function Documentation

◆ avail_align()

static 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 291 of file virtqueue.

◆ avail_size()

static unsigned long L4virtio::Virtqueue::avail_size ( unsigned  num)
inlinestatic

Calculate the size of the available ring for num entries.

Parameters
numThe number of entries in the available ring.
Returns
The size in bytes needed for an available ring with num entries.

Definition at line 283 of file virtqueue.

◆ desc_align()

static 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 273 of file virtqueue.

◆ desc_size()

static unsigned long L4virtio::Virtqueue::desc_size ( unsigned  num)
inlinestatic

Calculate the size of the descriptor table for num entries.

Parameters
numThe number of entries in the descriptor table.
Returns
The size in bytes needed for a descriptor table with num entries.

Definition at line 265 of file virtqueue.

◆ disable()

void L4virtio::Virtqueue::disable ( )
inline

Completely disable the queue.

setup() must be used to enable the queue again.

Definition at line 228 of file virtqueue.

◆ dump()

void L4virtio::Virtqueue::dump ( Desc const *  d) const
inline

Dump descriptors for this queue.

Precondition
the queue must be in working state.

Definition at line 395 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 452 of file virtqueue.

◆ 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 459 of file virtqueue.

◆ no_notify_guest()

bool L4virtio::Virtqueue::no_notify_guest ( ) const
inline

Get the no IRQ flag of this queue.

Precondition
queue must be in working state.
Returns
true if the guest does not want to get IRQs (currently).

Definition at line 417 of file virtqueue.

◆ 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 429 of file virtqueue.

◆ 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 439 of file virtqueue.

◆ num()

unsigned L4virtio::Virtqueue::num ( ) const
inline
Returns
The number of entries in the ring.

Definition at line 407 of file virtqueue.

◆ ready()

bool L4virtio::Virtqueue::ready ( ) const
inline

Test if this queue is in working state.

Returns
true when the queue is in working state, false else.

Definition at line 403 of file virtqueue.

◆ setup()

void L4virtio::Virtqueue::setup ( unsigned  num,
void *  desc,
void *  avail,
void *  used 
)
inline

Enable this queue.

Parameters
numThe number of entries in the descriptor table, the available ring, and the used ring (must be a power of 2).
descThe address of the descriptor table. (Must be Desc_align aligned and at least desc_size(num) bytes in size.)
availThe address of the available ring. (Must be Avail_align aligned and at least avail_size(num) bytes in size.)
usedThe address of the used ring. (Must be Used_align aligned and at least used_size(num) bytes in size.)

Due to the data type of the descriptors, the queue can have a maximum size of 2^16.

Definition at line 353 of file virtqueue.

◆ setup_simple()

void L4virtio::Virtqueue::setup_simple ( unsigned  num,
void *  ring 
)
inline

Enable this queue.

Parameters
numThe number of entries in the descriptor table, the available ring, and the used ring (must be a power of 2).
ringThe 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.

Due to the data type of the descriptors, the queue can have a maximum size of 2^16.

Definition at line 382 of file virtqueue.

◆ total_size() [1/2]

static unsigned long L4virtio::Virtqueue::total_size ( unsigned  num)
inlinestatic

Calculate the total size for a virtqueue of the given dimensions.

Parameters
numThe 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 249 of file virtqueue.

◆ total_size() [2/2]

unsigned long L4virtio::Virtqueue::total_size ( ) const
inline

Calculate the total size of this virtqueue.

Precondition
The queue has been set up.

Definition at line 318 of file virtqueue.

◆ used_align()

static 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 310 of file virtqueue.

◆ used_size()

static unsigned long L4virtio::Virtqueue::used_size ( unsigned  num)
inlinestatic

Calculate the size of the used ring for num entries.

Parameters
numThe number of entries in the used ring.
Returns
The size in bytes needed for an used ring with num entries.

Definition at line 302 of file virtqueue.


The documentation for this class was generated from the following file: