- Fix support for /CRASHDEBUG and /NODEBUG; we didn't respect those settings properly...
[reactos.git] / reactos / ntoskrnl / include / internal / kd64.h
1 /*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/include/kd64.h
5 * PURPOSE: Internal header for the KD64 Library
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
7 */
8
9 //
10 // Maximum supported number of breakpoints
11 //
12 #define KD_BREAKPOINT_MAX 32
13
14 //
15 // Default size of the DbgPrint log buffer
16 //
17 #if DBG
18 #define KD_DEFAULT_LOG_BUFFER_SIZE 0x8000
19 #else
20 #define KD_DEFAULT_LOG_BUFFER_SIZE 0x1000
21 #endif
22
23 //
24 // Breakpoint Status Flags
25 //
26 typedef enum _KDP_BREAKPOINT_FLAGS
27 {
28 KdpBreakpointActive = 1,
29 KdpBreakpointPending = 2,
30 KdpBreakpointSuspended = 4,
31 KdpBreakpointExpired = 8
32 } KDP_BREAKPOINT_FLAGS;
33
34 //
35 // Structure for Breakpoints
36 //
37 typedef struct _BREAKPOINT_ENTRY
38 {
39 ULONG Flags;
40 PKPROCESS Process;
41 PVOID Address;
42 KD_BREAKPOINT_TYPE Content;
43 } BREAKPOINT_ENTRY, *PBREAKPOINT_ENTRY;
44
45 //
46 // Debug and Multi-Processor Switch Routine Definitions
47 //
48 typedef
49 BOOLEAN
50 (NTAPI *PKDEBUG_ROUTINE)(
51 IN PKTRAP_FRAME TrapFrame,
52 IN PKEXCEPTION_FRAME ExceptionFrame,
53 IN PEXCEPTION_RECORD ExceptionRecord,
54 IN PCONTEXT Context,
55 IN KPROCESSOR_MODE PreviousMode,
56 IN BOOLEAN SecondChance
57 );
58
59 typedef
60 BOOLEAN
61 (NTAPI *PKDEBUG_SWITCH_ROUTINE)(
62 IN PEXCEPTION_RECORD ExceptionRecord,
63 IN PCONTEXT Context,
64 IN BOOLEAN SecondChance
65 );
66
67 //
68 // Initialization Routines
69 //
70 BOOLEAN
71 NTAPI
72 KdInitSystem(
73 ULONG Reserved,
74 PLOADER_PARAMETER_BLOCK LoaderBlock
75 );
76
77 VOID
78 NTAPI
79 KdUpdateDataBlock(
80 VOID
81 );
82
83 //
84 // Determines if the kernel debugger must handle a particular trap
85 //
86 BOOLEAN
87 NTAPI
88 KdIsThisAKdTrap(
89 IN PEXCEPTION_RECORD ExceptionRecord,
90 IN PCONTEXT Context,
91 IN KPROCESSOR_MODE PreviousMode
92 );
93
94 //
95 // Multi-Processor Switch Support
96 //
97 BOOLEAN
98 NTAPI
99 KdpSwitchProcessor(
100 IN PEXCEPTION_RECORD ExceptionRecord,
101 IN OUT PCONTEXT ContextRecord,
102 IN BOOLEAN SecondChanceException
103 );
104
105 //
106 // Time Slip Support
107 //
108 VOID
109 NTAPI
110 KdpTimeSlipWork(
111 IN PVOID Context
112 );
113
114 VOID
115 NTAPI
116 KdpTimeSlipDpcRoutine(
117 IN PKDPC Dpc,
118 IN PVOID DeferredContext,
119 IN PVOID SystemArgument1,
120 IN PVOID SystemArgument2
121 );
122
123 //
124 // Debug Trap Handlers
125 //
126 BOOLEAN
127 NTAPI
128 KdpStub(
129 IN PKTRAP_FRAME TrapFrame,
130 IN PKEXCEPTION_FRAME ExceptionFrame,
131 IN PEXCEPTION_RECORD ExceptionRecord,
132 IN PCONTEXT ContextRecord,
133 IN KPROCESSOR_MODE PreviousMode,
134 IN BOOLEAN SecondChanceException
135 );
136
137 BOOLEAN
138 NTAPI
139 KdpTrap(
140 IN PKTRAP_FRAME TrapFrame,
141 IN PKEXCEPTION_FRAME ExceptionFrame,
142 IN PEXCEPTION_RECORD ExceptionRecord,
143 IN PCONTEXT ContextRecord,
144 IN KPROCESSOR_MODE PreviousMode,
145 IN BOOLEAN SecondChanceException
146 );
147
148 //
149 // Port Locking
150 //
151 VOID
152 NTAPI
153 KdpPortLock(
154 VOID
155 );
156
157 VOID
158 NTAPI
159 KdpPortUnlock(
160 VOID
161 );
162
163 BOOLEAN
164 NTAPI
165 KdpPollBreakInWithPortLock(
166 VOID
167 );
168
169 //
170 // Debugger Enter, Exit, Enable and Disable
171 //
172 BOOLEAN
173 NTAPI
174 KdEnterDebugger(
175 IN PKTRAP_FRAME TrapFrame,
176 IN PKEXCEPTION_FRAME ExceptionFrame
177 );
178
179 VOID
180 NTAPI
181 KdExitDebugger(
182 IN BOOLEAN Entered
183 );
184
185 NTSTATUS
186 NTAPI
187 KdEnableDebuggerWithLock(
188 IN BOOLEAN NeedLock
189 );
190
191 NTSTATUS
192 NTAPI
193 KdDisableDebuggerWithLock(
194 IN BOOLEAN NeedLock
195 );
196
197 //
198 // Debug Event Handlers
199 //
200 NTSTATUS
201 NTAPI
202 KdpPrint(
203 IN ULONG ComponentId,
204 IN ULONG Level,
205 IN LPSTR String,
206 IN USHORT Length,
207 IN KPROCESSOR_MODE PreviousMode,
208 IN PKTRAP_FRAME TrapFrame,
209 IN PKEXCEPTION_FRAME ExceptionFrame,
210 OUT PBOOLEAN Status
211 );
212
213 USHORT
214 NTAPI
215 KdpPrompt(
216 IN LPSTR PromptString,
217 IN USHORT PromptLength,
218 OUT LPSTR ResponseString,
219 IN USHORT MaximumResponseLength,
220 IN KPROCESSOR_MODE PreviousMode,
221 IN PKTRAP_FRAME TrapFrame,
222 IN PKEXCEPTION_FRAME ExceptionFrame
223 );
224
225 VOID
226 NTAPI
227 KdpSymbol(
228 IN PSTRING DllPath,
229 IN PKD_SYMBOLS_INFO SymbolInfo,
230 IN BOOLEAN Unload,
231 IN KPROCESSOR_MODE PreviousMode,
232 IN PCONTEXT ContextRecord,
233 IN PKTRAP_FRAME TrapFrame,
234 IN PKEXCEPTION_FRAME ExceptionFrame
235 );
236
237 VOID
238 NTAPI
239 KdpCommandString(
240 IN PSTRING NameString,
241 IN PSTRING CommandString,
242 IN KPROCESSOR_MODE PreviousMode,
243 IN PCONTEXT ContextRecord,
244 IN PKTRAP_FRAME TrapFrame,
245 IN PKEXCEPTION_FRAME ExceptionFrame
246 );
247
248 //
249 // State Change Notifications
250 //
251 VOID
252 NTAPI
253 KdpReportLoadSymbolsStateChange(
254 IN PSTRING PathName,
255 IN PKD_SYMBOLS_INFO SymbolInfo,
256 IN BOOLEAN Unload,
257 IN OUT PCONTEXT Context
258 );
259
260 VOID
261 NTAPI
262 KdpReportCommandStringStateChange(
263 IN PSTRING NameString,
264 IN PSTRING CommandString,
265 IN OUT PCONTEXT Context
266 );
267
268 BOOLEAN
269 NTAPI
270 KdpReportExceptionStateChange(
271 IN PEXCEPTION_RECORD ExceptionRecord,
272 IN OUT PCONTEXT Context,
273 IN BOOLEAN SecondChanceException
274 );
275
276 //
277 // Breakpoint Support
278 //
279 ULONG
280 NTAPI
281 KdpAddBreakpoint(
282 IN PVOID Address
283 );
284
285 BOOLEAN
286 NTAPI
287 KdpDeleteBreakpoint(
288 IN ULONG BpEntry
289 );
290
291 BOOLEAN
292 NTAPI
293 KdpDeleteBreakpointRange(
294 IN PVOID Base,
295 IN PVOID Limit
296 );
297
298 VOID
299 NTAPI
300 KdpSuspendBreakPoint(
301 IN ULONG BpEntry
302 );
303
304 VOID
305 NTAPI
306 KdpRestoreAllBreakpoints(
307 VOID
308 );
309
310 VOID
311 NTAPI
312 KdpSuspendAllBreakPoints(
313 VOID
314 );
315
316 //
317 // Safe memory read & write Support
318 //
319 NTSTATUS
320 NTAPI
321 KdpCopyMemoryChunks(
322 IN ULONG64 Address,
323 IN PVOID Buffer,
324 IN ULONG TotalSize,
325 IN ULONG ChunkSize,
326 IN ULONG Flags,
327 OUT PULONG ActualSize OPTIONAL
328 );
329
330 //
331 // Low Level Support Routines for the KD API
332 //
333
334 //
335 // Version
336 //
337 VOID
338 NTAPI
339 KdpSysGetVersion(
340 IN PDBGKD_GET_VERSION64 Version
341 );
342
343 //
344 // Context
345 //
346 VOID
347 NTAPI
348 KdpGetStateChange(
349 IN PDBGKD_MANIPULATE_STATE64 State,
350 IN PCONTEXT Context
351 );
352
353 VOID
354 NTAPI
355 KdpSetContextState(
356 IN PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange,
357 IN PCONTEXT Context
358 );
359
360 //
361 // MSR
362 //
363 NTSTATUS
364 NTAPI
365 KdpSysReadMsr(
366 IN ULONG Msr,
367 OUT PLARGE_INTEGER MsrValue
368 );
369
370 NTSTATUS
371 NTAPI
372 KdpSysWriteMsr(
373 IN ULONG Msr,
374 IN PLARGE_INTEGER MsrValue
375 );
376
377 //
378 // Bus
379 //
380 NTSTATUS
381 NTAPI
382 KdpSysReadBusData(
383 IN ULONG BusDataType,
384 IN ULONG BusNumber,
385 IN ULONG SlotNumber,
386 IN ULONG Offset,
387 IN PVOID Buffer,
388 IN ULONG Length,
389 OUT PULONG ActualLength
390 );
391
392 NTSTATUS
393 NTAPI
394 KdpSysWriteBusData(
395 IN ULONG BusDataType,
396 IN ULONG BusNumber,
397 IN ULONG SlotNumber,
398 IN ULONG Offset,
399 IN PVOID Buffer,
400 IN ULONG Length,
401 OUT PULONG ActualLength
402 );
403
404 //
405 // Control Space
406 //
407 NTSTATUS
408 NTAPI
409 KdpSysReadControlSpace(
410 IN ULONG Processor,
411 IN ULONG64 BaseAddress,
412 IN PVOID Buffer,
413 IN ULONG Length,
414 OUT PULONG ActualLength
415 );
416
417 NTSTATUS
418 NTAPI
419 KdpSysWriteControlSpace(
420 IN ULONG Processor,
421 IN ULONG64 BaseAddress,
422 IN PVOID Buffer,
423 IN ULONG Length,
424 OUT PULONG ActualLength
425 );
426
427 //
428 // I/O Space
429 //
430 NTSTATUS
431 NTAPI
432 KdpSysReadIoSpace(
433 IN ULONG InterfaceType,
434 IN ULONG BusNumber,
435 IN ULONG AddressSpace,
436 IN ULONG64 IoAddress,
437 IN PVOID DataValue,
438 IN ULONG DataSize,
439 OUT PULONG ActualDataSize
440 );
441
442 NTSTATUS
443 NTAPI
444 KdpSysWriteIoSpace(
445 IN ULONG InterfaceType,
446 IN ULONG BusNumber,
447 IN ULONG AddressSpace,
448 IN ULONG64 IoAddress,
449 IN PVOID DataValue,
450 IN ULONG DataSize,
451 OUT PULONG ActualDataSize
452 );
453
454 //
455 // Low Memory
456 //
457 NTSTATUS
458 NTAPI
459 KdpSysCheckLowMemory(
460 IN ULONG Flags
461 );
462
463 //
464 // Internal routine for sending strings directly to the debugger
465 //
466 VOID
467 __cdecl
468 KdpDprintf(
469 IN PCHAR Format,
470 ...
471 );
472
473 //
474 // Global KD Data
475 //
476 extern DBGKD_GET_VERSION64 KdVersionBlock;
477 extern KDDEBUGGER_DATA64 KdDebuggerDataBlock;
478 extern LIST_ENTRY KdpDebuggerDataListHead;
479 extern KSPIN_LOCK KdpDataSpinLock;
480 extern LARGE_INTEGER KdPerformanceCounterRate;
481 extern LARGE_INTEGER KdTimerStart;
482 extern ULONG KdDisableCount;
483 extern KD_CONTEXT KdpContext;
484 extern PKDEBUG_ROUTINE KiDebugRoutine;
485 extern PKDEBUG_SWITCH_ROUTINE KiDebugSwitchRoutine;
486 extern BOOLEAN KdBreakAfterSymbolLoad;
487 extern BOOLEAN KdPitchDebugger;
488 extern BOOLEAN _KdDebuggerNotPresent;
489 extern BOOLEAN _KdDebuggerEnabled;
490 extern BOOLEAN KdAutoEnableOnEvent;
491 extern BOOLEAN KdBlockEnable;
492 extern BOOLEAN KdIgnoreUmExceptions;
493 extern BOOLEAN KdPreviouslyEnabled;
494 extern BOOLEAN KdpDebuggerStructuresInitialized;
495 extern BOOLEAN KdEnteredDebugger;
496 extern KDPC KdpTimeSlipDpc;
497 extern KTIMER KdpTimeSlipTimer;
498 extern WORK_QUEUE_ITEM KdpTimeSlipWorkItem;
499 extern LONG KdpTimeSlipPending;
500 extern PKEVENT KdpTimeSlipEvent;
501 extern KSPIN_LOCK KdpTimeSlipEventLock;
502 extern BOOLEAN KdpPortLocked;
503 extern BOOLEAN KdpControlCPressed;
504 extern BOOLEAN KdpContextSent;
505 extern KSPIN_LOCK KdpDebuggerLock;
506 extern LARGE_INTEGER KdTimerStop, KdTimerStart, KdTimerDifference;
507 extern ULONG KdComponentTableSize;
508 extern ULONG Kd_WIN2000_Mask;
509 extern PULONG KdComponentTable[104];
510 extern CHAR KdpMessageBuffer[0x1000], KdpPathBuffer[0x1000];
511 extern CHAR KdPrintDefaultCircularBuffer[KD_DEFAULT_LOG_BUFFER_SIZE];
512 extern BREAKPOINT_ENTRY KdpBreakpointTable[KD_BREAKPOINT_MAX];
513 extern KD_BREAKPOINT_TYPE KdpBreakpointInstruction;
514 extern BOOLEAN KdpOweBreakpoint;
515 extern BOOLEAN BreakpointsSuspended;
516 extern ULONG KdpNumInternalBreakpoints;
517 extern ULONG KdpCurrentSymbolStart, KdpCurrentSymbolEnd;
518 extern ULONG TraceDataBuffer[40];
519 extern ULONG TraceDataBufferPosition;