quinn-os/virtio.h
2022-06-29 21:47:22 +10:00

129 lines
3.4 KiB
C

#ifndef __VIRTIO_H__
#define __VIRTIO_H__
#include "pci.h"
#define VIRTIO_CSUM 0
#define VIRTIO_GUEST_CSUM 1
#define VIRTIO_CTRL_GUEST_OFFLOADS 2
#define VIRTIO_MAC 5
#define VIRTIO_GUEST_TSO4 7
#define VIRTIO_GUEST_TSO6 8
#define VIRTIO_GUEST_ECN 9
#define VIRTIO_GUEST_UFO 10
#define VIRTIO_HOST_TSO4 11
#define VIRTIO_HOST_TSO6 12
#define VIRTIO_HOST_ECN 13
#define VIRTIO_HOST_UFO 14
#define VIRTIO_MRG_RXBUF 15
#define VIRTIO_STATUS 16
#define VIRTIO_CTRL_VQ 17
#define VIRTIO_CTRL_RX 18
#define VIRTIO_CTRL_VLAN 19
#define VIRTIO_CTRL_RX_EXTRA 20
#define VIRTIO_GUEST_ANNOUNCE 21
#define VIRTIO_MQ 22
#define VIRTIO_CTRL_MAC_ADDR 23
#define VIRTIO_RING_F_INDIRECT_DESC 28
#define VIRTIO_EVENT_IDX 29
#define VIRTIO_ACKNOWLEDGE 1
#define VIRTIO_DRIVER 2
#define VIRTIO_FAILED 128
#define VIRTIO_FEATURES_OK 8
#define VIRTIO_DRIVER_OK 4
#define VIRTIO_DEVICE_NEEDS_RESET 64
#define VIRTIO_DESC_FLAG_NEXT 1
#define VIRTIO_DESC_FLAG_WRITE_ONLY 2
#define VIRTIO_DESC_FLAG_INDIRECT 4
#define VIRTIO_NET_HDR_F_NEEDS_CSUM 1
#define VIRTIO_NET_HDR_GSO_NONE 0
#define VIRTIO_NET_HDR_GSO_TCPV4 1
#define VIRTIO_NET_HDR_GSO_UDP 3
#define VIRTIO_NET_HDR_GSO_TCPV6 4
#define VIRTIO_NET_HDR_GSO_ECN 0x80
#define DISABLE_FEATURE(v, feature) v &= ~(1 << feature)
#define ENABLE_FEATURE(v, feature) v |= (1 << feature)
#define HAS_FEATURE(v, feature) (v & (1 << feature))
struct virtio_net_header {
unsigned char flags;
unsigned char gso_type;
unsigned short header_length;
unsigned short gso_size;
unsigned short checksum_start;
unsigned short checksum_offset;
unsigned short num_buffers;
} __attribute__((packed));
struct virtio_queue_buffer {
unsigned long long address;
unsigned long length;
unsigned short flags;
unsigned short next;
} __attribute__((packed));
struct virtio_available {
unsigned short flags;
unsigned short index;
unsigned short rings[];
} __attribute__((packed));
struct virtio_used_item {
unsigned long index;
unsigned long length;
} __attribute__((packed));
struct virtio_used {
unsigned short flags;
unsigned short index;
struct virtio_used_item rings[];
} __attribute__((packed));
struct virtio_queue {
unsigned long num;
union {
struct virtio_queue_buffer *qbuffers;
unsigned long qbuffers_base;
};
struct virtio_available *available;
struct virtio_used *used;
unsigned short last_used_index;
unsigned short last_available_index;
unsigned char *buffer;
unsigned long chunk_size;
unsigned short next_buffer;
unsigned short queue_size;
unsigned long lock;
};
struct virtio_device_info {
struct pci_device *pci_dev;
void *data;
unsigned short iobase;
unsigned long memoryAddress;
unsigned short irq;
struct virtio_queue queues[16];
unsigned long vbuffer[16];
unsigned long vbuffer_len[16];
};
struct virtio_buffer_info {
unsigned char *ibuffer;
unsigned long long size;
unsigned char flags;
};
extern unsigned char virtio_queue_setup(struct virtio_device_info *dev, unsigned char index);
extern void virtio_enable_interrupts(struct virtio_queue *vq);
extern void virtio_disable_interrupts(struct virtio_queue *vq);
extern struct ether_t *init_virtnet(int count);
extern void virtnet_enable(struct ether_t *ether);
extern void virtnet_disable(struct ether_t *ether);
extern int virtnet_send(struct virtio_device_info *dev, char *packet, int len);
extern void virtio_send_buffer(struct virtio_device_info *dev, unsigned short queue_index, struct virtio_buffer_info *b, unsigned long count);
#endif