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