- Fix KiDispatchException to unmask KI_EXCEPTION_INTERNAL when setting the exception...
[reactos.git] / reactos / ntoskrnl / include / internal / kd.h
1 #ifndef __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H
2 #define __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H
3
4 //
5 // Kernel Debugger Port Definition
6 //
7 typedef struct _KD_PORT_INFORMATION
8 {
9 ULONG ComPort;
10 ULONG BaudRate;
11 ULONG BaseAddress;
12 } KD_PORT_INFORMATION, *PKD_PORT_INFORMATION;
13
14 struct _KD_DISPATCH_TABLE;
15 extern KD_PORT_INFORMATION GdbPortInfo;
16 extern BOOLEAN _KdDebuggerEnabled;
17 extern BOOLEAN _KdDebuggerNotPresent;
18 extern BOOLEAN KdBreakAfterSymbolLoad;
19
20 BOOLEAN
21 NTAPI
22 KdPortInitialize(
23 PKD_PORT_INFORMATION PortInformation,
24 ULONG Unknown1,
25 ULONG Unknown2
26 );
27
28 BOOLEAN
29 NTAPI
30 KdPortInitializeEx(
31 PKD_PORT_INFORMATION PortInformation,
32 ULONG Unknown1,
33 ULONG Unknown2
34 );
35
36 BOOLEAN
37 NTAPI
38 KdPortGetByte(
39 PUCHAR ByteRecieved);
40
41 BOOLEAN
42 NTAPI
43 KdPortGetByteEx(
44 PKD_PORT_INFORMATION PortInformation,
45 PUCHAR ByteRecieved);
46
47 VOID
48 NTAPI
49 KdPortPutByte(
50 UCHAR ByteToSend
51 );
52
53 VOID
54 NTAPI
55 KdPortPutByteEx(
56 PKD_PORT_INFORMATION PortInformation,
57 UCHAR ByteToSend
58 );
59
60 /* SYMBOL ROUTINES **********************************************************/
61 #ifdef __NTOSKRNL__
62
63 #if defined(KDBG) || defined(DBG)
64
65 VOID
66 KdbSymLoadUserModuleSymbols(IN PLDR_DATA_TABLE_ENTRY LdrModule);
67
68 VOID
69 KdbSymFreeProcessSymbols(IN PEPROCESS Process);
70
71 VOID
72 KdbSymLoadDriverSymbols(
73 IN PUNICODE_STRING Filename,
74 IN PLDR_DATA_TABLE_ENTRY Module
75 );
76
77 VOID
78 KdbSymUnloadDriverSymbols(IN PLDR_DATA_TABLE_ENTRY ModuleObject);
79
80 VOID
81 KdbSymProcessBootSymbols(IN PUNICODE_STRING FileName);
82
83 VOID
84 KdbSymInit(
85 IN PLDR_DATA_TABLE_ENTRY NtoskrnlTextSection,
86 IN PLDR_DATA_TABLE_ENTRY LdrHalTextSection
87 );
88
89 BOOLEAN
90 KdbSymPrintAddress(IN PVOID Address);
91
92 VOID
93 KdbDeleteProcessHook(IN PEPROCESS Process);
94
95 NTSTATUS
96 KdbSymGetAddressInformation(
97 IN PROSSYM_INFO RosSymInfo,
98 IN ULONG_PTR RelativeAddress,
99 OUT PULONG LineNumber OPTIONAL,
100 OUT PCH FileName OPTIONAL,
101 OUT PCH FunctionName OPTIONAL
102 );
103
104 typedef struct _KDB_MODULE_INFO
105 {
106 WCHAR Name[256];
107 ULONG_PTR Base;
108 ULONG Size;
109 PROSSYM_INFO RosSymInfo;
110 } KDB_MODULE_INFO, *PKDB_MODULE_INFO;
111
112 /* MACROS FOR NON-KDBG BUILDS ************************************************/
113
114 # define KDB_LOADUSERMODULE_HOOK(LDRMOD) KdbSymLoadUserModuleSymbols(LDRMOD)
115 # define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) KdbSymLoadDriverSymbols(FILENAME, MODULE)
116 # define KDB_UNLOADDRIVER_HOOK(MODULE) KdbSymUnloadDriverSymbols(MODULE)
117 # define KDB_LOADERINIT_HOOK(NTOS, HAL) KdbSymInit(NTOS, HAL)
118 # define KDB_SYMBOLFILE_HOOK(FILENAME) KdbSymProcessBootSymbols(FILENAME)
119 #else
120 # define KDB_LOADUSERMODULE_HOOK(LDRMOD) do { } while (0)
121 # define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) do { } while (0)
122 # define KDB_UNLOADDRIVER_HOOK(MODULE) do { } while (0)
123 # define KDB_LOADERINIT_HOOK(NTOS, HAL) do { } while (0)
124 # define KDB_SYMBOLFILE_HOOK(FILENAME) do { } while (0)
125 # define KDB_CREATE_THREAD_HOOK(CONTEXT) do { } while (0)
126 #endif
127
128 #if defined(KDBG) || defined(DBG)
129 # define KeRosPrintAddress(ADDRESS) KdbSymPrintAddress(ADDRESS)
130 #else
131 # define KeRosPrintAddress(ADDRESS) KiRosPrintAddress(ADDRESS)
132 #endif
133
134 #ifdef KDBG
135 # define KdbInit() KdbpCliInit()
136 # define KdbModuleLoaded(FILENAME) KdbpCliModuleLoaded(FILENAME)
137 # define KDB_DELETEPROCESS_HOOK(PROCESS) KdbDeleteProcessHook(PROCESS)
138 #else
139 # define KdbEnterDebuggerException(ER, PM, C, TF, F) kdHandleException
140 # define KdbInit() do { } while (0)
141 # define KdbEnter() do { } while (0)
142 # define KdbModuleLoaded(X) do { } while (0)
143 # define KDB_DELETEPROCESS_HOOK(PROCESS) do { } while (0)
144 #endif
145
146 /* KD ROUTINES ***************************************************************/
147
148 typedef enum _KD_CONTINUE_TYPE
149 {
150 kdContinue = 0,
151 kdDoNotHandleException,
152 kdHandleException
153 } KD_CONTINUE_TYPE;
154
155 typedef
156 VOID
157 (STDCALL*PKDP_INIT_ROUTINE)(
158 struct _KD_DISPATCH_TABLE *DispatchTable,
159 ULONG BootPhase
160 );
161
162 typedef
163 VOID
164 (STDCALL*PKDP_PRINT_ROUTINE)(
165 LPSTR String,
166 ULONG Length
167 );
168
169 typedef
170 VOID
171 (STDCALL*PKDP_PROMPT_ROUTINE)(PCH String);
172
173 typedef
174 KD_CONTINUE_TYPE
175 (STDCALL*PKDP_EXCEPTION_ROUTINE)(
176 PEXCEPTION_RECORD ExceptionRecord,
177 PCONTEXT Context,
178 PKTRAP_FRAME TrapFrame
179 );
180
181 /* INIT ROUTINES *************************************************************/
182
183 VOID
184 STDCALL
185 KdpScreenInit(
186 struct _KD_DISPATCH_TABLE *DispatchTable,
187 ULONG BootPhase
188 );
189
190 VOID
191 STDCALL
192 KdpSerialInit(
193 struct _KD_DISPATCH_TABLE *DispatchTable,
194 ULONG BootPhase
195 );
196
197 VOID
198 STDCALL
199 KdpInitDebugLog(
200 struct _KD_DISPATCH_TABLE *DispatchTable,
201 ULONG BootPhase
202 );
203
204 VOID
205 STDCALL
206 KdpBochsInit(
207 struct _KD_DISPATCH_TABLE *DispatchTable,
208 ULONG BootPhase
209 );
210
211 VOID
212 STDCALL
213 KdpGdbStubInit(
214 struct _KD_DISPATCH_TABLE *DispatchTable,
215 ULONG BootPhase);
216
217 /* KD ROUTINES ***************************************************************/
218
219 BOOLEAN
220 NTAPI
221 KdpCallGdb(
222 IN PKTRAP_FRAME TrapFrame,
223 IN PEXCEPTION_RECORD ExceptionRecord,
224 IN PCONTEXT Context
225 );
226
227 ULONG
228 STDCALL
229 KdpPrintString(
230 LPSTR String,
231 ULONG Length);
232
233 BOOLEAN
234 STDCALL
235 KdpDetectConflicts(PCM_RESOURCE_LIST DriverList);
236
237 VOID
238 STDCALL
239 KdpBochsDebugPrint(
240 IN PCH Message,
241 IN ULONG Length
242 );
243
244 /* KD GLOBALS ***************************************************************/
245
246 typedef
247 BOOLEAN
248 (NTAPI *PKDEBUG_ROUTINE)(
249 IN PKTRAP_FRAME TrapFrame,
250 IN PKEXCEPTION_FRAME ExceptionFrame,
251 IN PEXCEPTION_RECORD ExceptionRecord,
252 IN PCONTEXT Context,
253 IN KPROCESSOR_MODE PreviousMode,
254 IN BOOLEAN SecondChance
255 );
256
257 /* serial debug connection */
258 #define DEFAULT_DEBUG_PORT 2 /* COM2 */
259 #define DEFAULT_DEBUG_COM1_IRQ 4 /* COM1 IRQ */
260 #define DEFAULT_DEBUG_COM2_IRQ 3 /* COM2 IRQ */
261 #define DEFAULT_DEBUG_BAUD_RATE 115200 /* 115200 Baud */
262
263 /* KD Native Modes */
264 #define KdScreen 0
265 #define KdSerial 1
266 #define KdFile 2
267 #define KdBochs 3
268 #define KdMax 4
269
270 /* KD Private Debug Modes */
271 typedef struct _KDP_DEBUG_MODE
272 {
273 union
274 {
275 struct
276 {
277 /* Native Modes */
278 UCHAR Screen :1;
279 UCHAR Serial :1;
280 UCHAR File :1;
281 UCHAR Bochs :1;
282
283 /* Currently Supported Wrappers */
284 UCHAR Pice :1;
285 UCHAR Gdb :1;
286 };
287
288 /* Generic Value */
289 ULONG Value;
290 };
291 } KDP_DEBUG_MODE;
292
293 /* KD Internal Debug Services */
294 typedef enum _KDP_DEBUG_SERVICE
295 {
296 DumpNonPagedPool = 0x1e, /* a */
297 ManualBugCheck = 0x30, /* b */
298 DumpNonPagedPoolStats = 0x2e, /* c */
299 DumpNewNonPagedPool = 0x20, /* d */
300 DumpNewNonPagedPoolStats = 0x12, /* e */
301 DumpAllThreads = 0x21, /* f */
302 DumpUserThreads = 0x22, /* g */
303 KdSpare1 = 0x23, /* h */
304 KdSpare2 = 0x17, /* i */
305 KdSpare3 = 0x24, /* j */
306 EnterDebugger = 0x25 /* k */
307 } KDP_DEBUG_SERVICE;
308
309 /* Dispatch Table for Wrapper Functions */
310 typedef struct _KD_DISPATCH_TABLE
311 {
312 LIST_ENTRY KdProvidersList;
313 PKDP_INIT_ROUTINE KdpInitRoutine;
314 PKDP_PRINT_ROUTINE KdpPrintRoutine;
315 PKDP_PROMPT_ROUTINE KdpPromptRoutine;
316 PKDP_EXCEPTION_ROUTINE KdpExceptionRoutine;
317 } KD_DISPATCH_TABLE, *PKD_DISPATCH_TABLE;
318
319 /* The current Debugging Mode */
320 extern KDP_DEBUG_MODE KdpDebugMode;
321
322 /* The current Port IRQ */
323 extern ULONG KdpPortIrq;
324
325 /* The current Port */
326 extern ULONG KdpPort;
327
328 /* Port Information for the Serial Native Mode */
329 extern KD_PORT_INFORMATION SerialPortInfo;
330
331 /* Init Functions for Native Providers */
332 extern PKDP_INIT_ROUTINE InitRoutines[KdMax];
333
334 /* Wrapper Init Function */
335 extern PKDP_INIT_ROUTINE WrapperInitRoutine;
336
337 /* Dispatch Tables for Native Providers */
338 extern KD_DISPATCH_TABLE DispatchTable[KdMax];
339
340 /* Dispatch Table for the Wrapper */
341 extern KD_DISPATCH_TABLE WrapperTable;
342
343 /* The KD Native Provider List */
344 extern LIST_ENTRY KdProviders;
345
346 /* Whether to enter KDB as early as possible or not */
347 extern BOOLEAN KdpEarlyBreak;
348
349 extern PKDEBUG_ROUTINE KiDebugRoutine;
350
351 #endif
352 #endif /* __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H */