xref: /reactos/ntoskrnl/include/internal/kd.h (revision 41203c9b)
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 PKTRAP_FRAME 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
346