Synchronize with trunk's revision r57599.
[reactos.git] / ntoskrnl / include / internal / kd.h
1 #pragma once
2
3 #ifdef _M_PPC
4 #define KdDebuggerEnabled _KdDebuggerEnabled
5 #define KdDebuggerNotPresent _KdDebuggerNotPresent
6 #endif
7
8 //
9 // Kernel Debugger Port Definition
10 //
11 typedef struct _KD_PORT_INFORMATION
12 {
13 ULONG ComPort;
14 ULONG BaudRate;
15 ULONG BaseAddress;
16 } KD_PORT_INFORMATION, *PKD_PORT_INFORMATION;
17
18 struct _KD_DISPATCH_TABLE;
19 extern KD_PORT_INFORMATION GdbPortInfo;
20 extern BOOLEAN _KdDebuggerEnabled;
21 extern BOOLEAN _KdDebuggerNotPresent;
22 extern BOOLEAN KdBreakAfterSymbolLoad;
23 extern BOOLEAN KdPitchDebugger;
24 extern BOOLEAN KdIgnoreUmExceptions;
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 #if KDBG
72 typedef
73 BOOLEAN
74 (NTAPI *PKDBG_CLI_ROUTINE)(
75 IN PCHAR Command,
76 IN ULONG Argc,
77 IN PCH Argv[]);
78
79 BOOLEAN
80 NTAPI
81 KdbRegisterCliCallback(
82 PVOID Callback,
83 BOOLEAN Deregister);
84 #endif
85
86 VOID
87 KdbSymProcessSymbols(
88 IN PLDR_DATA_TABLE_ENTRY LdrEntry);
89
90
91 BOOLEAN
92 KdbSymPrintAddress(
93 IN PVOID Address,
94 IN PKTRAP_FRAME Context
95 );
96
97 NTSTATUS
98 KdbSymGetAddressInformation(
99 IN PROSSYM_INFO RosSymInfo,
100 IN ULONG_PTR RelativeAddress,
101 #ifdef __ROS_DWARF__
102 IN PROSSYM_LINEINFO RosSymLineInfo
103 #else
104 OUT PULONG LineNumber OPTIONAL,
105 OUT PCH FileName OPTIONAL,
106 OUT PCH FunctionName OPTIONAL
107 #endif
108 );
109 #endif
110
111 #ifdef KDBG
112 # define KdbInit() KdbpCliInit()
113 # define KdbModuleLoaded(FILENAME) KdbpCliModuleLoaded(FILENAME)
114 #else
115 # define KdbEnterDebuggerException(ER, PM, C, TF, F) kdHandleException
116 # define KdbInit() do { } while (0)
117 # define KdbEnter() do { } while (0)
118 # define KdbModuleLoaded(X) do { } while (0)
119 #endif
120
121 /* KD ROUTINES ***************************************************************/
122
123 typedef enum _KD_CONTINUE_TYPE
124 {
125 kdContinue = 0,
126 kdDoNotHandleException,
127 kdHandleException
128 }
129 KD_CONTINUE_TYPE;
130
131 typedef
132 VOID
133 (NTAPI*PKDP_INIT_ROUTINE)(
134 struct _KD_DISPATCH_TABLE *DispatchTable,
135 ULONG BootPhase
136 );
137
138 typedef
139 VOID
140 (NTAPI*PKDP_PRINT_ROUTINE)(
141 LPSTR String,
142 ULONG Length
143 );
144
145 typedef
146 VOID
147 (NTAPI*PKDP_PROMPT_ROUTINE)(PCH String);
148
149 typedef
150 KD_CONTINUE_TYPE
151 (NTAPI*PKDP_EXCEPTION_ROUTINE)(
152 PEXCEPTION_RECORD ExceptionRecord,
153 PCONTEXT Context,
154 PKTRAP_FRAME TrapFrame
155 );
156
157 BOOLEAN
158 NTAPI
159 KdIsThisAKdTrap(
160 IN PEXCEPTION_RECORD ExceptionRecord,
161 IN PCONTEXT Context,
162 IN KPROCESSOR_MODE PreviousMode
163 );
164
165 /* INIT ROUTINES *************************************************************/
166
167 BOOLEAN
168 NTAPI
169 KdInitSystem(
170 ULONG Reserved,
171 PLOADER_PARAMETER_BLOCK LoaderBlock
172 );
173
174 VOID
175 NTAPI
176 KdpScreenInit(
177 struct _KD_DISPATCH_TABLE *DispatchTable,
178 ULONG BootPhase
179 );
180
181 VOID
182 NTAPI
183 KdpSerialInit(
184 struct _KD_DISPATCH_TABLE *DispatchTable,
185 ULONG BootPhase
186 );
187
188 VOID
189 NTAPI
190 KdpInitDebugLog(
191 struct _KD_DISPATCH_TABLE *DispatchTable,
192 ULONG BootPhase
193 );
194
195 VOID
196 NTAPI
197 KdpBochsInit(
198 struct _KD_DISPATCH_TABLE *DispatchTable,
199 ULONG BootPhase
200 );
201
202 VOID
203 NTAPI
204 KdpGdbStubInit(
205 struct _KD_DISPATCH_TABLE *DispatchTable,
206 ULONG BootPhase);
207
208 VOID
209 NTAPI
210 KdpKdbgInit(
211 struct _KD_DISPATCH_TABLE *DispatchTable,
212 ULONG BootPhase);
213
214
215 /* KD ROUTINES ***************************************************************/
216
217 BOOLEAN
218 NTAPI
219 KdpCallGdb(
220 IN PKTRAP_FRAME TrapFrame,
221 IN PEXCEPTION_RECORD ExceptionRecord,
222 IN PCONTEXT Context
223 );
224
225 ULONG
226 NTAPI
227 KdpPrintString(
228 LPSTR String,
229 ULONG Length);
230
231 ULONG
232 NTAPI
233 KdpPrompt(
234 IN LPSTR InString,
235 IN USHORT InStringLength,
236 OUT LPSTR OutString,
237 IN USHORT OutStringLength
238 );
239
240 BOOLEAN
241 NTAPI
242 KdpDetectConflicts(PCM_RESOURCE_LIST DriverList);
243
244 VOID
245 NTAPI
246 KdpBochsDebugPrint(
247 IN PCH Message,
248 IN ULONG Length
249 );
250
251 BOOLEAN
252 NTAPI
253 KdpSafeReadMemory(
254 IN ULONG_PTR Addr,
255 IN LONG Len,
256 OUT PVOID Value
257 );
258
259 BOOLEAN
260 NTAPI
261 KdpSafeWriteMemory(
262 IN ULONG_PTR Addr,
263 IN LONG Len,
264 IN ULONGLONG Value
265 );
266
267 VOID
268 NTAPI
269 KdpEnableSafeMem(VOID);
270
271
272 /* KD GLOBALS ***************************************************************/
273
274 typedef
275 BOOLEAN
276 (NTAPI *PKDEBUG_ROUTINE)(
277 IN PKTRAP_FRAME TrapFrame,
278 IN PKEXCEPTION_FRAME ExceptionFrame,
279 IN PEXCEPTION_RECORD ExceptionRecord,
280 IN PCONTEXT Context,
281 IN KPROCESSOR_MODE PreviousMode,
282 IN BOOLEAN SecondChance
283 );
284
285 /* serial debug connection */
286 #define DEFAULT_DEBUG_PORT 2 /* COM2 */
287 #define DEFAULT_DEBUG_COM1_IRQ 4 /* COM1 IRQ */
288 #define DEFAULT_DEBUG_COM2_IRQ 3 /* COM2 IRQ */
289 #define DEFAULT_DEBUG_BAUD_RATE 115200 /* 115200 Baud */
290
291 /* KD Native Modes */
292 #define KdScreen 0
293 #define KdSerial 1
294 #define KdFile 2
295 #define KdBochs 3
296 #define KdKdbg 4
297 #define KdMax 5
298
299 /* KD Private Debug Modes */
300 typedef struct _KDP_DEBUG_MODE
301 {
302 union
303 {
304 struct
305 {
306 /* Native Modes */
307 UCHAR Screen :1;
308 UCHAR Serial :1;
309 UCHAR File :1;
310 UCHAR Bochs :1;
311
312 /* Currently Supported Wrappers */
313 UCHAR Pice :1;
314 UCHAR Gdb :1;
315 };
316
317 /* Generic Value */
318 ULONG Value;
319 };
320 }
321 KDP_DEBUG_MODE;
322
323 /* KD Internal Debug Services */
324 typedef enum _KDP_DEBUG_SERVICE
325 {
326 DumpNonPagedPool = 0x1e, /* a */
327 ManualBugCheck = 0x30, /* b */
328 DumpNonPagedPoolStats = 0x2e, /* c */
329 DumpNewNonPagedPool = 0x20, /* d */
330 DumpNewNonPagedPoolStats = 0x12, /* e */
331 DumpAllThreads = 0x21, /* f */
332 DumpUserThreads = 0x22, /* g */
333 KdSpare1 = 0x23, /* h */
334 KdSpare2 = 0x17, /* i */
335 KdSpare3 = 0x24, /* j */
336 EnterDebugger = 0x25, /* k */
337 ThatsWhatSheSaid = 69 /* FIGURE IT OUT */
338 }
339 KDP_DEBUG_SERVICE;
340
341 /* Dispatch Table for Wrapper Functions */
342 typedef struct _KD_DISPATCH_TABLE
343 {
344 LIST_ENTRY KdProvidersList;
345 PKDP_INIT_ROUTINE KdpInitRoutine;
346 PKDP_PRINT_ROUTINE KdpPrintRoutine;
347 PKDP_PROMPT_ROUTINE KdpPromptRoutine;
348 PKDP_EXCEPTION_ROUTINE KdpExceptionRoutine;
349 }
350 KD_DISPATCH_TABLE, *PKD_DISPATCH_TABLE;
351
352 /* The current Debugging Mode */
353 extern KDP_DEBUG_MODE KdpDebugMode;
354
355 /* The current Port IRQ */
356 extern ULONG KdpPortIrq;
357
358 /* The current Port */
359 extern ULONG KdpPort;
360
361 /* Port Information for the Serial Native Mode */
362 extern KD_PORT_INFORMATION SerialPortInfo;
363
364 /* Init Functions for Native Providers */
365 extern PKDP_INIT_ROUTINE InitRoutines[KdMax];
366
367 /* Wrapper Init Function */
368 extern PKDP_INIT_ROUTINE WrapperInitRoutine;
369
370 /* Dispatch Tables for Native Providers */
371 extern KD_DISPATCH_TABLE DispatchTable[KdMax];
372
373 /* Dispatch Table for the Wrapper */
374 extern KD_DISPATCH_TABLE WrapperTable;
375
376 /* The KD Native Provider List */
377 extern LIST_ENTRY KdProviders;
378
379 /* Whether to enter KDB as early as possible or not */
380 extern BOOLEAN KdpEarlyBreak;
381
382 extern PKDEBUG_ROUTINE KiDebugRoutine;
383 extern KD_CONTEXT KdpContext;
384 extern ULONG Kd_WIN2000_Mask;
385
386 #endif
387
388 #if DBG
389 #define ID_Win32PreServiceHook 'WSH0'
390 #define ID_Win32PostServiceHook 'WSH1'
391 typedef void (NTAPI *PKDBG_PRESERVICEHOOK)(ULONG, PULONG_PTR);
392 typedef ULONG_PTR (NTAPI *PKDBG_POSTSERVICEHOOK)(ULONG, ULONG_PTR);
393 extern PKDBG_PRESERVICEHOOK KeWin32PreServiceHook;
394 extern PKDBG_POSTSERVICEHOOK KeWin32PostServiceHook;
395 #endif