21#include <manux/string.h>
22#include <manux/i386.h>
23#include <manux/errno.h>
26static int nbFournis =0;
27static int nbAcceptes =0;
28static int nbRendus =0;
30#define min(a, b) (((a)<(b))?(a):(b))
31#define max(a, b) (((a)>(b))?(a):(b))
33#ifdef MANUX_VIRTIO_AUDIT
39 printk(
"[7] File 0x%x (lg %d nxt %d), used_idx= %d, disp_idx=%d free_idx=%d (f=%d/a=%d/r=%d)\n",
42 fv->prochainDescripteur,
43 fv->buffersUtilises->indice,
44 fv->buffersDisponibles->indice,
45 fv->nbDescripteursLibres,
46 nbFournis, nbAcceptes, nbRendus
49 printk(
"[7] Desc [@/l f n] : [%llx %ld %d %d][%llx %ld %d %d][%llx %ld %d %d]\n",
50 fv->tableDescripteurs[0].adresse,
51 fv->tableDescripteurs[0].longueur,
52 fv->tableDescripteurs[0].flags,
53 fv->tableDescripteurs[0].suivant,
55 fv->tableDescripteurs[1].adresse,
56 fv->tableDescripteurs[1].longueur,
57 fv->tableDescripteurs[1].flags,
58 fv->tableDescripteurs[1].suivant,
60 fv->tableDescripteurs[2].adresse,
61 fv->tableDescripteurs[2].longueur,
62 fv->tableDescripteurs[2].flags,
63 fv->tableDescripteurs[2].suivant
65 printk(
"[7] Used fl 0x%x, idx %d (i/l) : [%d/%ld][%d/%ld][%d/%ld]\n",
66 fv->buffersUtilises->flags,
67 fv->buffersUtilises->indice,
68 fv->buffersUtilises->elementsUtilises[0].indiceBuffer,
69 fv->buffersUtilises->elementsUtilises[0].longueur,
70 fv->buffersUtilises->elementsUtilises[1].indiceBuffer,
71 fv->buffersUtilises->elementsUtilises[1].longueur,
72 fv->buffersUtilises->elementsUtilises[2].indiceBuffer,
73 fv->buffersUtilises->elementsUtilises[2].longueur
75 printk(
"[7] Dispo fl 0x%x, idx %d (i) : [%d][%d][%d]\n",
76 fv->buffersDisponibles->flags,
77 fv->buffersDisponibles->indice,
78 fv->buffersDisponibles->indicesDesBuffer[0],
79 fv->buffersDisponibles->indicesDesBuffer[1],
80 fv->buffersDisponibles->indicesDesBuffer[2]
108 fileVirtuelle->taille = tailleFile;
111 fileVirtuelle->nbDescripteursLibres = tailleFile;
129 if (pointeur ==
NULL) {
140 fileVirtuelle->buffersDisponibles =
144 fileVirtuelle->buffersUtilises =
147 fileVirtuelle->prochainDescripteur = 0;
150 fileVirtuelle->dernierIndiceUtilise = 0;
157 fileVirtuelle->tableDescripteurs,
158 fileVirtuelle->buffersDisponibles,
159 fileVirtuelle->buffersUtilises);
188 adresseES = vp->pciEquipement->adresseES;
204 vp->caracteristiques);
215 vp->caracteristiques &= ~masque ;
218 vp->caracteristiques);
247 virtioCreerFileVirtuelle(&(vp->filesVirtuelles[numFile]),
306 void * bu[],
int lg[],
int nb,
312 int prochainDesc = fv->prochainDescripteur;
317 for (n = 0 ; (n < nb) && (fv->nbDescripteursLibres); n++) {
320 vb = &(fv->tableDescripteurs[(prochainDesc + n)%fv->taille]);
329 vb->longueur = lg[n];
335 if ((n < nb -1) && (fv->nbDescripteursLibres > 1)) {
337 vb->suivant = (fv->prochainDescripteur + n + 1)%fv->taille;
344 fv->buffersDisponibles->indicesDesBuffer
345 [(fv->buffersDisponibles->indice+n)%fv->taille] =
350 fv->nbDescripteursLibres--;
361 fv->buffersDisponibles->indice = fv->buffersDisponibles->indice + 1;
364 fv->prochainDescripteur = (fv->prochainDescripteur + n) % fv->taille;
388 void * bu[],
int lg[],
int nb)
397 if (fv->dernierIndiceUtilise == fv->buffersUtilises->indice) {
403 while ((fv->dernierIndiceUtilise != fv->buffersUtilises->indice) && (result < nb)) {
405 indiceBuffer = fv->buffersUtilises->elementsUtilises
406 [fv->dernierIndiceUtilise % fv->taille].indiceBuffer;
407 longueur = fv->buffersUtilises->elementsUtilises
408 [fv->dernierIndiceUtilise % fv->taille].longueur;
411 ad = (
uint32_t)fv->tableDescripteurs[indiceBuffer].adresse;
413 bu[result] = (
void *) ad;
414 lg[result] =
min(longueur, fv->tableDescripteurs[indiceBuffer].longueur);
415 longueur -= lg[result];
421 indiceBuffer = fv->tableDescripteurs[indiceBuffer].suivant;
425 }
while ((result < nb)
433 fv->dernierIndiceUtilise++;
436 fv->nbDescripteursLibres += result;
447 fv->buffersDisponibles->flags = 1;
452 fv->buffersUtilises->flags = 0;
453 fv->buffersDisponibles->flags = 0;
#define MANUX_TAILLE_PAGE
#define barriereMemoire()
void * allouerPages(uint32_t nombre)
void printk(char *format,...)
Fonction principale d'affichage dans le noyau.
void * memset(void *dest, int val, size_t n)
unsigned long long uint64_t
#define outb(port, octet)
Emission d'un octet sur un port.
#define outw(port, mot)
Emission d'un mot sur un port.
#define inw(port, adresseMot)
Lecture d'un mot depuis un port.
#define inb(port, adresseOctet)
Lecture d'un octet depuis un port.
#define inl(port, adresseLong)
Lecture d'un long depuis un port.
#define outl(port, lng)
Emission d'un long sur un port.
#define DBG_KERNEL_VIRTIO
#define printk_debug(lvl, fmt, args...)
PCIEquipement * PCIEquipementNumero(int n)
#define VIRTIO_HIST_CAPA_PILOTE
#define VIRTIO_ACKNOWLEDGE
#define VIRTIO_HIST_FILE_NOTIF
#define VIRTIO_HIST_CAPA_EQUIP
#define VIRTIO_HIST_TAILLE_FILE
#define VIRTIO_HIST_FILE_SEL
#define MANUX_VIRTIO_NB_MAX_FILES
#define VIRTIO_F_RING_EVENT_IDX
#define VIRTIO_HIST_ADDRESS_FILE
#define VRING_DESC_F_NEXT
#define VIRTIO_FEATURES_OK
#define VIRTIO_F_RING_INDIRECT_DESC
int virtioFournirBuffer(VirtioPeripherique *vp, uint16_t id, void *bu, int lg, uint16_t fl)
Fourniture d'un buffer au périphérique.
void virtioFileAutoriserInterruption(VirtioFileVirtuelle *fv)
int virtioInitPeripheriquePCI(VirtioPeripherique *vp, int PCINum, uint32_t masque)
void virtioFileInterdireInterruption(VirtioFileVirtuelle *fv)
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