|
My Project
|
#include <manux/virtio.h>#include <manux/debug.h>#include <manux/memoire.h>#include <manux/string.h>#include <manux/i386.h>#include <manux/errno.h>#include <manux/io.h>
Aller au code source de ce fichier.
Macros | |
| #define | min(a, b) (((a)<(b))?(a):(b)) |
| #define | max(a, b) (((a)>(b))?(a):(b)) |
Fonctions | |
| int | virtioInitPeripheriquePCI (VirtioPeripherique *vp, int PCINum, uint32_t masque) |
| int | virtioFournirBuffer (VirtioPeripherique *vp, uint16_t id, void *bu, int lg, uint16_t fl) |
| Fourniture d'un buffer au périphérique. | |
| int | virtioFournirBuffers (VirtioPeripherique *vp, uint16_t id, void *bu[], int lg[], int nb, uint16_t fl) |
| Fournir plusieurs buffers 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) |
WARNING : on utilise ici en fait les spécifications v0.9.5, qualifiées de "legacy" dans la v1.0. J'utiliserai autant que possible des macros/variables du genre VIRTIO_HIST... pour faire la différence chaque fois que possible. Attention !! Il y a des petites différences entre la v0.9.5 et la version dite legacy dans la v1 !! Apparemment une typo dans la v1 sur l'ordre des champs de contrôle ...
Sources intéressantes [1] http://docs.oasis-open.org/virtio/virtio/v1.0/csprd01/virtio-v1.0-csprd01.html [2] https://www.redhat.com/en/blog/virtqueues-and-virtio-ring-how-data-travels
[3] http://ozlabs.org/~rusty/virtio-spec/virtio-0.9.5.pdf
Définition dans le fichier virtio.c.
| 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
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 | ||
| ) |
Fourniture d'un buffer au périphérique.
: 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 plusieurs buffers au périphérique.
: 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, (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 |