[NTOSKRNL]
[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 Enable
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 Handled
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 // Routine to determine if it is safe to disable the debugger
318 //
319 NTSTATUS
320 NTAPI
321 KdpAllowDisable(
322 VOID
323 );
324
325 //
326 // Safe memory read & write Support
327 //
328 NTSTATUS
329 NTAPI
330 KdpCopyMemoryChunks(
331 IN ULONG64 Address,
332 IN PVOID Buffer,
333 IN ULONG TotalSize,
334 IN ULONG ChunkSize,
335 IN ULONG Flags,
336 OUT PULONG ActualSize OPTIONAL
337 );
338
339 //
340 // Low Level Support Routines for the KD API
341 //
342
343 //
344 // Version
345 //
346 VOID
347 NTAPI
348 KdpSysGetVersion(
349 IN PDBGKD_GET_VERSION64 Version
350 );
351
352 //
353 // Context
354 //
355 VOID
356 NTAPI
357 KdpGetStateChange(
358 IN PDBGKD_MANIPULATE_STATE64 State,
359 IN PCONTEXT Context
360 );
361
362 VOID
363 NTAPI
364 KdpSetContextState(
365 IN PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange,
366 IN PCONTEXT Context
367 );
368
369 //
370 // MSR
371 //
372 NTSTATUS
373 NTAPI
374 KdpSysReadMsr(
375 IN ULONG Msr,
376 OUT PLARGE_INTEGER MsrValue
377 );
378
379 NTSTATUS
380 NTAPI
381 KdpSysWriteMsr(
382 IN ULONG Msr,
383 IN PLARGE_INTEGER MsrValue
384 );
385
386 //
387 // Bus
388 //
389 NTSTATUS
390 NTAPI
391 KdpSysReadBusData(
392 IN ULONG BusDataType,
393 IN ULONG BusNumber,
394 IN ULONG SlotNumber,
395 IN ULONG Offset,
396 IN PVOID Buffer,
397 IN ULONG Length,
398 OUT PULONG ActualLength
399 );
400
401 NTSTATUS
402 NTAPI
403 KdpSysWriteBusData(
404 IN ULONG BusDataType,
405 IN ULONG BusNumber,
406 IN ULONG SlotNumber,
407 IN ULONG Offset,
408 IN PVOID Buffer,
409 IN ULONG Length,
410 OUT PULONG ActualLength
411 );
412
413 //
414 // Control Space
415 //
416 NTSTATUS
417 NTAPI
418 KdpSysReadControlSpace(
419 IN ULONG Processor,
420 IN ULONG64 BaseAddress,
421 IN PVOID Buffer,
422 IN ULONG Length,
423 OUT PULONG ActualLength
424 );
425
426 NTSTATUS
427 NTAPI
428 KdpSysWriteControlSpace(
429 IN ULONG Processor,
430 IN ULONG64 BaseAddress,
431 IN PVOID Buffer,
432 IN ULONG Length,
433 OUT PULONG ActualLength
434 );
435
436 //
437 // I/O Space
438 //
439 NTSTATUS
440 NTAPI
441 KdpSysReadIoSpace(
442 IN ULONG InterfaceType,
443 IN ULONG BusNumber,
444 IN ULONG AddressSpace,
445 IN ULONG64 IoAddress,
446 IN PVOID DataValue,
447 IN ULONG DataSize,
448 OUT PULONG ActualDataSize
449 );
450
451 NTSTATUS
452 NTAPI
453 KdpSysWriteIoSpace(
454 IN ULONG InterfaceType,
455 IN ULONG BusNumber,
456 IN ULONG AddressSpace,
457 IN ULONG64 IoAddress,
458 IN PVOID DataValue,
459 IN ULONG DataSize,
460 OUT PULONG ActualDataSize
461 );
462
463 //
464 // Low Memory
465 //
466 NTSTATUS
467 NTAPI
468 KdpSysCheckLowMemory(
469 IN ULONG Flags
470 );
471
472 //
473 // Internal routine for sending strings directly to the debugger
474 //
475 VOID
476 __cdecl
477 KdpDprintf(
478 IN PCHAR Format,
479 ...
480 );
481
482 //
483 // Global KD Data
484 //
485 extern DBGKD_GET_VERSION64 KdVersionBlock;
486 extern KDDEBUGGER_DATA64 KdDebuggerDataBlock;
487 extern LIST_ENTRY KdpDebuggerDataListHead;
488 extern KSPIN_LOCK KdpDataSpinLock;
489 extern LARGE_INTEGER KdPerformanceCounterRate;
490 extern LARGE_INTEGER KdTimerStart;
491 extern ULONG KdDisableCount;
492 extern KD_CONTEXT KdpContext;
493 extern PKDEBUG_ROUTINE KiDebugRoutine;
494 extern PKDEBUG_SWITCH_ROUTINE KiDebugSwitchRoutine;
495 extern BOOLEAN KdBreakAfterSymbolLoad;
496 extern BOOLEAN KdPitchDebugger;
497 extern BOOLEAN _KdDebuggerNotPresent;
498 extern BOOLEAN _KdDebuggerEnabled;
499 extern BOOLEAN KdAutoEnableOnEvent;
500 extern BOOLEAN KdBlockEnable;
501 extern BOOLEAN KdIgnoreUmExceptions;
502 extern BOOLEAN KdPreviouslyEnabled;
503 extern BOOLEAN KdpDebuggerStructuresInitialized;
504 extern BOOLEAN KdEnteredDebugger;
505 extern KDPC KdpTimeSlipDpc;
506 extern KTIMER KdpTimeSlipTimer;
507 extern WORK_QUEUE_ITEM KdpTimeSlipWorkItem;
508 extern LONG KdpTimeSlipPending;
509 extern PKEVENT KdpTimeSlipEvent;
510 extern KSPIN_LOCK KdpTimeSlipEventLock;
511 extern BOOLEAN KdpPortLocked;
512 extern BOOLEAN KdpControlCPressed;
513 extern BOOLEAN KdpContextSent;
514 extern KSPIN_LOCK KdpDebuggerLock;
515 extern LARGE_INTEGER KdTimerStop, KdTimerStart, KdTimerDifference;
516 extern ULONG KdComponentTableSize;
517 extern ULONG Kd_WIN2000_Mask;
518 extern PULONG KdComponentTable[104];
519 extern CHAR KdpMessageBuffer[0x1000], KdpPathBuffer[0x1000];
520 extern CHAR KdPrintDefaultCircularBuffer[KD_DEFAULT_LOG_BUFFER_SIZE];
521 extern BREAKPOINT_ENTRY KdpBreakpointTable[KD_BREAKPOINT_MAX];
522 extern KD_BREAKPOINT_TYPE KdpBreakpointInstruction;
523 extern BOOLEAN KdpOweBreakpoint;
524 extern BOOLEAN BreakpointsSuspended;
525 extern ULONG KdpNumInternalBreakpoints;
526 extern ULONG KdpCurrentSymbolStart, KdpCurrentSymbolEnd;
527 extern ULONG TraceDataBuffer[40];
528 extern ULONG TraceDataBufferPosition;