-
Notifications
You must be signed in to change notification settings - Fork 0
/
CallBack_Exception.c
160 lines (136 loc) · 5.15 KB
/
CallBack_Exception.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include "Ecran.h"
#include "PLAN_MEMOIRE.h"
#include "MACRO.h"
#include "Outils.h"
void Affiche_Message_Exception(UCHAR* P_Message, UINT32 P_ESP)
{
Regle_Couleur(ROUGE);
Affiche_Chaine("\nEXCEPTION ");
Affiche_Chaine(P_Message);
Regle_Couleur(VERT);
Affiche_Caractere('[');
Affiche_Chaine(Entier_Vers_Chaine_Hexa(*(UINT32*)(P_ESP+8),4));
Affiche_Caractere(':');
Affiche_Chaine(Entier_Vers_Chaine_Hexa(*(UINT32*)(P_ESP+4),4));
Affiche_Caractere(':');
Affiche_Chaine(Entier_Vers_Chaine_Hexa(*(UINT32*)P_ESP,4));
Affiche_Chaine("]\n");
Regle_Couleur(BLANC);
}
//------------------------------------------------------------------------------
void CallBack_Erreur_Division(UINT32 P_ESP) // EXCEPTION TYPE ERREUR
{
INITIALISER_DS(SELECTEUR_DATA_NOYAU); // L'interruption doit manipuler des données du noyau.
// on positionne donc DS avec le bon selecteur
Affiche_Message_Exception("erreur de division : ", P_ESP);
// P_ESP Contient la valeur de ESP au moment de l'exception c'est à dire la valeur de EIP.
// EIP est le numéro de case mémoire de l'instruction qui a causée l'exception.
// lors de la sortie de de l'exception on dépilera pour ré-alimenter EIP.
// Modifions dés maintenant cette valeur afin de pointer vers l'instruction suivante.
// puisque DIV occupe 2 octets :
*((UINT32*)P_ESP) +=2;
}
//------------------------------------------------------------------------------
void CallBack_Mise_Au_Point(UINT32 P_ESP)
{
INITIALISER_DS(SELECTEUR_DATA_NOYAU);
Affiche_Message_Exception("mise au point : ", P_ESP);
HALT; // Arret du processeur
}
//------------------------------------------------------------------------------
void CallBack_INT3(UINT32 P_ESP)
{
INITIALISER_DS(SELECTEUR_DATA_NOYAU);
Affiche_Message_Exception("INT3 Debug : ", P_ESP);
}
//------------------------------------------------------------------------------
void CallBack_Debordement(UINT32 P_ESP)
{
INITIALISER_DS(SELECTEUR_DATA_NOYAU);
Affiche_Message_Exception("Debordement : ", P_ESP);
HALT;
}
//------------------------------------------------------------------------------
void CallBack_Limite(UINT32 P_ESP) // EXCEPTION TYPE ERREUR
{
INITIALISER_DS(SELECTEUR_DATA_NOYAU);
Affiche_Message_Exception("Limitye : ", P_ESP);
HALT;
}
//------------------------------------------------------------------------------
void CallBack_CodeOP_Invalide(UINT32 P_ESP)
{
INITIALISER_DS(SELECTEUR_DATA_NOYAU);
Affiche_Message_Exception("CodeOP invalide : ", P_ESP);
HALT;
}
//------------------------------------------------------------------------------
void CallBack_DNA(UINT32 P_ESP)
{
INITIALISER_DS(SELECTEUR_DATA_NOYAU);
Affiche_Message_Exception("DNA : ", P_ESP);
HALT;
}
//------------------------------------------------------------------------------
void CallBack_Double_Faute(UINT32 P_ESP)
{
INITIALISER_DS(SELECTEUR_DATA_NOYAU);
Affiche_Message_Exception("Double faute : ", P_ESP);
HALT;
}
//------------------------------------------------------------------------------
void CallBack_Depassement(UINT32 P_ESP)
{
INITIALISER_DS(SELECTEUR_DATA_NOYAU);
Affiche_Message_Exception("Depassement : ", P_ESP);
HALT;
}
//------------------------------------------------------------------------------
void CallBack_TSS_Invalide(UINT32 P_ESP)
{
INITIALISER_DS(SELECTEUR_DATA_NOYAU);
Affiche_Message_Exception("TSS invalide : ", P_ESP);
HALT;
}
//------------------------------------------------------------------------------
void CallBack_Segment_Non_Present(UINT32 P_ESP)
{
MOV(ax,SELECTEUR_DATA_NOYAU);
MOV(ds,ax);
Affiche_Message_Exception("Segment non present : ", P_ESP);
HALT;
}
//------------------------------------------------------------------------------
void CallBack_Segment_Pile(UINT32 P_ESP)
{
INITIALISER_DS(SELECTEUR_DATA_NOYAU);
Affiche_Message_Exception("Segment pile : ", P_ESP);
HALT;
}
//------------------------------------------------------------------------------
void CallBack_Violation_Protection(UINT32 P_ESP)
{
INITIALISER_DS(SELECTEUR_DATA_NOYAU);
Affiche_Message_Exception("violation de protection : ", P_ESP);
HALT;
}
//------------------------------------------------------------------------------
void CallBack_Defaut_De_Page(UINT32 P_ESP)
{
INITIALISER_DS(SELECTEUR_DATA_NOYAU);
Affiche_Message_Exception("default de page : ", P_ESP);
HALT;
}
//------------------------------------------------------------------------------
void CallBack_CoProcesseur(UINT32 P_ESP)
{
INITIALISER_DS(SELECTEUR_DATA_NOYAU);
Affiche_Message_Exception("coprrcesseurt : ", P_ESP);
HALT;
}
//------------------------------------------------------------------------------
void CallBack_Exception_Par_Defaut(UINT32 P_ESP)
{
INITIALISER_DS(SELECTEUR_DATA_NOYAU);
Affiche_Message_Exception("par defaut : ", P_ESP);
}