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