XenevaOS
Loading...
Searching...
No Matches
Classes | Macros | Typedefs | Functions
virtio.h File Reference
#include <stdint.h>
#include <stddef.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
 

Typedefs

typedef struct _virtio_net_hdr_ virtio_net_hdr_t
 

Functions

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).
 
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.
 
void AuVirtioPCINotifyQueue (struct VirtioPCIDevice *dev, uint16_t qidx)
 AuVirtioPCINotifyQueue – kicks the device for queue qidx.
 
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.
 

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,
 
)    ((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

Typedef Documentation

◆ virtio_net_hdr_t

Function Documentation

◆ 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

feature negotiation

enable RX+TX queue

◆ AuVirtioPCIInit()

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

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()

void AuVirtioPCINotifyQueue ( struct VirtioPCIDevice dev,
uint16_t  qidx 
)
extern

AuVirtioPCINotifyQueue – kicks the device for queue qidx.

AuVirtioPCINotifyQueue – kicks the device for queue qidx.

◆ AuVirtioPCISetupQueue()

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

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 virtio tablet.