2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/kd64/kddata.c
5 * PURPOSE: Contains all global variables and settings for KD64
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
9 /* INCLUDES ******************************************************************/
14 #include "../mm/ARM3/miarm.h"
15 #undef MmSystemRangeStart
17 VOID NTAPI
RtlpBreakWithStatusInstruction(VOID
);
20 // Apply the KIPCR WDK workaround for x86 and AMD64
22 #if defined(_X86_) || defined(_AMD64_)
28 #define KPCR_SELF_PCR_OFFSET FIELD_OFFSET(KPCR, Self)
29 #define KPCR_CURRENT_PRCB_OFFSET FIELD_OFFSET(KPCR, Prcb)
30 #define KPCR_CONTAINED_PRCB_OFFSET FIELD_OFFSET(KPCR, PrcbData)
31 #define KPCR_INITIAL_STACK_OFFSET 0
32 #define KPCR_STACK_LIMIT_OFFSET 0
33 #define KPRCB_PCR_PAGE_OFFSET 0
34 #define CBSTACK_FRAME_POINTER Ebp
36 #elif defined(_AMD64_)
38 #define KPCR_SELF_PCR_OFFSET FIELD_OFFSET(KPCR, Self)
39 #define KPCR_CURRENT_PRCB_OFFSET FIELD_OFFSET(KPCR, CurrentPrcb)
40 #define KPCR_CONTAINED_PRCB_OFFSET FIELD_OFFSET(KPCR, Prcb)
41 #define KPCR_INITIAL_STACK_OFFSET 0
42 #define KPCR_STACK_LIMIT_OFFSET 0
43 #define KPRCB_PCR_PAGE_OFFSET 0
44 #define CBSTACK_FRAME_POINTER Rbp
48 #define KPCR_SELF_PCR_OFFSET 0
49 #define KPCR_CURRENT_PRCB_OFFSET FIELD_OFFSET(KPCR, Prcb)
50 #define KPCR_CONTAINED_PRCB_OFFSET 0
51 #define KPCR_INITIAL_STACK_OFFSET FIELD_OFFSET(KPCR, InitialStack)
52 #define KPCR_STACK_LIMIT_OFFSET FIELD_OFFSET(KPCR, StackLimit)
53 #define KPRCB_PCR_PAGE_OFFSET FIELD_OFFSET(KPRCB, PcrPage)
54 #define CBSTACK_FRAME_POINTER DummyFramePointer
57 #error Unsupported Architecture
60 /* GLOBALS *******************************************************************/
65 KD_CONTEXT KdpContext
;
66 BOOLEAN KdpPortLocked
;
67 KSPIN_LOCK KdpDebuggerLock
;
68 BOOLEAN KdpControlCPressed
;
69 BOOLEAN KdpContextSent
;
72 // Debug Trap Handlers
74 PKDEBUG_ROUTINE KiDebugRoutine
= KdpStub
;
75 PKDEBUG_SWITCH_ROUTINE KiDebugSwitchRoutine
;
78 // Debugger Configuration Settings
80 BOOLEAN KdBreakAfterSymbolLoad
;
81 BOOLEAN KdPitchDebugger
;
82 BOOLEAN _KdDebuggerNotPresent
;
83 BOOLEAN _KdDebuggerEnabled
;
84 BOOLEAN KdAutoEnableOnEvent
;
85 BOOLEAN KdBlockEnable
;
86 BOOLEAN KdIgnoreUmExceptions
;
87 BOOLEAN KdPreviouslyEnabled
;
88 BOOLEAN KdpDebuggerStructuresInitialized
;
89 BOOLEAN KdEnteredDebugger
;
91 LARGE_INTEGER KdPerformanceCounterRate
;
96 BREAKPOINT_ENTRY KdpBreakpointTable
[KD_BREAKPOINT_MAX
];
97 KD_BREAKPOINT_TYPE KdpBreakpointInstruction
= KD_BREAKPOINT_VALUE
;
98 BOOLEAN KdpOweBreakpoint
;
99 BOOLEAN BreakpointsSuspended
;
100 ULONG KdpNumInternalBreakpoints
;
105 ULONG_PTR KdpCurrentSymbolStart
, KdpCurrentSymbolEnd
;
110 ULONG TraceDataBuffer
[40];
111 ULONG TraceDataBufferPosition
= 1;
117 KTIMER KdpTimeSlipTimer
;
118 WORK_QUEUE_ITEM KdpTimeSlipWorkItem
;
119 LONG KdpTimeSlipPending
= 1;
120 PKEVENT KdpTimeSlipEvent
;
121 KSPIN_LOCK KdpTimeSlipEventLock
;
122 LARGE_INTEGER KdTimerStop
, KdTimerStart
, KdTimerDifference
;
127 CHAR KdpMessageBuffer
[0x1000];
128 CHAR KdpPathBuffer
[0x1000];
133 CHAR KdPrintDefaultCircularBuffer
[KD_DEFAULT_LOG_BUFFER_SIZE
];
134 PCHAR KdPrintWritePointer
= KdPrintDefaultCircularBuffer
;
135 ULONG KdPrintRolloverCount
;
136 PCHAR KdPrintCircularBuffer
= KdPrintDefaultCircularBuffer
;
137 ULONG KdPrintBufferSize
= sizeof(KdPrintDefaultCircularBuffer
);
138 ULONG KdPrintBufferChanges
= 0;
141 // Debug Filter Masks
143 ULONG Kd_WIN2000_Mask
= 1;
144 ULONG Kd_SYSTEM_Mask
;
149 ULONG Kd_CRASHDUMP_Mask
;
150 ULONG Kd_CDAUDIO_Mask
;
152 ULONG Kd_CLASSPNP_Mask
;
154 ULONG Kd_REDBOOK_Mask
;
155 ULONG Kd_STORPROP_Mask
;
156 ULONG Kd_SCSIPORT_Mask
;
157 ULONG Kd_SCSIMINIPORT_Mask
;
158 ULONG Kd_CONFIG_Mask
;
159 ULONG Kd_I8042PRT_Mask
;
160 ULONG Kd_SERMOUSE_Mask
;
161 ULONG Kd_LSERMOUS_Mask
;
162 ULONG Kd_KBDHID_Mask
;
163 ULONG Kd_MOUHID_Mask
;
164 ULONG Kd_KBDCLASS_Mask
;
165 ULONG Kd_MOUCLASS_Mask
;
166 ULONG Kd_TWOTRACK_Mask
;
167 ULONG Kd_WMILIB_Mask
;
170 ULONG Kd_HALIA64_Mask
;
172 ULONG Kd_SVCHOST_Mask
;
173 ULONG Kd_VIDEOPRT_Mask
;
175 ULONG Kd_DMSYNTH_Mask
;
176 ULONG Kd_NTOSPNP_Mask
;
177 ULONG Kd_FASTFAT_Mask
;
179 ULONG Kd_PNPMGR_Mask
;
180 ULONG Kd_NETAPI_Mask
;
181 ULONG Kd_SCSERVER_Mask
;
182 ULONG Kd_SCCLIENT_Mask
;
183 ULONG Kd_SERIAL_Mask
;
184 ULONG Kd_SERENUM_Mask
;
186 ULONG Kd_RPCPROXY_Mask
;
187 ULONG Kd_AUTOCHK_Mask
;
188 ULONG Kd_DCOMSS_Mask
;
189 ULONG Kd_UNIMODEM_Mask
;
191 ULONG Kd_FLTMGR_Mask
;
192 ULONG Kd_WMICORE_Mask
;
193 ULONG Kd_BURNENG_Mask
;
196 ULONG Kd_FUSION_Mask
;
197 ULONG Kd_IDLETASK_Mask
;
198 ULONG Kd_SOFTPCI_Mask
;
202 ULONG Kd_PCIIDE_Mask
;
203 ULONG Kd_FLOPPY_Mask
;
205 ULONG Kd_TERMSRV_Mask
;
206 ULONG Kd_W32TIME_Mask
;
207 ULONG Kd_PREFETCHER_Mask
;
208 ULONG Kd_RSFILTER_Mask
;
209 ULONG Kd_FCPORT_Mask
;
212 ULONG Kd_DMCONFIG_Mask
;
213 ULONG Kd_DMADMIN_Mask
;
214 ULONG Kd_WSOCKTRANSPORT_Mask
;
216 ULONG Kd_PNPMEM_Mask
;
217 ULONG Kd_PROCESSOR_Mask
;
218 ULONG Kd_DMSERVER_Mask
;
220 ULONG Kd_INFINIBAND_Mask
;
221 ULONG Kd_IHVDRIVER_Mask
;
222 ULONG Kd_IHVVIDEO_Mask
;
223 ULONG Kd_IHVAUDIO_Mask
;
224 ULONG Kd_IHVNETWORK_Mask
;
225 ULONG Kd_IHVSTREAMING_Mask
;
226 ULONG Kd_IHVBUS_Mask
;
228 ULONG Kd_RTLTHREADPOOL_Mask
;
230 ULONG Kd_TCPIP6_Mask
;
231 ULONG Kd_ISAPNP_Mask
;
233 ULONG Kd_STORPORT_Mask
;
234 ULONG Kd_STORMINIPORT_Mask
;
235 ULONG Kd_PRINTSPOOLER_Mask
;
236 ULONG Kd_VSSDYNDISK_Mask
;
237 ULONG Kd_VERIFIER_Mask
;
239 ULONG Kd_VDSBAS_Mask
;
240 ULONG Kd_VDSDYNDR_Mask
;
241 ULONG Kd_VDSUTIL_Mask
;
242 ULONG Kd_DFRGIFC_Mask
;
243 ULONG Kd_DEFAULT_Mask
;
247 ULONG Kd_ENDOFTABLE_Mask
;
250 // Debug Filter Component Table
252 PULONG KdComponentTable
[104] =
267 &Kd_SCSIMINIPORT_Mask
,
324 &Kd_WSOCKTRANSPORT_Mask
,
335 &Kd_IHVSTREAMING_Mask
,
338 &Kd_RTLTHREADPOOL_Mask
,
344 &Kd_STORMINIPORT_Mask
,
345 &Kd_PRINTSPOOLER_Mask
,
360 ULONG KdComponentTableSize
= sizeof(KdComponentTable
) / sizeof(KdComponentTable
[0]);
365 LIST_ENTRY KdpDebuggerDataListHead
;
366 KSPIN_LOCK KdpDataSpinLock
;
369 // Debugger Version and Data Block
371 DBGKD_GET_VERSION64 KdVersionBlock
=
375 DBGKD_64BIT_PROTOCOL_VERSION2
,
376 CURRENT_KD_SECONDARY_VERSION
,
378 DBGKD_VERS_FLAG_DATA
| DBGKD_VERS_FLAG_PTR64
,
380 DBGKD_VERS_FLAG_DATA
,
382 IMAGE_FILE_MACHINE_NATIVE
,
386 DBGKD_SIMULATION_NONE
,
392 KDDEBUGGER_DATA64 KdDebuggerDataBlock
=
396 {(ULONG_PTR
)RtlpBreakWithStatusInstruction
},
398 FIELD_OFFSET(KTHREAD
, CallbackStack
),
399 FIELD_OFFSET(KCALLOUT_FRAME
, CallbackStack
),
400 FIELD_OFFSET(KCALLOUT_FRAME
, CBSTACK_FRAME_POINTER
),
402 {(ULONG_PTR
)KiCallUserMode
},
404 {(ULONG_PTR
)&PsLoadedModuleList
},
405 {(ULONG_PTR
)&PsActiveProcessHead
},
406 {(ULONG_PTR
)&PspCidTable
},
407 {(ULONG_PTR
)&ExpSystemResourcesList
},
408 {(ULONG_PTR
)ExpPagedPoolDescriptor
},
409 {(ULONG_PTR
)&ExpNumberOfPagedPools
},
410 {(ULONG_PTR
)&KeTimeIncrement
},
411 {(ULONG_PTR
)&KeBugcheckCallbackListHead
},
412 {(ULONG_PTR
)KiBugCheckData
},
413 {(ULONG_PTR
)&IopErrorLogListHead
},
414 {(ULONG_PTR
)&ObpRootDirectoryObject
},
415 {(ULONG_PTR
)&ObpTypeObjectType
},
416 {(ULONG_PTR
)&MmSystemCacheStart
},
417 {(ULONG_PTR
)&MmSystemCacheEnd
},
418 {(ULONG_PTR
)&MmSystemCacheWs
},
419 {(ULONG_PTR
)&MmPfnDatabase
},
420 {(ULONG_PTR
)MmSystemPtesStart
},
421 {(ULONG_PTR
)MmSystemPtesEnd
},
422 {(ULONG_PTR
)&MmSubsectionBase
},
423 {(ULONG_PTR
)&MmNumberOfPagingFiles
},
424 {(ULONG_PTR
)&MmLowestPhysicalPage
},
425 {(ULONG_PTR
)&MmHighestPhysicalPage
},
426 {(ULONG_PTR
)&MmNumberOfPhysicalPages
},
427 {(ULONG_PTR
)&MmMaximumNonPagedPoolInBytes
},
428 {(ULONG_PTR
)&MmNonPagedSystemStart
},
429 {(ULONG_PTR
)&MmNonPagedPoolStart
},
430 {(ULONG_PTR
)&MmNonPagedPoolEnd
},
431 {(ULONG_PTR
)&MmPagedPoolStart
},
432 {(ULONG_PTR
)&MmPagedPoolEnd
},
433 {(ULONG_PTR
)&MmPagedPoolInfo
},
435 {(ULONG_PTR
)&MmSizeOfPagedPoolInBytes
},
436 {(ULONG_PTR
)&MmTotalCommitLimit
},
437 {(ULONG_PTR
)&MmTotalCommittedPages
},
438 {(ULONG_PTR
)&MmSharedCommit
},
439 {(ULONG_PTR
)&MmDriverCommit
},
440 {(ULONG_PTR
)&MmProcessCommit
},
441 {(ULONG_PTR
)&MmPagedPoolCommit
},
443 {(ULONG_PTR
)&MmZeroedPageListHead
},
444 {(ULONG_PTR
)&MmFreePageListHead
},
445 {(ULONG_PTR
)&MmStandbyPageListHead
},
446 {(ULONG_PTR
)&MmModifiedPageListHead
},
447 {(ULONG_PTR
)&MmModifiedNoWritePageListHead
},
448 {(ULONG_PTR
)&MmAvailablePages
},
449 {(ULONG_PTR
)&MmResidentAvailablePages
},
450 {(ULONG_PTR
)&PoolTrackTable
},
451 {(ULONG_PTR
)&NonPagedPoolDescriptor
},
452 {(ULONG_PTR
)&MmHighestUserAddress
},
453 {(ULONG_PTR
)&MmSystemRangeStart
},
454 {(ULONG_PTR
)&MmUserProbeAddress
},
455 {(ULONG_PTR
)KdPrintDefaultCircularBuffer
},
456 {(ULONG_PTR
)KdPrintDefaultCircularBuffer
+ 1},
457 {(ULONG_PTR
)&KdPrintWritePointer
},
458 {(ULONG_PTR
)&KdPrintRolloverCount
},
459 {(ULONG_PTR
)&MmLoadedUserImageList
},
460 {(ULONG_PTR
)&NtBuildLab
},
462 {(ULONG_PTR
)KiProcessorBlock
},
463 {(ULONG_PTR
)&MmUnloadedDrivers
},
464 {(ULONG_PTR
)&MmLastUnloadedDrivers
},
465 {(ULONG_PTR
)&MmTriageActionTaken
},
466 {(ULONG_PTR
)&MmSpecialPoolTag
},
467 {(ULONG_PTR
)&KernelVerifier
},
468 {(ULONG_PTR
)&MmVerifierData
},
469 {(ULONG_PTR
)&MmAllocatedNonPagedPool
},
470 {(ULONG_PTR
)&MmPeakCommitment
},
471 {(ULONG_PTR
)&MmtotalCommitLimitMaximum
},
472 {(ULONG_PTR
)&CmNtCSDVersion
},
473 {(ULONG_PTR
)&MmPhysicalMemoryBlock
},
474 {(ULONG_PTR
)&MmSessionBase
},
475 {(ULONG_PTR
)&MmSessionSize
},
478 FIELD_OFFSET(KTHREAD
, NextProcessor
),
479 FIELD_OFFSET(KTHREAD
, Teb
),
480 FIELD_OFFSET(KTHREAD
, KernelStack
),
481 FIELD_OFFSET(KTHREAD
, InitialStack
),
482 FIELD_OFFSET(KTHREAD
, ApcState
.Process
),
483 FIELD_OFFSET(KTHREAD
, State
),
487 FIELD_OFFSET(EPROCESS
, Peb
),
488 FIELD_OFFSET(EPROCESS
, InheritedFromUniqueProcessId
),
489 FIELD_OFFSET(EPROCESS
, Pcb
.DirectoryTableBase
),
491 FIELD_OFFSET(KPRCB
, DpcRoutineActive
),
492 FIELD_OFFSET(KPRCB
, CurrentThread
),
493 FIELD_OFFSET(KPRCB
, MHz
),
494 FIELD_OFFSET(KPRCB
, CpuType
),
495 FIELD_OFFSET(KPRCB
, VendorString
),
496 FIELD_OFFSET(KPRCB
, ProcessorState
.ContextFrame
),
497 FIELD_OFFSET(KPRCB
, Number
),
499 {(ULONG_PTR
)KdPrintDefaultCircularBuffer
},
500 {(ULONG_PTR
)&KdPrintBufferSize
},
501 {(ULONG_PTR
)&KeLoaderBlock
},
503 KPCR_SELF_PCR_OFFSET
,
504 KPCR_CURRENT_PRCB_OFFSET
,
505 KPCR_CONTAINED_PRCB_OFFSET
,
508 KPCR_INITIAL_STACK_OFFSET
,
509 KPCR_STACK_LIMIT_OFFSET
,
510 KPRCB_PCR_PAGE_OFFSET
,
511 FIELD_OFFSET(KPRCB
, ProcessorState
.SpecialRegisters
),
514 // x86 GDT/LDT/TSS constants
526 #elif defined(_AMD64_)
528 // AMD64 GDT/LDT/TSS constants
542 // No GDT/LDT/TSS on other architectures
555 {(ULONG_PTR
)&IopNumTriageDumpDataBlocks
},
556 {(ULONG_PTR
)IopTriageDumpDataBlocks
},