www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

idt.c (2326B)


      1 #include <module.h>
      2 #include <types.h>
      3 #include <pc/idt/idt.h>
      4 #include <interfaceUtilisateur/console/console.h>
      5 
      6 MODULE(Idt);
      7 
      8 DEPENDANCE_MODULE(Idt, Gdt);
      9 
     10 extern EnregistreurContexteInterruption tableEnregistreursContexteInterruption[];
     11 extern GestionnaireInterruption tableGestionnairesInterruption[];
     12 
     13 void gestionnaireInterruptionVide() {
     14 }
     15 
     16 void initIdt (void** etat) {
     17 	*etat = etatIdt;
     18 	
     19 	etatIdt->interruptionsDesactivees = 0;
     20 	desactiverInterruptions();
     21 	
     22 	etatIdt->nombreDescripteursInterruption = LONGUEUR(etatIdt->tableDescripteursInterruption);
     23 	etatIdt->registreIDTR.base = etatIdt->tableDescripteursInterruption;
     24 	etatIdt->registreIDTR.limite = sizeof (etatIdt->tableDescripteursInterruption) - 1;
     25 	
     26 	int i;
     27 	for (i = 0; i < etatIdt->nombreDescripteursInterruption; i++)
     28 		etatIdt->tableDescripteursInterruption[i] = (DescripteurInterruption){
     29 			.offset_15_0 = (uint32)(tableEnregistreursContexteInterruption[i]) & 0xffff,
     30 			.selecteurSegment = 1 << 3, /* Segment de code */
     31 			
     32 			._zero_a = 0,
     33 			/* .type = 0,
     34 			._un = 1,
     35 			.taillePorte = 0,
     36 			._zero_b = 0, */
     37 			.type = 14,
     38 			.niveauPrivilegeDescripteur = 0,
     39 			.present = FALSE,
     40 			.offset_31_16 = (((uint32)(tableEnregistreursContexteInterruption[i])) >> 16) & 0xffff
     41 		};
     42 	
     43 	asm volatile ("lidt %0"
     44 		:
     45 		: "m" (etatIdt->registreIDTR)
     46 		: "memory"
     47 		);
     48 	
     49 	activerInterruptions();
     50 }
     51 
     52 void deinitIdt (void** etat) {
     53 	*etat = NULL;
     54 }
     55 
     56 int desactiverInterruptions() {
     57 	asm volatile ("cli");
     58 	etatIdt->interruptionsDesactivees++;
     59 	return 0;
     60 }
     61 
     62 int activerInterruptions() {
     63 	if (etatIdt->interruptionsDesactivees <= 1) {
     64 		etatIdt->interruptionsDesactivees = 0;
     65 		asm volatile ("sti");
     66 	} else {
     67 		etatIdt->interruptionsDesactivees--;
     68 	}
     69 	return 0;
     70 }
     71 
     72 void definirGestionnaireInterruption(int numeroInterruption, GestionnaireInterruption gestionnaire) {
     73 	desactiverInterruptions();
     74 	
     75 	tableGestionnairesInterruption[numeroInterruption] = gestionnaire;
     76 	
     77 	activerInterruptions();
     78 }
     79 
     80 void activerInterruption(int numeroInterruption) {
     81 	desactiverInterruptions();
     82 	etatIdt->tableDescripteursInterruption[numeroInterruption].present = TRUE;
     83 	activerInterruptions();
     84 }
     85 
     86 void desactiverInterruption(int numeroInterruption) {
     87 	desactiverInterruptions();
     88 	etatIdt->tableDescripteursInterruption[numeroInterruption].present = FALSE;
     89 	activerInterruptions();
     90 }