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