|
My Project
|


Aller au code source de ce fichier.
Macros | |
| #define | MANUX_VIRTIO_NB_MAX_FILES 3 |
| #define | PCI_VENDEUR_VIRTIO 0x1AF4 |
| #define | PCI_PERIPHERIQUE_VIRTIO_NET 0x1000 |
| #define | PCI_PERIPHERIQUE_VIRTIO_CONSOLE 0x1003 |
| #define | VIRTIO_RESET 0x00 |
| #define | VIRTIO_ACKNOWLEDGE 0x01 |
| #define | VIRTIO_DRIVER 0x02 |
| #define | VIRTIO_DRIVER_OK 0x04 |
| #define | VIRTIO_FEATURES_OK 0x08 |
| #define | VIRTIO_F_RING_INDIRECT_DESC 0x10000000 |
| #define | VIRTIO_F_RING_EVENT_IDX 0x20000000 |
| #define | VIRTIO_HIST_CAPA_EQUIP 0x00 |
| #define | VIRTIO_HIST_CAPA_PILOTE 0x04 |
| #define | VIRTIO_HIST_ADDRESS_FILE 0x08 |
| #define | VIRTIO_HIST_TAILLE_FILE 0x0C |
| #define | VIRTIO_HIST_FILE_SEL 0x0E |
| #define | VIRTIO_HIST_FILE_NOTIF 0x10 |
| #define | VIRTIO_HIST_ETAT 0x12 |
| #define | VIRTIO_HIST_ISR 0x13 |
| #define | VRING_DESC_F_NEXT 1 |
| #define | VRING_DESC_F_WRITE 2 |
Fonctions | |
| struct | __attribute__ ((__packed__)) _VirtioDescripteurBuffer |
| int | virtioInitPeripheriquePCI (VirtioPeripherique *vp, int PCINum, uint32_t masque) |
| int | virtioFournirBuffer (VirtioPeripherique *vp, uint16_t id, void *bu, int lg, uint16_t fl) |
| : Fournir un buffer au périphérique. | |
| int | virtioFournirBuffers (VirtioPeripherique *vp, uint16_t id, void *bu[], int lg[], int nb, uint16_t fl) |
| : Fournir un(e chaine de) buffer(s) au périphérique. | |
| int | virtioFileRecupererBuffers (VirtioFileVirtuelle *fv, void *bu[], int lg[], int nb) |
| on va récupérer des buffers | |
| void | virtioFileInterdireInterruption (VirtioFileVirtuelle *fv) |
| void | virtioFileAutoriserInterruption (VirtioFileVirtuelle *fv) |
Variables | |
| VirtioDescripteurBuffer | |
| VirtioBufferDisponible | |
| VirtioElementUtilise | |
| VirtioBufferUtilise | |
| VirtioFileVirtuelle | |
| VirtioPeripherique | |
WARNING : les fonctions fournirBuffers et recupererBuffers sont à revoir. A priori en l'état, elles devraient fonctionner vu l'usage que j'en fais. Mais je ne cherche pas à savoir quels descripteurs de buffers sont libres, juste combien sont libres, et je les utilise en round robin. On peut espérer qu'ils soient consommés et rendu dans l'ordre dans lequel ils sont fournis, donc ça passe. Mais il serait plus prudent de mettre en place une liste des descripteurs libres (en plus c'est super simple).
WARNING : je voudrais mettre toutes les définitions de types dans le .c, mais le soucis c'est qu'elles doivent ensuite être utilisées via des pointeurs (cf le premier champs de virtioReseauPeriph) et comme pour le moment je n'ai pas de malloc, ...
Définition dans le fichier virtio.h.
| #define MANUX_VIRTIO_NB_MAX_FILES 3 |
| #define PCI_VENDEUR_VIRTIO 0x1AF4 |
| #define VIRTIO_F_RING_INDIRECT_DESC 0x10000000 |
| #define VIRTIO_HIST_CAPA_EQUIP 0x00 |
| #define VRING_DESC_F_NEXT 1 |
| struct __attribute__ | ( | (__packed__) | ) |
Description d'un buffer (voir par exemple struct vring_desc dans [1] Section 2.4.4 ou dans [3] annexe A)
Description d'un buffer "disponible" ([3] Section 2.3.4)
Description des éléments utilisés
Description d'un buffer "utilisé"
Description d'une file virtuelle. Le format de cette structure n'est pas imposé par virtio, car elle est utilisée uniquement dans ce pilote.
Description d'un périphérique virtio
| void virtioFileAutoriserInterruption | ( | VirtioFileVirtuelle * | fv | ) |
| void virtioFileInterdireInterruption | ( | VirtioFileVirtuelle * | fv | ) |
| int virtioFileRecupererBuffers | ( | VirtioFileVirtuelle * | fv, |
| void * | bu[], | ||
| int | lg[], | ||
| int | nb | ||
| ) |
on va récupérer des buffers
En travaux !!
Voir [3] section 2.4.2 "Receiving Used Buffers From The Device"
On fait au plus simple : on renvoie un ensembles de buffers. Attention, on revnoie des pointeurs vers les buffers virtio, pas de nouveaux pointeurs alloués. L'appelant doit donc immédiatement en recopier le contenu.
| int virtioFournirBuffer | ( | VirtioPeripherique * | vp, |
| uint16_t | id, | ||
| void * | bu, | ||
| int | lg, | ||
| uint16_t | fl | ||
| ) |
: Fournir un buffer au périphérique.
| vp | le périphérique virtio concerné |
| id | index de la file |
| bu | le buffer (pointeur sur les données/la place) |
| lg | la taille du buffer |
| fl | lecture/écriture (VRING_DESC_F_WRITE ou 0) |
C'est effectivement le pointeur bu qui est fourni, donc l'appelant ne doit pas le libérer !
: Fournir un buffer au périphérique.
| vp | le périphérique concerné |
| id | numéro de la file sur le périphérique |
| bu | le buffer (pointeur sur les données/la place) |
| lg | la taille du buffer |
| fl | lecture/écriture (VRING_DESC_F_WRITE ou 0) |
| int virtioFournirBuffers | ( | VirtioPeripherique * | vp, |
| uint16_t | id, | ||
| void * | bu[], | ||
| int | lg[], | ||
| int | nb, | ||
| uint16_t | fl | ||
| ) |
: Fournir un(e chaine de) buffer(s) au périphérique.
| fv | la file sur laquelle placer ce(s) buffer(s) |
| id | index de la file |
| bu | les buffers (tableau de pointeurs sur les données/la place) |
| lg | la taille des buffers |
| nb | le nombre de buffers |
| fl | lecture/écriture (VRING_DESC_F_WRITE ou 0) |
C'est effectivement les pointeurs passés dans bu qui sont fournis, donc l'appelant ne doit pas les libérer ! S'il y a plusieurs buffers (nb > 1) c'est sous forme d'une chaîne qu'ils sont fournis
: Fournir un(e chaine de) buffer(s) au périphérique.
| vp | le périphérique virtio concerné |
| id | index de la file |
| bu | les buffers (tableau de pointeurs sur les données/la place) |
| lg | la taille des buffers |
| nb | le nombre de buffers |
| fl | lecture/écriture (VRING_DESC_F_WRITE ou 0) |
L'idée est de fournir une chaîne de buffers . WARNING pas d'erreur gérée !
| int virtioInitPeripheriquePCI | ( | VirtioPeripherique * | vp, |
| int | PCINum, | ||
| uint32_t | masque | ||
| ) |
Initialisation d'un périphérique de type virtio accédé en PCI. L'essentiel de ce qui suit est conforme à la v0.9.5 a priori, pas à la v1.0
| vp | pointeur sur une structure déjà allouée (ou statique) |
| PCINum | l'identifiant PCI |
| masque | les caractéristiques à ne pas utiliser |
Initialisation d'un périphérique de type virtio accédé en PCI. L'essentiel de ce qui suit est conforme à la v0.9.5 a priori, (voir [3] section 2.2.1), mais pas à la v1.0
| vp | pointeur sur une structure déjà allouée (ou statique) |
| PCINum | l'identifiant PCI |
| masque | les caractéristiques à ne pas utiliser |