XenevaOS
Loading...
Searching...
No Matches
Classes | Macros | Functions | Variables
virtio.h File Reference
#include <stdint.h>
#include <stddef.h>
#include <aurora.h>
Include dependency graph for virtio.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  VirtioCommonCfg
 
struct  VirtioDeviceConfig
 
struct  VirtioBuffer
 
struct  VirtioAvail
 
struct  VirtioRing
 
struct  VirtioUsed
 
struct  VirtioQueue
 
struct  VirtioInputEvent
 
struct  _virtio_net_hdr_
 
struct  virtio_pci_cap
 
struct  virtio_notifier_cap
 
struct  VirtqDesc
 
struct  VirtqAvailHdr
 
struct  VirtqUsedElem
 
struct  VirtqUsedHdr
 
struct  VirtioPCIDevice
 a mapped, reset-and-negotiated modern virtio-pci device. Per-device drivers build their own virtqueues and config parsing on top of this. More...
 

Macros

#define OFFSETOF(s, m)   ((size_t)&(((s*)0)->m))
 
#define VIRTIO_NET_F_CSUM   (1ULL << 0)
 
#define VIRTIO_NET_F_GUEST_CSUM   (1ULL << 2)
 
#define VIRTIO_NET_F_MAC   (1ULL << 5)
 
#define VIRTIO_NET_F_CTRL_VQ   (1ULL << 17)
 
#define VIRTIO_NET_HDR_GSO_NONE   0
 
#define VIRTIO_PCI_CAP_VENDOR_ID   0x09 /* PCI capability ID for "vendor specific" */
 
#define VIRTIO_PCI_CAP_COMMON_CFG   1
 
#define VIRTIO_PCI_CAP_NOTIFY_CFG   2
 
#define VIRTIO_PCI_CAP_ISR_CFG   3
 
#define VIRTIO_PCI_CAP_DEVICE_CFG   4
 
#define VIRTIO_PCI_CAP_PCI_CFG   5
 
#define VIRTIO_STATUS_ACKNOWLEDGE   0x01
 
#define VIRTIO_STATUS_DRIVER   0x02
 
#define VIRTIO_STATUS_DRIVER_OK   0x04
 
#define VIRTIO_STATUS_FEATURES_OK   0x08
 
#define VIRTIO_STATUS_DEVICE_NEEDS_RESET   0x40
 
#define VIRTIO_STATUS_FAILED   0x80
 
#define VIRTIO_F_VERSION_1_BIT   32
 
#define VIRTQ_DESC_F_NEXT   1
 
#define VIRTQ_DESC_F_WRITE   2
 
#define VIRTIO_MSI_NO_VECTOR   0xFFFF
 

Functions

struct _virtio_net_hdr_ __attribute__ ((packed)) virtio_net_hdr_t
 
AU_EXTERN AU_EXPORT bool AuVirtioPCIInit (uint64_t address, int bus, int dev, int func, uint32_t wantedFeaturesLow, struct VirtioPCIDevice *out)
 AuVirtioPCIInit – walks the PCI capability list of a modern virtio-pci device, maps its common/notify/isr/device config BARs, resets it and negotiates VIRTIO_F_VERSION_1 plus wantedFeaturesLow (bits 0-31).
 
AU_EXTERN AU_EXPORT uint16_t AuVirtioPCISetupQueue (struct VirtioPCIDevice *dev, uint16_t qidx, struct VirtqDesc **outDesc, struct VirtqAvailHdr **outAvail, struct VirtqUsedHdr **outUsed, uint16_t msixVector)
 AuVirtioPCISetupQueue – selects queue qidx, allocates desc/avail/used rings sized to the device-reported queue size and enables the queue.
 
AU_EXTERN AU_EXPORT void AuVirtioPCINotifyQueue (struct VirtioPCIDevice *dev, uint16_t qidx)
 AuVirtioPCINotifyQueue – kicks the device for queue qidx.
 
AU_EXTERN AU_EXPORT void AuVirtioPCIPostAvail (struct VirtqDesc *desc, struct VirtqAvailHdr *avail, uint16_t qsize, uint64_t bufPhys, uint32_t bufSize, uint16_t nbuf, uint16_t flags)
 
void AuVirtioBlkInitialize (uint64_t device, int bus, int dev, int func)
 AuVirtioBlkInitialize – initialize the virtio block device.
 
