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