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 }