void AuVirtioKbdInitialize (uint64_t device, int bus, int dev, int func)
 AuVirtioKbdInitialize – initialize the virtio keyboard.
 
void AuVirtioTabletInitialize (uint64_t device, int bus, int dev, int func)
 AuVirtioTabletInitialize – initialize virtio tablet.
 
void AuVirtioKbdDown ()
 
void AuVirtioTabletDown ()
 
void AuVirtioNetInitialize (uint64_t device)
 AuVirtioNetInitialize – initialize the virtio network device.
 

Variables

typedef __attribute__
 
uint8_t flags
 
uint8_t gso_type
 
uint16_t hdr_len
 
uint16_t gso_size
 
uint16_t csum_start
 
uint16_t csum_offset
 
uint16_t num_buffers
 

Detailed Description

BSD 2-Clause License

Copyright (c) 2022-2025, Manas Kamal Choudhury All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Macro Definition Documentation

◆ OFFSETOF

#define OFFSETOF (   s,
  m 
)    ((size_t)&(((s*)0)->m))

◆ VIRTIO_F_VERSION_1_BIT

#define VIRTIO_F_VERSION_1_BIT   32

◆ VIRTIO_MSI_NO_VECTOR

#define VIRTIO_MSI_NO_VECTOR   0xFFFF

◆ VIRTIO_NET_F_CSUM

#define VIRTIO_NET_F_CSUM   (1ULL << 0)

◆ VIRTIO_NET_F_CTRL_VQ

#define VIRTIO_NET_F_CTRL_VQ   (1ULL << 17)

◆ VIRTIO_NET_F_GUEST_CSUM

#define VIRTIO_NET_F_GUEST_CSUM   (1ULL << 2)

◆ VIRTIO_NET_F_MAC

#define VIRTIO_NET_F_MAC   (1ULL << 5)

◆ VIRTIO_NET_HDR_GSO_NONE

#define VIRTIO_NET_HDR_GSO_NONE   0

◆ VIRTIO_PCI_CAP_COMMON_CFG

#define VIRTIO_PCI_CAP_COMMON_CFG   1

◆ VIRTIO_PCI_CAP_DEVICE_CFG

#define VIRTIO_PCI_CAP_DEVICE_CFG   4

◆ VIRTIO_PCI_CAP_ISR_CFG

#define VIRTIO_PCI_CAP_ISR_CFG   3

◆ VIRTIO_PCI_CAP_NOTIFY_CFG

#define VIRTIO_PCI_CAP_NOTIFY_CFG   2

◆ VIRTIO_PCI_CAP_PCI_CFG

#define VIRTIO_PCI_CAP_PCI_CFG   5

◆ VIRTIO_PCI_CAP_VENDOR_ID

#define VIRTIO_PCI_CAP_VENDOR_ID   0x09 /* PCI capability ID for "vendor specific" */

◆ VIRTIO_STATUS_ACKNOWLEDGE

#define VIRTIO_STATUS_ACKNOWLEDGE   0x01

◆ VIRTIO_STATUS_DEVICE_NEEDS_RESET

#define VIRTIO_STATUS_DEVICE_NEEDS_RESET   0x40

◆ VIRTIO_STATUS_DRIVER

#define VIRTIO_STATUS_DRIVER   0x02

◆ VIRTIO_STATUS_DRIVER_OK

#define VIRTIO_STATUS_DRIVER_OK   0x04

◆ VIRTIO_STATUS_FAILED

#define VIRTIO_STATUS_FAILED   0x80

◆ VIRTIO_STATUS_FEATURES_OK

#define VIRTIO_STATUS_FEATURES_OK   0x08

◆ VIRTQ_DESC_F_NEXT

#define VIRTQ_DESC_F_NEXT   1

◆ VIRTQ_DESC_F_WRITE

#define VIRTQ_DESC_F_WRITE   2

Function Documentation

◆ __attribute__()

struct _virtio_net_hdr_ __attribute__ ( (packed)  )

BSD 2-Clause License

Copyright (c) 2022-2025, Manas Kamal Choudhury All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

◆ AuVirtioBlkInitialize()

void AuVirtioBlkInitialize ( uint64_t  device,
int  bus,
int  dev,
int  func 
)
extern

AuVirtioBlkInitialize – initialize the virtio block device.

Parameters
device– pcie config space address
bus,dev,func– pcie location of the device

◆ AuVirtioKbdDown()

void AuVirtioKbdDown ( )
extern

