L4Re Operating System Framework
Interface and Usage Documentation
Loading...
Searching...
No Matches
L4virtio::Virtqueue Class Reference

Low-level Virtqueue. More...

#include <virtqueue>

+ 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.
 
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)
 Enable this queue.
 
void setup_simple (unsigned num, void *ring)
 Enable this queue.
 
void dump (Desc const *d) const
 Dump descriptors 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 Public Member Functions

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.
 

Protected Member Functions

 Virtqueue ()=default
 Create a disabled virtqueue.
 

Protected Attributes

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.
 

Detailed Description

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 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 293 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 285 of file virtqueue.

References num().

Referenced by L4virtio::Svr::Device_t< DATA >::setup_queue(), setup_simple(), and total_size().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

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

References num().

Referenced by L4virtio::Svr::Device_t< DATA >::setup_queue(), setup_simple(), and total_size().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ disable()

void L4virtio::Virtqueue::disable ( )
inline

Completely disable the queue.

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

Definition at line 230 of file virtqueue.

References _desc.

Referenced by L4virtio::Svr::Block_dev_base< Ds_data >::reset(), and L4virtio::Svr::Device_t< DATA >::setup_queue().

+ Here is the caller graph for this function:

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

References _desc, and L4virtio::Virtqueue::Desc::dump().

+ Here is the call graph for this function:

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

References _avail, and L4virtio::Virtqueue::Avail::idx.

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

References _current_avail.

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

References _avail, L4virtio::Virtqueue::Avail::flags, and L4virtio::Virtqueue::Avail::Flags::no_irq().

Referenced by L4virtio::Svr::Block_dev_base< Ds_data >::finalize_request(), and L4virtio::Svr::Console::Device::notify_queue().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

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

References _used, L4virtio::Virtqueue::Used::flags, and L4virtio::Virtqueue::Used::Flags::no_notify().

+ Here is the call graph for this function:

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

References _used, L4virtio::Virtqueue::Used::flags, and L4virtio::Virtqueue::Used::Flags::no_notify().

+ Here is the call graph for this function:

◆ num()

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

Definition at line 410 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(), L4virtio::Driver::Block_device::process_used_queue(), L4virtio::Driver::Virtio_net_device::rx_pkt(), setup(), setup_simple(), L4virtio::Svr::Request_processor::start(), total_size(), total_size(), and used_size().

+ Here is the caller graph for this function:

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

References _desc, and L4_LIKELY.

Referenced by L4virtio::Svr::Virtqueue::disable_notify(), L4virtio::Svr::Virtqueue::enable_notify(), L4virtio::Svr::Block_dev_base< Ds_data >::finalize_request(), L4virtio::Svr::Block_dev_base< Ds_data >::get_request(), L4virtio::Svr::Console::Virtio_con::handle_control_message(), L4virtio::Svr::Console::Port::queues_ready(), L4virtio::Svr::Console::Port::rx_ready(), L4virtio::Svr::Console::Virtio_con::send_control_message(), and L4virtio::Svr::Console::Port::tx_ready().

+ Here is the caller graph for this function:

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

References _avail, _current_avail, _desc, _idx_mask, _used, L4_EINVAL, and num().

Referenced by L4virtio::Driver::Virtqueue::init_queue(), L4virtio::Svr::Device_t< DATA >::setup_queue(), and setup_simple().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

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

References avail_size(), desc_size(), l4_round_size(), num(), and setup().

Referenced by L4virtio::Driver::Virtqueue::init_queue().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ total_size() [1/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 320 of file virtqueue.

References _desc, _used, num(), and used_size().

+ Here is the call graph for this function:

◆ total_size() [2/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 251 of file virtqueue.

References avail_size(), desc_size(), l4_round_size(), num(), and used_size().

Referenced by L4virtio::Driver::Virtio_net_device::setup_device(), and L4virtio::Driver::Block_device::setup_device().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

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

References num().

Referenced by L4virtio::Svr::Device_t< DATA >::setup_queue(), total_size(), and total_size().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

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