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