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