My Project
Chargement...
Recherche...
Aucune correspondance
virtio-console.c
Aller à la documentation de ce fichier.
1
17
18#include <manux/intel-8259a.h> // pour les interruptions
19#include <manux/pci.h> // Pour aller récupérer l'irq, on doit
20 // pouvoir s'en passer avec une
21 // fonction dans virtio
22#include <manux/memoire.h> // allouerPages
23
24#include <manux/io.h> // outb
25#include <manux/debug.h>
26#include <manux/errno.h>
27#include <manux/string.h>
28
36
42
43static int nbPageAlloueesIci = 0;
44
52#define NB_BUFF_TRAITES 16
53static
54void virtioConsoleTraiterBuffers(VirtioConsole * vc)
55{
56 void *bf [NB_BUFF_TRAITES];
57 int lg[NB_BUFF_TRAITES];
58 int nbLu;
59
60 // Récupération d'une éventuelle entrée
62 &(vc->virtioPeripherique.filesVirtuelles[VIRTIO_CONSOLE_PORT0_IN]),
63 bf, lg, NB_BUFF_TRAITES);
64 //printk("[7] FQ %d\n", nbLu);
65 do {
66 // Récupération des buffers émis et consommés
68 &(vc->virtioPeripherique.filesVirtuelles[VIRTIO_CONSOLE_PORT0_OUT]),
69 bf, lg, NB_BUFF_TRAITES);
70 //printk("[7] OK !\n");
71
72 // WARNING Pas top, est-ce qu'il faut vraiment des désallouer !?
73 for (int n = 0; n < nbLu; n++) {
74 libererPage(bf[n]);
75 nbPageAlloueesIci --;
76 // printk("[7] virtioConsoleTraiterBuffers libere page 0x%x (reste %d)\n", bf[n], nbPageAlloueesIci);
77 }
78 } while (nbLu > 0);
79 /*
80 printk("[7] Apres lecture ...\n");
81 virtioAfficherFile(&(vc->virtioPeripherique.filesVirtuelles[VIRTIO_CONSOLE_PORT0_OUT]));
82 */
85 }
86
90static
91void virtioConsoleGestionInt(void * pr)
92{
93 VirtioConsole * vc = (VirtioConsole *) pr;
94 uint8_t isr;
95
96 vc->nbItRecues++;
97 printk_debug(DBG_KERNEL_VIRTIO, "Interruption %d !!!\n", vc->nbItRecues);
98
99 // Est-ce moi qui suis visé ?
100 inb((uint16_t)(vc->virtioPeripherique.pciEquipement->adresseES + VIRTIO_HIST_ISR), isr);
101 if (isr & 0x1) {
102 printk_debug(DBG_KERNEL_VIRTIO, "C'est pour moi, ...\n");
103
104 // La suite est à déférer dans une partie basse
105 virtioConsoleTraiterBuffers(vc);
106 } else {
108 }
109}
110
111
116static
117int virtioConsoleInitPeripherique(int PCINumeroPeripherique)
118{
119 PCIEquipement * pciEquip = PCIEquipementNumero(PCINumeroPeripherique);
120 void * pointeur; // Pour allouer de la mémoire en
121 // réception
122 VirtioFileVirtuelle * fr; // réception
123 // On va construire un tableau de buffers (et un de leurs
124 // longueurs) pour passer à virtioFournirBuffers
125 void * buffers[1];
126 int longueurs[1];
127
129
130 // On renseigne la structure
132 PCINumeroPeripherique,
135
136 // La suite est à mettre dans virtio (ou à virer ?)
138 virtioConsoleGestionInt,
139 &virtioConsole)){
140 printk(PRINTK_CRITIQUE "Trop de handler sur l'interruption %d\n", pciEquip->interruption);
141 paniqueNoyau("Pas possible");
142 return ENOENT;
143 }
146
147 // On ajoute des buffers sur la file d'entrée
149
150 // Pas de malloc, ... WARNING : faire version avec malloc
151 pointeur = allouerPages(NB_PAGES(fr->taille*(1024)));
152
153 for (int i = 0 ; i < fr->taille ; i++) {
154 buffers[0] = pointeur;
155 longueurs[0] = 1024;
156 pointeur += longueurs[0];
157
160 buffers, longueurs,
161 1,
163 }
164
166
167 return ESUCCES;
168}
169
170#ifdef MANUX_FICHIER
171MethodesFichier virtioConsoleMethodesFichier;
172
176static
177size_t virtioConsoleEcrire(Fichier * f, void * b, size_t l)
178{
179 VirtioConsole * vc = (VirtioConsole *)f->prive;
180
181 void *bf [1];
182 int lg[1];
183 int nb;
184
185 // On essaie d'aller chercher des buffers WARNING :pas sûr de la logique !
186 virtioConsoleTraiterBuffers(vc);
187
188 /*
189 printk("[7] Avant ecriture ...\n");
190 virtioAfficherFile(&(vc->virtioPeripherique.filesVirtuelles[VIRTIO_CONSOLE_PORT0_OUT]));
191 */
192 // WARNING Pas top
193 bf[0] = allouerPage();
194 nbPageAlloueesIci ++;
195 // printk("[7] virtioConsoleTraiterBuffers allouee page 0x%x (donc %d)\n", bf[0], nbPageAlloueesIci);
196
197 memcpy(bf[0], b, l);
198
199 lg[0] = l;
200
202 1,
203 bf, lg, 1, 0);
204
205 // Un peu simpliste, ...
206 if (nb) {
207 return l;
208 }
209
210 return 0;
211
212}
213
217static
218size_t virtioConsoleLire(Fichier * f, void * b, size_t l)
219{
220 (void) f;
221 (void) b;
222 (void) l;
223
225
226 return 0;
227}
228
229static
230int virtioConsoleOuvrir(INoeud * iNoeud, Fichier * f, uint16_t fanions, uint16_t mode)
231{
232 (void) iNoeud;
233 (void) fanions;
234 (void) mode;
235
236 f->prive = &virtioConsole; // WARNING, il peut y en avoir plusieurs
237
238 return ESUCCES;
239}
240
245MethodesFichier virtioConsoleMethodesFichier = {
246 .ouvrir = virtioConsoleOuvrir,
247 .lire = virtioConsoleLire,
248 .ecrire = virtioConsoleEcrire
249};
250#endif // MANUX_FICHIER
251
255int virtioConsoleInitialisation(INoeud * iNoeudVirtioConsole)
256{
257 int PCINumeroPeripherique;
258
260
261 // On va chercher un peripherique virtio net
262 PCINumeroPeripherique = PCIObtenirProchainEquipement(PCI_VENDEUR_VIRTIO,
264 -1);
265 printk_debug(DBG_KERNEL_VIRTIO, "Peripherique PCI %d\n", PCINumeroPeripherique);
266
267 if (PCINumeroPeripherique == -1) {
268 return ENOENT;
269 }
270
271 // Initialisation de l'unique périphérique pour le moment
272 if (virtioConsoleInitPeripherique(PCINumeroPeripherique)== 0) {
273 printk_debug(DBG_KERNEL_VIRTIO, "Console virtio initialisee !\n");
274 }
275
276#ifdef MANUX_FICHIER
278 iNoeudVirtioConsole->typePeripherique.mineur = 0;
279 iNoeudVirtioConsole->prive = NULL;
280 iNoeudVirtioConsole->methodesFichier = &virtioConsoleMethodesFichier;
281#endif
282
284
285 return ESUCCES;
286}
287
288#ifdef MANUX_VIRTIO_AUDIT
292void virtioConsoleAfficher(void)
293{
295
296 printk("Console virtio 0x%x (%d it):\n", vc, vc->nbItRecues);
297 printk(" Etat de sa file :\n");
298}
299
300#endif // MANUX_VIRTIO_AUDIT
#define MANUX_VIRTIO_CONSOLE_MAJEUR
Le numéro majeur des consoles virtio.
Definition virtio.h:22
#define ENOENT
Definition errno.h:12
#define ESUCCES
Definition errno.h:10
typedef void(Handler(void))
void * allouerPages(uint32_t nombre)
Definition memoire.c:284
#define NB_PAGES(n)
Definition memoire.h:22
void * allouerPage(void)
Definition memoire.c:234
void libererPage(void *pageLiberee)
Definition memoire.c:81
#define PRINTK_CRITIQUE
Definition printk.h:28
void printk(char *format,...)
Fonction principale d'affichage dans le noyau.
Definition printk.c:166
#define NULL
Definition stddef.h:10
void * memcpy(void *dest, const void *src, size_t n)
Definition string.c:12
unsigned short uint16_t
Definition types.h:16
unsigned char uint8_t
Definition types.h:12
int i8259aAjouterHandler(int numIRQ, void(*handler)(void *), void *private)
Ajout d'un handler.
void i8259aAutoriserIRQ(uint8_t numIRQ)
Masquage d'une IRQ.
#define inb(port, adresseOctet)
Lecture d'un octet depuis un port.
Definition io.h:19
uint16_t b
#define DBG_KERNEL_VIRTIO
Definition debug.h:31
#define paniqueNoyau(fmt, args...)
Definition debug.h:107
#define printk_debug(lvl, fmt, args...)
Definition debug.h:86
int PCIObtenirProchainEquipement(uint16_t vendeur, uint16_t equipement, int precedent)
: récuperer l'identifiant du prochain équipement PCI
Definition pci.c:206
PCIEquipement * PCIEquipementNumero(int n)
Definition pci.c:226
#define PCI_PERIPHERIQUE_VIRTIO_CONSOLE
Definition virtio.h:40
VirtioFileVirtuelle
Definition virtio.h:133
void virtioFileAutoriserInterruption(VirtioFileVirtuelle *fv)
Definition virtio.c:450
int virtioInitPeripheriquePCI(VirtioPeripherique *vp, int PCINum, uint32_t masque)
Definition virtio.c:173
#define VRING_DESC_F_WRITE
Definition virtio.h:76
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.
Definition virtio.c:304
int virtioFileRecupererBuffers(VirtioFileVirtuelle *fv, void *bu[], int lg[], int nb)
on va récupérer des buffers
Definition virtio.c:387
#define PCI_VENDEUR_VIRTIO
Definition virtio.h:38
#define VIRTIO_HIST_ISR
Definition virtio.h:70
VirtioPeripherique
Definition virtio.h:142
VirtioPeripherique virtioPeripherique
: Qu'est-ce qu'un fichier ouvert du point de vue du noyau ?
Definition fichier.h:46
void * prive
Caractérisation du fichier ouvert.
Definition fichier.h:47
: Un INoeud représente un fichier, d'un point de vue statique Il s'agit donc de la description d'un f...
Definition inoeud.h:27
TypePeripherique typePeripherique
Definition inoeud.h:28
void * prive
Definition inoeud.h:29
MethodesFichier * methodesFichier
Definition inoeud.h:30
: Définition des opérations réalisables sur un fichier
Definition fichier.h:36
int(* ouvrir)(INoeud *iNoeud, Fichier *f, uint16_t fanions, uint16_t mode)
Definition fichier.h:37
: structure permettant d'identifier un équipement PCI
Definition pci.h:14
uint8_t interruption
Definition pci.h:18
uint16_t mineur
Definition inoeud.h:20
uint16_t majeur
Definition inoeud.h:19
#define NB_BUFF_TRAITES
Gestion des buffers utilisés par le périphérique.
int virtioConsoleInitialisation(INoeud *iNoeudVirtioConsole)
Initialisation des périphériques.
VirtioConsole virtioConsole
Variable globale stockant la seule console virtio ! WARNING : pour le moment on crée un unique périph...
struct VirtioConsole_t VirtioConsole
Définition des éléments de base des consoles virtio.
#define VIRTIO_CONSOLE_F_SIZE
#define VIRTIO_CONSOLE_F_MULTIPORT
#define VIRTIO_CONSOLE_PORT0_OUT
#define VIRTIO_CONSOLE_PORT0_IN