8#include <manux/config.h>
11#if (MANUX_PIC == INTEL_8259A)
17#include <manux/i386.h>
20#include <manux/appelsysteme.h>
23#ifdef MANUX_CONSOLES_VIRTUELLES
27#include <manux/string.h>
28#define MANUX_SELECTEUR_SEGMENT_CODE 0x08
30#ifdef MANUX_APPELS_SYSTEME
31extern void handlerAppelSysteme(
void);
40#define MANUX_NB_SOFT_INT \
41 (MANUX_NB_INTERRUPTIONS - (MANUX_NB_EXCEPTIONS + MANUX_NB_IRQ))
71void gestionExceptionDiv0(TousRegistres registres,
75 printk(
"Caca %d, 0x%x\n", numEx, eip);
102void neRienFaire(TousRegistres registres,
112 printk(
"neRienFaire %d\n", numIt);
125#ifdef MANUX_INT_AUDIT
126 nbItRecues[numIt] ++;
136void positionnerHandlerInterruption(
IDT idt,
int i, Handler handler)
151void chargerIDT(
IDT idt)
157 argument[2] = ( (
uint32_t)idt & 0xFF);
158 argument[3] = (((
uint32_t)idt>>8) & 0xFF);
159 argument[4] = (((
uint32_t)idt>>16) & 0xFF);
160 argument[5] = (((
uint32_t)idt>>24) & 0xFF);
162 __asm__ __volatile__ (
"lidt (%0)"
164 :
"a" ((char *)argument)
264 positionnerHandlerInterruption(idt,
275#ifdef MANUX_APPELS_SYSTEME
277 positionnerHandlerInterruption(idt,
MANUX_AS_INT, handlerAppelSysteme);
290#define afficherHexa(v, n, l, c) \
292 uint32_t __val = (uint32_t) v; \
293 for (int __i = MANUX_CON_COLONNES*l+c+n-1; __i>=MANUX_CON_COLONNES*l+c; __i--) { \
294 ecran[2*__i] = chiffre[__val&15] ; \
298#define afficherBin(v, n, l, c) \
300 uint32_t __val = (uint32_t) v; \
301 for (int __i = MANUX_CON_COLONNES*l+c+n-1; __i>=MANUX_CON_COLONNES*l+c; __i--) { \
302 ecran[2*__i] = chiffre[__val&1] ; \
310static char bufferEcran[4000];
313void ecranDeLaMort(
uint32_t errCode,
uint32_t itNum, TousRegistres registres,
319 char *ecranPanique =
"\
320+-------------+-------------------+--------32--28--24--20--16--12---8---4---0--+\
321| it : 0x-- | tss = 0x-------- | eflags= -------------------------------- |\
322+-------------+-------------------+-------------+---+---+---+---+---+---+---+--+\
323| cs : 0x---- | eip = 0x-------- | cr3 = 0x |\
324+-------------+-------------------+--------------------------------------------+\
325| ss : 0x---- | esp = 0x-------- | |\
326+-------------+-------------------+--------------------------------------------+\
327| ds : 0x---- | esi = 0x-------- | |\
328+-------------+-------------------+--------------------------------------------+\
329| | edi = 0x-------- | err = 0x |\
330+-------------+-----------------(Esp pour cacher)------------------------------+";
332 char chiffre[16] =
"0123456789ABCDEF";
338 memcpy(bufferEcran, ecran, 4000);
342 ecran[i] = ecranPanique[i/2];
346 __asm__ __volatile__(
"str %%eax" :
"=a" (indice));
355#ifdef MANUX_GESTION_MEMOIRE
392 ecranDeLaMort(errCode, numIt, registres, eip, cs, eFlags);
398#ifdef MANUX_CONSOLES_VIRTUELLES
399 basculerVersConsoleSuivante();
408 ecranDeLaMort(errCode, numIt, registres, eip, cs, eFlags);
411 memcpy(ecran, bufferEcran, 4000);
Définition des opérations de synchronisation de ManuX.
Définition des caractéristiques de base de l'écran.
#define MANUX_CON_COLONNES
Définition des fonctions de base d'accés à la console.
void(* FonctionGestionException)(TousRegistres registres, uint32_t eip, uint32_t cs, uint32_t eFlags, uint32_t numEx, uint32_t errCode)
typedef void(Handler(void))
void(* FonctionGestionInterruption)(TousRegistres registres, uint32_t eip, uint32_t cs, uint32_t eFlags, uint32_t numIt)
Définition des fonctions de base d'entrée-sortie du noyau.
void printk(char *format,...)
Fonction principale d'affichage dans le noyau.
void * memcpy(void *dest, const void *src, size_t n)
void stubHandlerExFloatingVirtualization(void)
void stubHandlerIRQ15(void)
void stubHandlerExReserved6(void)
void stubHandlerExNMI(void)
void stubHandlerIRQ9(void)
void stubHandlerIRQ6(void)
void stubHandlerIRQ4(void)
void stubHandlerExReserved(void)
void stubHandlerIRQ5(void)
void stubHandlerExFloatingSIMDFPE(void)
void stubHandlerExDebug(void)
void stubHandlerIRQ1(void)
void stubHandlerExReserved4(void)
void stubHandlerExDeviceInvalidOpcode(void)
void stubHandlerIRQ7(void)
void stubHandlerIRQ0(void)
void stubHandlerIRQ13(void)
void stubHandlerIRQ12(void)
void stubHandlerExOverflow(void)
void stubHandlerIRQ3(void)
void stubHandlerExStackSegmentFault(void)
void stubHandlerExDoubleFault(void)
void stubHandlerExAlignmentCheck(void)
void stubHandlerExVMMCommunication(void)
void stubHandlerExInvalidTSS(void)
void stubHandlerExDeviceUnavailable(void)
void stubHandlerExReserved2(void)
void stubHandlerExGeneralProtectionFault(void)
void stubHandlerIRQ11(void)
void stubHandlerIRQ8(void)
void stubHandlerIRQ2(void)
void stubHandlerIRQ14(void)
void stubHandlerExCoproOverrun(void)
void stubHandlerExReserved5(void)
void initialiserHandlersInterruption(void *table, uint32_t taille)
void stubHandlerExHypervisionInjection(void)
void stubHandlerExReserved8(void)
void stubHandlerExBreakpoint(void)
void stubHandlerIRQ10(void)
void stubHandlerExPageFault(void)
void stubHandlerExFloatingPoint(void)
void stubHandlerExReserved3(void)
void stubHandlerExBoundExceeded(void)
void stubHandlerExControlProtection(void)
void stubHandlerExReserved7(void)
void stubHandlerExSegmentNotPresent(void)
void stubHandlerExDiv0(void)
void stubHandlerExFloatingMachineCheck(void)
void stubHandlerExSecurity(void)
void gestionExceptionPanique(TousRegistres registres, uint32_t numEx, uint32_t errCode, uint32_t eip, uint32_t cs, uint32_t eFlags)
Décompte des interruptions reçues.
void gestionInterruption(TousRegistres registres, uint32_t numIt, uint32_t eip, uint32_t cs, uint32_t eFlags)
: Fonction de base de gestion d'une exception
FonctionGestionException fonctionDeGestionException[MANUX_NB_EXCEPTIONS]
: la table de gestion des exceptions
#define afficherHexa(v, n, l, c)
int definirFonctionGestionInterruption(int num, FonctionGestionInterruption fg)
#define afficherBin(v, n, l, c)
void * handlerBasNiveauInterruption[MANUX_NB_SOFT_INT]
Une table (initialisée par la fonction initialiserHandlersInterruption de interBasNiveau....
void initialiserIDT(void)
! Initialiser l'IDT (Interrupt Description Table)
#define MANUX_NB_SOFT_INT
Combien y a-t-il d'interruptions logicielles ?
void gestionException(TousRegistres registres, uint32_t numEx, uint32_t errCode, uint32_t eip, uint32_t cs, uint32_t eFlags)
: Fonction de base de gestion d'une exception
#define MANUX_SELECTEUR_SEGMENT_CODE
FonctionGestionInterruption fonctionDeGestionInterruption[MANUX_NB_SOFT_INT]
#define inb(port, adresseOctet)
Lecture d'un octet depuis un port.
#define MANUX_INT_BASE_IRQ
#define MANUX_NB_INTERRUPTIONS
#define MANUX_NB_EXCEPTIONS
#define MANUX_ADRESSE_IDT
DescriptorTable * gdtSysteme
Descripteur descripteur[0]