]> pd.if.org Git - mmurtl/blob - ossource/except.asm
autocommit for file dated 1995-02-09 16:00:32
[mmurtl] / ossource / except.asm
1 ;   MMURTL Operating System Source Code\r
2 ;   Copyright 1991,1992,1993,1994 Richard A. Burgess\r
3 ;   ALL RIGHTS RESERVED\r
4 ;   Version 1.0\r
5 .DATA\r
6 .INCLUDE MOSEDF.INC\r
7 .INCLUDE TSS.INC\r
8 .INCLUDE JOB.INC\r
9 \r
10 EXTRN DbgpTSSSave DD\r
11 EXTRN dbgFAULT    DD\r
12 EXTRN dbgFltErc   DD\r
13 EXTRN dbgOldEIP   DD\r
14 EXTRN dbgOldCS    DD\r
15 EXTRN dbgOldEFlgs DD\r
16 \r
17 EXTRN DbgTSS      DB\r
18 EXTRN pRunTSS     DD\r
19 \r
20 .CODE\r
21 \r
22 ;This file contains Exception Handlers and Debugger Entry\r
23 ;and Exit code.\r
24 \r
25 ;=============================================================================\r
26 ; Procedure jumped to by interrupt procedures to enter debugger\r
27 ;=============================================================================\r
28 ;EnterDebug\r
29 ;\r
30 ; This piece of code sets up to enter the debugger.  If we get here,\r
31 ; one of the exceptions has activated and has done a little work based\r
32 ; on which exception is was, then it jumped here to enter the debugger.\r
33 ; This code effectively replaces the interrupted task with the debugger\r
34 ; task (without going through the kernel).  First we copy the Page Dir\r
35 ; entry from the current job into the debuggers job, then copy the CR3\r
36 ; register from the current TSS into the debugger's TSS.  This makes the\r
37 ; debugger operate in the current tasks memory space.  All of the debugger's\r
38 ; code and data are in OS protected pages (which are shared with all tasks),\r
39 ; so this is OK to do even if the offending task referenced a bogus address.\r
40 ; Next, we save the current pRunTSS and place the debugger's TSS in\r
41 ; pRunTSS, then jump to the debugger's selector.  This switches tasks.\r
42 ;\r
43 EnterDebug:\r
44                 PUSH EAX                                        ;we MUST save caller's registers\r
45                 PUSH EBX                                        ; and restore them before the\r
46                 PUSH EDX                                        ; task switch into the debugger\r
47 \r
48                 MOV EAX, pRunTSS                        ;pRunTSS -> EAX\r
49                 MOV EBX, [EAX+TSS_CR3]          ;current CR3 -> EBX\r
50                 MOV EDX, OFFSET DbgTSS          ;pDebuggerTSS -> EDX\r
51                 MOV [EDX+TSS_CR3], EBX          ;CR3 -> DebuggerTSS\r
52 \r
53                 MOV EAX, [EAX+TSS_pJCB]         ;pCrntJCB -> EAX\r
54                 MOV EDX, [EDX+TSS_pJCB]         ;pDebuggerJCB -> EDX\r
55                 MOV EBX, [EAX+JcbPD]            ;CrntJob Page Dir -> EBX\r
56                 MOV [EDX+JcbPD], EBX            ;Page Dir -> Debugger JCB\r
57 \r
58                 MOV EAX, pRunTSS                        ;Save the current pRunTSS\r
59                 MOV DbgpTSSSave, EAX\r
60                 MOV EAX, OFFSET DbgTSS          ;Install Debugger's as current\r
61                 MOV pRunTSS, EAX                        ;Set Dbgr as running task\r
62 \r
63                 MOV BX, [EAX+Tid]\r
64         MOV TSS_Sel, BX                         ;Set up debugger selector\r
65 \r
66                 POP EDX                                         ;make his registers right!\r
67                 POP EBX\r
68                 POP EAX\r
69 \r
70         JMP FWORD PTR [TSS]                     ;Switch tasks to debugger\r
71 \r
72                 ;When the debugger exits, we come here\r
73 \r
74                 PUSH dbgOldEFlgs                        ;Put the stack back the way it was\r
75                 PUSH dbgOldCS                           ;\r
76                 PUSH dbgOldEIP                          ;\r
77                 IRETD                                           ;Go back to the caller\r
78 \r
79 ;=============================================================================\r
80 ; INTERRUPT PROCEDURES FOR FAULTS\r
81 ;=============================================================================\r
82 ; This is the general purpose "We didn't expect this interrupt" interrupt\r
83 ; This will place "99" in the upper left corner of the screen so we\r
84 ; can see there are SPURIOUS interrupts!!!!!\r
85 \r
86 PUBLIC INTQ:\r
87                 PUSH EAX\r
88                 MOV EAX,07390739h       ;99 - All unassigned ints come here\r
89                 MOV DS:VGATextBase+00h,EAX\r
90                 POP EAX\r
91                 IRETD\r
92 \r
93 ;===================== Divide By ZERO (Int 0) ============================\r
94 \r
95 PUBLIC IntDivBy0:\r
96 ;               MOV EAX,07300730h       ;00\r
97 ;               MOV DS:VGATextBase+00h,EAX\r
98 ;               CLI\r
99 ;               HLT\r
100 \r
101                 MOV dbgFAULT,00h        ; Divide By Zero\r
102                 POP dbgOldEIP                   ; Get EIP of offender for debugger\r
103                 POP dbgOldCS                    ;\r
104                 POP dbgOldEFlgs                 ;\r
105                 JMP EnterDebug                  ;Enter debugger\r
106 \r
107 ;===================== Debugger Single Step (Int 1) ======================\r
108 \r
109 PUBLIC IntDbgSS:\r
110 \r
111                 POP dbgOldEIP                   ; Get EIP of offender for debugger\r
112                 POP dbgOldCS                    ;\r
113                 POP dbgOldEFlgs                 ;\r
114                 JMP EnterDebug                  ;Enter debugger\r
115 \r
116 ;===================== Debugger Entry (Int 3) ===========================\r
117 \r
118 PUBLIC IntDebug:\r
119 \r
120                 POP dbgOldEIP                   ; Get EIP of offender for debugger\r
121                 POP dbgOldCS                    ; Get CS\r
122                 POP dbgOldEFlgs                 ; Get Flags\r
123                 JMP EnterDebug                  ;Enter debugger\r
124 \r
125 ;===================== OverFlow (Int 4) ==================================\r
126 \r
127 PUBLIC IntOverFlow:\r
128                 PUSH EAX\r
129                 MOV EAX,07340730h       ;04\r
130                 MOV DS:VGATextBase+00h,EAX\r
131                 CLI\r
132                 HLT\r
133 \r
134 ;========================== Bad Opcode (Int 6) ================================\r
135 PUBLIC INTOpCode:\r
136 ;               MOV EAX,07360730h       ;06\r
137 ;               MOV DS:VGATextBase+00h,EAX\r
138 ;               HLT\r
139 \r
140                 MOV dbgFAULT,06h        ; Invalid Opcode\r
141                 POP dbgOldEIP                   ; Get EIP of offender for debugger\r
142                 POP dbgOldCS                    ;\r
143                 POP dbgOldEFlgs                 ;\r
144                 JMP EnterDebug                  ;Enter debugger\r
145 \r
146 ;========================== Dbl Exception (Int 08)============================\r
147 PUBLIC IntDblExc:\r
148 ;               MOV EAX,07380730h       ;08\r
149 ;               MOV DS:VGATextBase+00h,EAX\r
150 ;               CLI\r
151 ;               HLT\r
152 \r
153                 MOV dbgFAULT,08h        ; Double Exception\r
154                 POP dbgFltErc                   ; Error Code pushed last by processor\r
155                 POP dbgOldEIP\r
156                 POP dbgOldCS\r
157                 POP dbgOldEFlgs\r
158                 POP dbgOldEFlgs                 ;\r
159                 JMP EnterDebug                  ;Enter debugger\r
160 \r
161 ;========================= Invalid TSS 10 ====================================\r
162 PUBLIC INTInvTss:\r
163                 MOV EAX,07300731h       ;10\r
164                 MOV DS:VGATextBase+00h,EAX\r
165                 CLI\r
166                 HLT\r
167 \r
168                 MOV dbgFAULT,0Ah        ; Invalid TSS\r
169                 POP dbgFltErc                   ; Error code pushed last by processor\r
170                 POP dbgOldEIP\r
171                 POP dbgOldCS\r
172                 POP dbgOldEFlgs\r
173                 JMP EnterDebug                  ;Enter debugger\r
174 \r
175 ;========================== Seg Not Present 11 ===============================\r
176 \r
177 PUBLIC INTNoSeg:\r
178                 MOV EAX,07310731h       ;11\r
179                 MOV DS:VGATextBase+00h,EAX\r
180                 CLI\r
181                 HLT\r
182 \r
183 ;========================== Stack Overflow 12 ================================\r
184 PUBLIC INTStkOvr:\r
185 ;               MOV EAX,07320731h       ;12\r
186 ;               MOV DS:VGATextBase+00h,EAX\r
187 ;               CLI\r
188 ;               HLT\r
189 \r
190                 MOV dbgFAULT,0Ch        ; Stack overflow\r
191                 POP dbgFltErc\r
192                 POP dbgOldEIP\r
193                 POP dbgOldCS\r
194                 POP dbgOldEFlgs\r
195                 JMP EnterDebug                  ;Enter debugger\r
196 \r
197 ;========================== GP 13  ===========================================\r
198 PUBLIC IntGP:\r
199 ;               MOV EAX,07330731h       ;13\r
200 ;               MOV DS:VGATextBase+00h,EAX\r
201 ;               CLI\r
202 ;               HLT\r
203 \r
204                 MOV dbgFAULT,0Dh        ; GP Fault\r
205                 POP dbgFltErc\r
206                 POP dbgOldEIP\r
207                 POP dbgOldCS\r
208                 POP dbgOldEFlgs\r
209                 JMP EnterDebug                  ;Enter debugger\r
210 \r
211 ;========================== Page Fault 14 ====================================\r
212 PUBLIC INTPgFlt:\r
213 ;               MOV EAX,07340731h       ;14\r
214 ;               MOV DS:VGATextBase+00h,EAX\r
215 ;               CLI\r
216 ;               HLT\r
217 \r
218                 MOV dbgFAULT,0Eh        ; Page Fault\r
219                 POP dbgFltErc\r
220                 POP dbgOldEIP\r
221                 POP dbgOldCS\r
222                 POP dbgOldEFlgs\r
223                 JMP EnterDebug                  ;Enter debugger\r
224 \r
225 ;=============================================================================\r
226 ; ISR for interrupt on PICU1 from Slave\r
227 ;=============================================================================\r
228 \r
229 PUBLIC IntPICU2:                           ; IRQ Line 2 from Slave 8259 (Int22)\r
230                 PUSH EAX\r
231                 MOV EAX,07320750h               ; From PICU#2 (P2)\r
232                 MOV DS:VGATextBase+100h,EAX\r
233                 PUSH 2\r
234                 CALL FWORD PTR _EndOfIRQ\r
235                 POP EAX\r
236                 IRETD\r
237 \r
238 ;=============== end of module ==================\r