XenevaOS
Loading...
Searching...
No Matches
virtio.h
Go to the documentation of this file.
1
32#ifndef __VIRTIO_H__
33#define __VIRTIO_H__
34
35#include <stdint.h>
36#include <stddef.h>
37#if defined(__GNUC__) || defined(__clang__)
38#ifndef __cplusplus
39#include <stdbool.h>
40#endif
41#endif
42
63
65 volatile uint8_t select;
66 volatile uint8_t subsel;
67 volatile uint8_t size;
68 volatile uint8_t pad[5];
69 union {
70 struct {
71 volatile uint32_t min;
72 volatile uint32_t max;
73 volatile uint32_t fuzz;
74 volatile uint32_t flat;
75 volatile uint32_t res;
79};
80
87
94
99
106
112
118
119
120#define OFFSETOF(s,m) ((size_t)&(((s*)0)->m))
121
122#define VIRTIO_NET_F_CSUM (1ULL << 0)
123#define VIRTIO_NET_F_GUEST_CSUM (1ULL << 2)
124#define VIRTIO_NET_F_MAC (1ULL << 5)
125#define VIRTIO_NET_F_CTRL_VQ (1ULL << 17)
126#define VIRTIO_NET_HDR_GSO_NONE 0
127
137
138
149
150
151
156
157/* modern virtio-pci capability types, virtio-v1.1 sec 4.1.4 */
158#define VIRTIO_PCI_CAP_VENDOR_ID 0x09 /* PCI capability ID for "vendor specific" */
159#define VIRTIO_PCI_CAP_COMMON_CFG 1
160#define VIRTIO_PCI_CAP_NOTIFY_CFG 2
161#define VIRTIO_PCI_CAP_ISR_CFG 3
162#define VIRTIO_PCI_CAP_DEVICE_CFG 4
163#define VIRTIO_PCI_CAP_PCI_CFG 5
164
165/* device status register bits, virtio-v1.1 sec 2.1 */
166#define VIRTIO_STATUS_ACKNOWLEDGE 0x01
167#define VIRTIO_STATUS_DRIVER 0x02
168#define VIRTIO_STATUS_DRIVER_OK 0x04
169#define VIRTIO_STATUS_FEATURES_OK 0x08
170#define VIRTIO_STATUS_DEVICE_NEEDS_RESET 0x40
171#define VIRTIO_STATUS_FAILED 0x80
172
173/* bit 32 of the feature bitmap (high half, feature-select 1) --
174 * required on every modern (non-transitional-legacy) negotiation --axiss */
175#define VIRTIO_F_VERSION_1_BIT 32
176
177#define VIRTQ_DESC_F_NEXT 1
178#define VIRTQ_DESC_F_WRITE 2
179#define VIRTIO_MSI_NO_VECTOR 0xFFFF
180
181/* split-ring layout, sized to whatever queue size the device reports --
182 * NOT the fixed 64-entry VirtioQueue above. Modern virtio-pci gives
183 * QueueDesc/QueueAvail/QueueUsed as independent 64-bit addresses, so
184 * these don't need to be contiguous or share a struct --axiss */
185struct VirtqDesc {
186 volatile uint64_t addr;
187 volatile uint32_t len;
188 volatile uint16_t flags;
189 volatile uint16_t next;
190};
191
193 volatile uint16_t flags;
194 volatile uint16_t idx;
195 volatile uint16_t ring[];
196};
197
199 volatile uint32_t id;
200 volatile uint32_t len;
201};
202
204 volatile uint16_t flags;
205 volatile uint16_t idx;
206 volatile struct VirtqUsedElem ring[];
207};
208
222
230extern bool AuVirtioPCIInit(uint64_t address, int bus, int dev, int func,
231 uint32_t wantedFeaturesLow, struct VirtioPCIDevice* out);
232
242 uint16_t qidx,
243 struct VirtqDesc** outDesc,
244 struct VirtqAvailHdr** outAvail,
245 struct VirtqUsedHdr** outUsed,
246 uint16_t msixVector);
247
251extern void AuVirtioPCINotifyQueue(struct VirtioPCIDevice* dev, uint16_t qidx);
252
256extern void AuVirtioBlkInitialize(uint64_t device, int bus, int dev, int func);
257
261extern void AuVirtioKbdInitialize(uint64_t device, int bus, int dev, int func);
262
266extern void AuVirtioTabletInitialize(uint64_t device, int bus, int dev, int func);
267
268extern void AuVirtioKbdDown();
269
270extern void AuVirtioTabletDown();
271
281#endif
AuUSBDeviceStruc * device
Definition main.cpp:148
unsigned int uint32_t
Definition acefiex.h:163
unsigned char uint8_t
Definition acefiex.h:161
COMPILER_DEPENDENT_UINT64 uint64_t
Definition acefiex.h:165
unsigned short int uint16_t
Definition acefiex.h:162
Definition virtio.h:88
uint16_t flags
Definition virtio.h:89
volatile uint16_t index
Definition virtio.h:90
uint16_t int_index
Definition virtio.h:92
uint16_t ring[64]
Definition virtio.h:91
Definition virtio.h:81
uint16_t Flags
Definition virtio.h:84
uint16_t Next
Definition virtio.h:85
uint32_t Length
Definition virtio.h:83
uint64_t Addr
Definition virtio.h:82
Definition virtio.h:43
volatile uint16_t QueueEnable
Definition virtio.h:56
volatile uint8_t ConfigGeneration
Definition virtio.h:51
volatile uint16_t Queues
Definition virtio.h:49
volatile uint64_t QueueAvail
Definition virtio.h:60
volatile uint16_t QueueMSixVector
Definition virtio.h:55
volatile uint64_t QueueUsed
Definition virtio.h:61
volatile uint16_t MSix
Definition virtio.h:48
volatile uint32_t DevFeature
Definition virtio.h:45
volatile uint32_t GuestFeatureSelect
Definition virtio.h:46
volatile uint16_t QueueSelect
Definition virtio.h:53
volatile uint64_t QueueDesc
Definition virtio.h:59
volatile uint16_t QueueSize
Definition virtio.h:54
volatile uint32_t DevFeatureSelect
Definition virtio.h:44
volatile uint8_t DeviceStatus
Definition virtio.h:50
volatile uint32_t GuestFeature
Definition virtio.h:47
volatile uint16_t QueueNotifyOff
Definition virtio.h:57
Definition virtio.h:64
volatile uint32_t fuzz
Definition virtio.h:73
volatile uint8_t select
Definition virtio.h:65
union VirtioDeviceConfig::@11 data
volatile uint32_t res
Definition virtio.h:75
struct VirtioDeviceConfig::@11::@12 tablet_data
volatile uint32_t min
Definition virtio.h:71
volatile uint32_t max
Definition virtio.h:72
volatile uint8_t subsel
Definition virtio.h:66
volatile uint32_t flat
Definition virtio.h:74
volatile uint8_t pad[5]
Definition virtio.h:68
uint8_t str[128]
Definition virtio.h:77
volatile uint8_t size
Definition virtio.h:67
Definition virtio.h:113
uint32_t value
Definition virtio.h:116
uint16_t type
Definition virtio.h:114
uint16_t code
Definition virtio.h:115
a mapped, reset-and-negotiated modern virtio-pci device. Per-device drivers build their own virtqueue...
Definition virtio.h:213
struct VirtioCommonCfg * common
Definition virtio.h:216
volatile uint8_t * isr
Definition virtio.h:217
uint32_t notifyOffMultiplier
Definition virtio.h:220
uint8_t * notifyBase
Definition virtio.h:219
int func
Definition virtio.h:215
int bus
Definition virtio.h:215
void * deviceCfg
Definition virtio.h:218
uint64_t address
Definition virtio.h:214
int dev
Definition virtio.h:215
Definition virtio.h:107
struct VirtioAvail available
Definition virtio.h:109
struct VirtioUsed used
Definition virtio.h:110
struct VirtioBuffer buffers[64]
Definition virtio.h:108
Definition virtio.h:95
uint32_t index
Definition virtio.h:96
uint32_t length
Definition virtio.h:97
Definition virtio.h:100
uint16_t int_index
Definition virtio.h:104
volatile uint16_t index
Definition virtio.h:102
uint16_t flags
Definition virtio.h:101
struct VirtioRing ring[64]
Definition virtio.h:103
Definition virtio.h:192
volatile uint16_t flags
Definition virtio.h:193
volatile uint16_t idx
Definition virtio.h:194
volatile uint16_t ring[]
Definition virtio.h:195
Definition virtio.h:185
volatile uint16_t next
Definition virtio.h:189
volatile uint32_t len
Definition virtio.h:187
volatile uint64_t addr
Definition virtio.h:186
volatile uint16_t flags
Definition virtio.h:188
Definition virtio.h:198
volatile uint32_t len
Definition virtio.h:200
volatile uint32_t id
Definition virtio.h:199
Definition virtio.h:203
volatile uint16_t idx
Definition virtio.h:205
volatile uint16_t flags
Definition virtio.h:204
volatile struct VirtqUsedElem ring[]
Definition virtio.h:206
Definition virtio.h:128
uint8_t gso_type
Definition virtio.h:130
uint16_t hdr_len
Definition virtio.h:131
uint16_t csum_offset
Definition virtio.h:134
uint8_t flags
Definition virtio.h:129
uint16_t csum_start
Definition virtio.h:133
uint16_t gso_size
Definition virtio.h:132
uint16_t padding
Definition virtio.h:135
Definition virtio.h:152
virtio_pci_cap cap
Definition virtio.h:153
uint32_t notifer_mult_base
Definition virtio.h:154
Definition virtio.h:139
uint8_t bar
Definition virtio.h:144
uint32_t offset
Definition virtio.h:146
uint8_t cap_len
Definition virtio.h:142
uint32_t length
Definition virtio.h:147
uint8_t cap_vndr
Definition virtio.h:140
uint8_t cap_next
Definition virtio.h:141
uint8_t cfg_type
Definition virtio.h:143
void AuVirtioKbdDown()
Definition virtiokbd.c:135
void AuVirtioPCINotifyQueue(struct VirtioPCIDevice *dev, uint16_t qidx)
AuVirtioPCINotifyQueue – kicks the device for queue qidx.
Definition virtiopci.c:268
void AuVirtioTabletInitialize(uint64_t device, int bus, int dev, int func)
AuVirtioTabletInitialize – initialize virtio tablet.
Definition virtiotablet.c:150
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...
Definition virtiopci.c:98
struct _virtio_net_hdr_ virtio_net_hdr_t
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-repor...
Definition virtiopci.c:201
void AuVirtioNetInitialize(uint64_t device)
AuVirtioNetInitialize – initialize the virtio network device.
Definition virtionet.cpp:378
void AuVirtioTabletDown()
Definition virtiotablet.c:127
void AuVirtioBlkInitialize(uint64_t device, int bus, int dev, int func)
AuVirtioBlkInitialize – initialize the virtio block device.
Definition virtioblk.c:204
void AuVirtioKbdInitialize(uint64_t device, int bus, int dev, int func)
AuVirtioKbdInitialize – initialize the virtio keyboard.
Definition virtiokbd.c:158