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"
16 VOID NTAPI
RtlpBreakWithStatusInstruction(VOID
);
19 // Apply the KIPCR WDK workaround for x86 and AMD64
21 #if defined(_X86_) || defined(_AMD64_)
27 #define KPCR_SELF_PCR_OFFSET FIELD_OFFSET(KPCR, Self)
28 #define KPCR_CURRENT_PRCB_OFFSET FIELD_OFFSET(KPCR, Prcb)
29 #define KPCR_CONTAINED_PRCB_OFFSET FIELD_OFFSET(KPCR, PrcbData)
30 #define KPCR_INITIAL_STACK_OFFSET 0
31 #define KPCR_STACK_LIMIT_OFFSET 0
32 #define KPRCB_PCR_PAGE_OFFSET 0
33 #define CBSTACK_FRAME_POINTER Ebp
35 #elif defined(_AMD64_)
37 #define KPCR_SELF_PCR_OFFSET FIELD_OFFSET(KPCR, Self)
38 #define KPCR_CURRENT_PRCB_OFFSET FIELD_OFFSET(KPCR, CurrentPrcb)
39 #define KPCR_CONTAINED_PRCB_OFFSET FIELD_OFFSET(KPCR, Prcb)
40 #define KPCR_INITIAL_STACK_OFFSET 0
41 #define KPCR_STACK_LIMIT_OFFSET 0
42 #define KPRCB_PCR_PAGE_OFFSET 0
43 #define CBSTACK_FRAME_POINTER Rbp
47 #define KPCR_SELF_PCR_OFFSET 0
48 #define KPCR_CURRENT_PRCB_OFFSET FIELD_OFFSET(KPCR, Prcb)
49 #define KPCR_CONTAINED_PRCB_OFFSET 0
50 #define KPCR_INITIAL_STACK_OFFSET FIELD_OFFSET(KPCR, InitialStack)
51 #define KPCR_STACK_LIMIT_OFFSET FIELD_OFFSET(KPCR, StackLimit)
52 #define KPRCB_PCR_PAGE_OFFSET FIELD_OFFSET(KPRCB, PcrPage)
53 #define CBSTACK_FRAME_POINTER DummyFramePointer
56 #error Unsupported Architecture
59 /* GLOBALS *******************************************************************/
64 KD_CONTEXT KdpContext
;
65 BOOLEAN KdpPortLocked
;
66 KSPIN_LOCK KdpDebuggerLock
;
67 BOOLEAN KdpControlCPressed
;
68 BOOLEAN KdpContextSent
;
71 // Debug Trap Handlers
73 PKDEBUG_ROUTINE KiDebugRoutine
= KdpStub
;
74 PKDEBUG_SWITCH_ROUTINE KiDebugSwitchRoutine
;
77 // Debugger Configuration Settings
79 BOOLEAN KdBreakAfterSymbolLoad
;
80 BOOLEAN KdPitchDebugger
;
81 BOOLEAN _KdDebuggerNotPresent
;
82 BOOLEAN _KdDebuggerEnabled
;
83 BOOLEAN KdAutoEnableOnEvent
;
84 BOOLEAN KdBlockEnable
;
85 BOOLEAN KdIgnoreUmExceptions
;
86 BOOLEAN KdPreviouslyEnabled
;
87 BOOLEAN KdpDebuggerStructuresInitialized
;
88 BOOLEAN KdEnteredDebugger
;
90 LARGE_INTEGER KdPerformanceCounterRate
;
95 BREAKPOINT_ENTRY KdpBreakpointTable
[KD_BREAKPOINT_MAX
];
96 KD_BREAKPOINT_TYPE KdpBreakpointInstruction
= KD_BREAKPOINT_VALUE
;
97 BOOLEAN KdpOweBreakpoint
;
98 BOOLEAN BreakpointsSuspended
;
99 ULONG KdpNumInternalBreakpoints
;
104 ULONG_PTR KdpCurrentSymbolStart
, KdpCurrentSymbolEnd
;
109 ULONG TraceDataBuffer
[40];
110 ULONG TraceDataBufferPosition
= 1;
116 KTIMER KdpTimeSlipTimer
;
117 WORK_QUEUE_ITEM KdpTimeSlipWorkItem
;
118 LONG KdpTimeSlipPending
= 1;
119 PKEVENT KdpTimeSlipEvent
;
120 KSPIN_LOCK KdpTimeSlipEventLock
;
121 LARGE_INTEGER KdTimerStop
, KdTimerStart
, KdTimerDifference
;
126 CHAR KdpMessageBuffer
[0x1000];
127 CHAR KdpPathBuffer
[0x1000];
132 CHAR KdPrintDefaultCircularBuffer
[KD_DEFAULT_LOG_BUFFER_SIZE
];
133 PCHAR KdPrintWritePointer
= KdPrintDefaultCircularBuffer
;
134 ULONG KdPrintRolloverCount
;
135 PCHAR KdPrintCircularBuffer
= KdPrintDefaultCircularBuffer
;
136 ULONG KdPrintBufferSize
= sizeof(KdPrintDefaultCircularBuffer
);
137 ULONG KdPrintBufferChanges
= 0;
140 // Debug Filter Masks
142 ULONG Kd_WIN2000_Mask
= 1;
143 ULONG Kd_SYSTEM_Mask
;
148 ULONG Kd_CRASHDUMP_Mask
;
149 ULONG Kd_CDAUDIO_Mask
;
151 ULONG Kd_CLASSPNP_Mask
;
153 ULONG Kd_REDBOOK_Mask
;
154 ULONG Kd_STORPROP_Mask
;
155 ULONG Kd_SCSIPORT_Mask
;
156 ULONG Kd_SCSIMINIPORT_Mask
;
157 ULONG Kd_CONFIG_Mask
;
158 ULONG Kd_I8042PRT_Mask
;
159 ULONG Kd_SERMOUSE_Mask
;
160 ULONG Kd_LSERMOUS_Mask
;
161 ULONG Kd_KBDHID_Mask
;
162 ULONG Kd_MOUHID_Mask
;
163 ULONG Kd_KBDCLASS_Mask
;
164 ULONG Kd_MOUCLASS_Mask
;
165 ULONG Kd_TWOTRACK_Mask
;
166 ULONG Kd_WMILIB_Mask
;
169 ULONG Kd_HALIA64_Mask
;
171 ULONG Kd_SVCHOST_Mask
;
172 ULONG Kd_VIDEOPRT_Mask
;
174 ULONG Kd_DMSYNTH_Mask
;
175 ULONG Kd_NTOSPNP_Mask
;
176 ULONG Kd_FASTFAT_Mask
;
178 ULONG Kd_PNPMGR_Mask
;
179 ULONG Kd_NETAPI_Mask
;
180 ULONG Kd_SCSERVER_Mask
;
181 ULONG Kd_SCCLIENT_Mask
;
182 ULONG Kd_SERIAL_Mask
;
183 ULONG Kd_SERENUM_Mask
;
185 ULONG Kd_RPCPROXY_Mask
;
186 ULONG Kd_AUTOCHK_Mask
;
187 ULONG Kd_DCOMSS_Mask
;
188 ULONG Kd_UNIMODEM_Mask
;
190 ULONG Kd_FLTMGR_Mask
;
191 ULONG Kd_WMICORE_Mask
;
192 ULONG Kd_BURNENG_Mask
;
195 ULONG Kd_FUSION_Mask
;
196 ULONG Kd_IDLETASK_Mask
;
197 ULONG Kd_SOFTPCI_Mask
;
201 ULONG Kd_PCIIDE_Mask
;
202 ULONG Kd_FLOPPY_Mask
;
204 ULONG Kd_TERMSRV_Mask
;
205 ULONG Kd_W32TIME_Mask
;
206 ULONG Kd_PREFETCHER_Mask
;
207 ULONG Kd_RSFILTER_Mask
;
208 ULONG Kd_FCPORT_Mask
;
211 ULONG Kd_DMCONFIG_Mask
;
212 ULONG Kd_DMADMIN_Mask
;
213 ULONG Kd_WSOCKTRANSPORT_Mask
;
215 ULONG Kd_PNPMEM_Mask
;
216 ULONG Kd_PROCESSOR_Mask
;
217 ULONG Kd_DMSERVER_Mask
;
219 ULONG Kd_INFINIBAND_Mask
;
220 ULONG Kd_IHVDRIVER_Mask
;
221 ULONG Kd_IHVVIDEO_Mask
;
222 ULONG Kd_IHVAUDIO_Mask
;
223 ULONG Kd_IHVNETWORK_Mask
;
224 ULONG Kd_IHVSTREAMING_Mask
;
225 ULONG Kd_IHVBUS_Mask
;
227 ULONG Kd_RTLTHREADPOOL_Mask
;
229 ULONG Kd_TCPIP6_Mask
;
230 ULONG Kd_ISAPNP_Mask
;
232 ULONG Kd_STORPORT_Mask
;
233 ULONG Kd_STORMINIPORT_Mask
;
234 ULONG Kd_PRINTSPOOLER_Mask
;
235 ULONG Kd_VSSDYNDISK_Mask
;
236 ULONG Kd_VERIFIER_Mask
;
238 ULONG Kd_VDSBAS_Mask
;
239 ULONG Kd_VDSDYNDR_Mask
;
240 ULONG Kd_VDSUTIL_Mask
;
241 ULONG Kd_DFRGIFC_Mask
;
242 ULONG Kd_DEFAULT_Mask
;
246 ULONG Kd_ENDOFTABLE_Mask
;
249 // Debug Filter Component Table
251 PULONG KdComponentTable
[104] =
266 &Kd_SCSIMINIPORT_Mask
,
323 &Kd_WSOCKTRANSPORT_Mask
,
334 &Kd_IHVSTREAMING_Mask
,
337 &Kd_RTLTHREADPOOL_Mask
,
343 &Kd_STORMINIPORT_Mask
,
344 &Kd_PRINTSPOOLER_Mask
,
359 ULONG KdComponentTableSize
= sizeof(KdComponentTable
) / sizeof(KdComponentTable
[0]);
364 LIST_ENTRY KdpDebuggerDataListHead
;
365 KSPIN_LOCK KdpDataSpinLock
;
368 // Debugger Version and Data Block
370 DBGKD_GET_VERSION64 KdVersionBlock
=
374 DBGKD_64BIT_PROTOCOL_VERSION2
,
375 CURRENT_KD_SECONDARY_VERSION
,
377 DBGKD_VERS_FLAG_DATA
| DBGKD_VERS_FLAG_PTR64
,
379 DBGKD_VERS_FLAG_DATA
,
381 IMAGE_FILE_MACHINE_NATIVE
,
385 DBGKD_SIMULATION_NONE
,
391 KDDEBUGGER_DATA64 KdDebuggerDataBlock
=
395 {(ULONG_PTR
)RtlpBreakWithStatusInstruction
},
397 FIELD_OFFSET(KTHREAD
, CallbackStack
),
398 FIELD_OFFSET(KCALLOUT_FRAME
, CallbackStack
),
399 FIELD_OFFSET(KCALLOUT_FRAME
, CBSTACK_FRAME_POINTER
),
401 {(ULONG_PTR
)KiCallUserMode
},
403 {(ULONG_PTR
)&PsLoadedModuleList
},
404 {(ULONG_PTR
)&PsActiveProcessHead
},
405 {(ULONG_PTR
)&PspCidTable
},
406 {(ULONG_PTR
)&ExpSystemResourcesList
},
407 {(ULONG_PTR
)ExpPagedPoolDescriptor
},
408 {(ULONG_PTR
)&ExpNumberOfPagedPools
},
409 {(ULONG_PTR
)&KeTimeIncrement
},
410 {(ULONG_PTR
)&KeBugcheckCallbackListHead
},
411 {(ULONG_PTR
)KiBugCheckData
},
412 {(ULONG_PTR
)&IopErrorLogListHead
},
413 {(ULONG_PTR
)&ObpRootDirectoryObject
},
414 {(ULONG_PTR
)&ObpTypeObjectType
},
415 {(ULONG_PTR
)&MmSystemCacheStart
},
416 {(ULONG_PTR
)&MmSystemCacheEnd
},
417 {(ULONG_PTR
)&MmSystemCacheWs
},
418 {(ULONG_PTR
)&MmPfnDatabase
},
419 {(ULONG_PTR
)MmSystemPtesStart
},
420 {(ULONG_PTR
)MmSystemPtesEnd
},
421 {(ULONG_PTR
)&MmSubsectionBase
},
422 {(ULONG_PTR
)&MmNumberOfPagingFiles
},
423 {(ULONG_PTR
)&MmLowestPhysicalPage
},
424 {(ULONG_PTR
)&MmHighestPhysicalPage
},
425 {(ULONG_PTR
)&MmNumberOfPhysicalPages
},
426 {(ULONG_PTR
)&MmMaximumNonPagedPoolInBytes
},
427 {(ULONG_PTR
)&MmNonPagedSystemStart
},
428 {(ULONG_PTR
)&MmNonPagedPoolStart
},
429 {(ULONG_PTR
)&MmNonPagedPoolEnd
},
430 {(ULONG_PTR
)&MmPagedPoolStart
},
431 {(ULONG_PTR
)&MmPagedPoolEnd
},
432 {(ULONG_PTR
)&MmPagedPoolInfo
},
434 {(ULONG_PTR
)&MmSizeOfPagedPoolInBytes
},
435 {(ULONG_PTR
)&MmTotalCommitLimit
},
436 {(ULONG_PTR
)&MmTotalCommittedPages
},
437 {(ULONG_PTR
)&MmSharedCommit
},
438 {(ULONG_PTR
)&MmDriverCommit
},
439 {(ULONG_PTR
)&MmProcessCommit
},
440 {(ULONG_PTR
)&MmPagedPoolCommit
},
442 {(ULONG_PTR
)&MmZeroedPageListHead
},
443 {(ULONG_PTR
)&MmFreePageListHead
},
444 {(ULONG_PTR
)&MmStandbyPageListHead
},
445 {(ULONG_PTR
)&MmModifiedPageListHead
},
446 {(ULONG_PTR
)&MmModifiedNoWritePageListHead
},
447 {(ULONG_PTR
)&MmAvailablePages
},
448 {(ULONG_PTR
)&MmResidentAvailablePages
},
449 {(ULONG_PTR
)&PoolTrackTable
},
450 {(ULONG_PTR
)&NonPagedPoolDescriptor
},
451 {(ULONG_PTR
)&MmHighestUserAddress
},
452 {(ULONG_PTR
)&MmSystemRangeStart
},
453 {(ULONG_PTR
)&MmUserProbeAddress
},
454 {(ULONG_PTR
)KdPrintDefaultCircularBuffer
},
455 {(ULONG_PTR
)KdPrintDefaultCircularBuffer
+ 1},
456 {(ULONG_PTR
)&KdPrintWritePointer
},
457 {(ULONG_PTR
)&KdPrintRolloverCount
},
458 {(ULONG_PTR
)&MmLoadedUserImageList
},
459 {(ULONG_PTR
)&NtBuildLab
},
461 {(ULONG_PTR
)KiProcessorBlock
},
462 {(ULONG_PTR
)&MmUnloadedDrivers
},
463 {(ULONG_PTR
)&MmLastUnloadedDrivers
},
464 {(ULONG_PTR
)&MmTriageActionTaken
},
465 {(ULONG_PTR
)&MmSpecialPoolTag
},
466 {(ULONG_PTR
)&KernelVerifier
},
467 {(ULONG_PTR
)&MmVerifierData
},
468 {(ULONG_PTR
)&MmAllocatedNonPagedPool
},
469 {(ULONG_PTR
)&MmPeakCommitment
},
470 {(ULONG_PTR
)&MmtotalCommitLimitMaximum
},
471 {(ULONG_PTR
)&CmNtCSDVersion
},
472 {(ULONG_PTR
)&MmPhysicalMemoryBlock
},
473 {(ULONG_PTR
)&MmSessionBase
},
474 {(ULONG_PTR
)&MmSessionSize
},
477 FIELD_OFFSET(KTHREAD
, NextProcessor
),
478 FIELD_OFFSET(KTHREAD
, Teb
),
479 FIELD_OFFSET(KTHREAD
, KernelStack
),
480 FIELD_OFFSET(KTHREAD
, InitialStack
),
481 FIELD_OFFSET(KTHREAD
, ApcState
.Process
),
482 FIELD_OFFSET(KTHREAD
, State
),
486 FIELD_OFFSET(EPROCESS
, Peb
),
487 FIELD_OFFSET(EPROCESS
, InheritedFromUniqueProcessId
),
488 FIELD_OFFSET(EPROCESS
, Pcb
.DirectoryTableBase
),
490 FIELD_OFFSET(KPRCB
, DpcRoutineActive
),
491 FIELD_OFFSET(KPRCB
, CurrentThread
),
492 FIELD_OFFSET(KPRCB
, MHz
),
493 FIELD_OFFSET(KPRCB
, CpuType
),
494 FIELD_OFFSET(KPRCB
, VendorString
),
495 FIELD_OFFSET(KPRCB
, ProcessorState
.ContextFrame
),
496 FIELD_OFFSET(KPRCB
, Number
),
498 {(ULONG_PTR
)KdPrintDefaultCircularBuffer
},
499 {(ULONG_PTR
)&KdPrintBufferSize
},
500 {(ULONG_PTR
)&KeLoaderBlock
},
502 KPCR_SELF_PCR_OFFSET
,
503 KPCR_CURRENT_PRCB_OFFSET
,
504 KPCR_CONTAINED_PRCB_OFFSET
,
507 KPCR_INITIAL_STACK_OFFSET
,
508 KPCR_STACK_LIMIT_OFFSET
,
509 KPRCB_PCR_PAGE_OFFSET
,
510 FIELD_OFFSET(KPRCB
, ProcessorState
.SpecialRegisters
),
513 // x86 GDT/LDT/TSS constants
525 #elif defined(_AMD64_)
527 // AMD64 GDT/LDT/TSS constants
541 // No GDT/LDT/TSS on other architectures
554 {(ULONG_PTR
)&IopNumTriageDumpDataBlocks
},
555 {(ULONG_PTR
)IopTriageDumpDataBlocks
},