◆ AuVirtioKbdInitialize()

void AuVirtioKbdInitialize ( uint64_t  device,
int  bus,
int  dev,
int  func 
)
extern

AuVirtioKbdInitialize – initialize the virtio keyboard.

◆ AuVirtioNetInitialize()

void AuVirtioNetInitialize ( uint64_t  device)
extern

AuVirtioNetInitialize – initialize the virtio network device.

Parameters
device– virtio network device address
device– device address passed by PCIe

feature negotiation

enable RX+TX queue

◆ AuVirtioPCIInit()

AU_EXTERN AU_EXPORT bool AuVirtioPCIInit ( uint64_t  address,
int  bus,
int  dev,
int  func,
uint32_t  wantedFeaturesLow,
struct VirtioPCIDevice *  out 
)

AuVirtioPCIInit – walks the PCI capability list of a modern virtio-pci device, maps its common/notify/isr/device config BARs, resets it and negotiates VIRTIO_F_VERSION_1 plus wantedFeaturesLow (bits 0-31).

Returns
false (device left reset) if the capability walk or the ACKNOWLEDGE->DRIVER->FEATURES_OK handshake fails

AuVirtioPCIInit – walks the PCI capability list of a modern virtio-pci device, maps its common/notify/isr/device config BARs, resets it and negotiates VIRTIO_F_VERSION_1 plus wantedFeaturesLow (bits 0-31).

◆ AuVirtioPCINotifyQueue()

AU_EXTERN AU_EXPORT void AuVirtioPCINotifyQueue ( struct VirtioPCIDevice *  dev,
uint16_t  qidx 
)

AuVirtioPCINotifyQueue – kicks the device for queue qidx.

AuVirtioPCINotifyQueue – kicks the device for queue qidx.

◆ AuVirtioPCIPostAvail()

AU_EXTERN AU_EXPORT void AuVirtioPCIPostAvail ( struct VirtqDesc *  desc,
struct VirtqAvailHdr *  avail,
uint16_t  qsize,
uint64_t  bufPhys,
uint32_t  bufSize,
uint16_t  nbuf,
uint16_t  flags 
)

◆ AuVirtioPCISetupQueue()

AU_EXTERN AU_EXPORT uint16_t AuVirtioPCISetupQueue ( struct VirtioPCIDevice *  dev,
uint16_t  qidx,
struct VirtqDesc **  outDesc,
struct VirtqAvailHdr **  outAvail,
struct VirtqUsedHdr **  outUsed,
uint16_t  msixVector 
)

AuVirtioPCISetupQueue – selects queue qidx, allocates desc/avail/used rings sized to the device-reported queue size and enables the queue.

Parameters
msixVector– MSI-X table index to bind the queue to, or VIRTIO_MSI_NO_VECTOR for polling (no queue interrupt)
Returns
the negotiated queue size, or 0 on allocation/mapping failure or when the device reports size 0/unavailable

AuVirtioPCISetupQueue – selects queue qidx, allocates desc/avail/used rings sized to the device-reported queue size and enables the queue.

◆ AuVirtioTabletDown()

void AuVirtioTabletDown ( )
extern

◆ AuVirtioTabletInitialize()

void AuVirtioTabletInitialize ( uint64_t  device,
int  bus,
int  dev,
int  func 
)
extern

AuVirtioTabletInitialize – initialize virtio tablet.

AuVirtioTabletInitialize – initialize the virtio tablet.

AuVirtioTabletInitialize – initialize virtio tablet.

Variable Documentation

◆ __attribute__

static int __attribute__
inline

is_power_of_2() - check if a value is a power of two
: the value to check

Determine whether some value is a power of two, where zero is not considered a power of two. Return: true if
is a power of 2, otherwise false.

__roundup_pow_of_two() - round up to nearest power of two
: value to round up

__rounddown_pow_of_two() - round down to nearest power of two
: value to round down

max_pow_of_two_factor - return highest power-of-2 factor
: parameter

find highest power-of-2 which is evenly divisible into n. 0 is returned for n == 0 or 1.

◆ csum_offset

uint16_t csum_offset

◆ csum_start

uint16_t csum_start

◆ flags

__u32 flags

@flags: One of the supported flags or zero.

◆ gso_size

uint16_t gso_size

◆ gso_type

uint8_t gso_type

◆ hdr_len

uint16_t hdr_len

◆ num_buffers

uint16_t num_buffers