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